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