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、启动Emqxemqx start
检查emqx状态$ emqx_ctl status
#系统启动
$ sudo systemctl start emqx
#服务启动
$ sudo service emqx start
3、访问web后台
在访问后台界面时,应该先开放Emqx对应的端口。如下:端口端口对应的协议或者作用
1883MQTT protocol port
8883MQTT/SSL port
8083MQTT/WebSocket port
8080HTTP API port
18083Dashboard 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客户端类库
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版本
卸载当前swoolepecl 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版本,依然是这个结果
参考资料: