1、安装Emqx
#安装必要的依赖: $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 #设置稳定的仓库,比如CentOs7的例子: $ sudo yum-config-manager --add-repo https://repos.emqx.io/emqx-ce/redhat/centos/7/emqx-ce.repo #安装最新版本的 EMQ X $ sudo yum install emqx #也可以安装指定版本 #先查询软件版本列表 $ yum list emqx --showduplicates | sort -r emqx.x86_64 3.1.0-1.el7 emqx-stable emqx.x86_64 3.0.1-1.el7 emqx-stable emqx.x86_64 3.0.0-1.el7 emqx-stable #选择其中一个版本安装 $ sudo yum install emqx-3.1.0
2、启动Emqx
emqx start
检查emqx状态
$ emqx_ctl status
#系统启动 $ sudo systemctl start emqx #服务启动 $ sudo service emqx start
3、访问web后台
在访问后台界面时,应该先开放Emqx对应的端口。如下:
端口 | 端口对应的协议或者作用 |
1883 | MQTT protocol port |
8883 | MQTT/SSL port |
8083 | MQTT/WebSocket port |
8080 | HTTP API port |
18083 | Dashboard Management Console Port |
访问后台地址:http://127.0.0.1:18083,其中127.0.0.1替换为你的云服务器公网IP。
登录账号:admin,密码:public。进入Web管理控制台。如下图所示:
4、测试Emqx 服务是否可用
本次用到的测试工具是常见的MQTTBox
MQTTBox官网下载地址:http://workswithweb.com/html/mqttbox/downloads.html
下载完成后,直接安装即可。
安装完成后打开客户端,点击"Create MQTT Client"创建客户端:
填写客户端相关信息,如下图:
点击Save提交后,应先开启一个订阅,如下图所示。"Topic to subscribe" 里填入要订阅的主题;"QoS" 选择 "0 - Almost Once" ;然后点击 "Subscribe" 按钮订阅。
然后发布一条消息,"Topic to publish" 中发布的主题 ,这里输入的主题的名字必须和订阅那里的输入相同;"QoS" 中选择 "0 - Almost Once" ;"Payload" 中输入任何内容都可以,如下图所示输入了一组JSON字符串。
订阅和发布的信息填写好后,点击Publish发布消息
此时订阅方能接收到消息,测试成功,说明Emqx服务可用。
5、手动编写客户端
可使用phpMQTT客户端类库
地址:https://github.com/bluerhinos/phpMQTT
Laravel下手动编写客户端(未能成功)
这里用到一个mqtt客户端库:try-to/swoole_mqtt,一个基于 swoole 的异步 mqtt 客户端库,可用于接收或者发送 mqtt 协议的消息。支持 QoS 0、QoS 1、QoS 2。支持 MQTT 3.1 和 3.1.1 版本。
composer require try-to/swoole_mqtt
在控制器里加入
//订阅 public function subscribe(){ $options = [ 'clean_session' => false, 'client_id' => 'demo-subscribe-123456', 'username' => '', 'password' => '', ]; $mqtt = new Client('39.108.114.150', 1883, $options); $mqtt->onConnect = function ($mqtt) { $mqtt->subscribe('/World'); }; $mqtt->onMessage = function ($topic, $content) { var_dump($topic, $content); }; $mqtt->onError = function ($exception) use ($mqtt) { echo "error\n"; // $mqtt->reconnect(1000); }; $mqtt->onClose = function () { echo "close\n"; }; $mqtt->connect(); } //发布 public function publish(){ $options = [ 'clean_session' => false, 'client_id' => 'demo-publish-123456', 'username' => '', 'password' => '', ]; $mqtt = new Client('39.108.114.150', 1883, $options); $mqtt->onConnect = function ($mqtt) { $mqtt->publish('/World', 'hello swoole mqtt'); }; $mqtt->onError = function ($exception) { echo "error\n"; }; $mqtt->onClose = function () { echo "close\n"; }; $mqtt->connect(); }
访问订阅页面,提示:Swoole\Client::__construct(): please install the ext-async extension, using Swoole\Async\Client
经查资料,try-to/swoole_mqtt使用了异步回调模块,而swoole在4.3版本后就不再支持异步客户端模块,该模块已迁移只ext-async扩展中,并且该模块不能在php-fpm中使用。
查看服务器swoole版本,是4.6.1,并且php是使用php-fpm模式。
网上一些说法是在try-to/swoole_mqtt库的源码里将异步改为同步
//原 new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC) //改为 new \swoole_client(SWOOLE_SOCK_TCP)
虽然更改后改方法不在报错,但也会引起其他地方报错。
无奈之下,尝试降低swoole版本
卸载当前swoole
pecl uninstall swoole
安装指定版本(低于4.3)
pecl install https://pecl.php.net/get/swoole-4.2.13.tgz
安装后,重启php-fpm,可抛出另一个错误,说只能在cli模式下使用
Swoole\Client::__construct(): async-io must be used in PHP CLI mode.
继续翻查资料,有说4.2.10可以,然后再卸载,再安装4.2.10版本,依然是这个结果
参考资料:
https://wiki.swoole.com/wiki/page/p-async.html
https://blog.csdn.net/weixin_40277513/article/details/85400481