emqx怎么扩展php,【笔记】CentOS 利用 EMQX--搭建 MQTT 服务器

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

2251d64bfb3a112ce610ccd6b5857655.png

检查emqx状态$ emqx_ctl status

5e5113ec41c99546bdc318d57386cd57.png#系统启动

$ 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管理控制台。如下图所示:

be6f8787cd665653cf6c097d08c55b59.png

4、测试Emqx 服务是否可用

本次用到的测试工具是常见的MQTTBox

MQTTBox官网下载地址:http://workswithweb.com/html/mqttbox/downloads.html

下载完成后,直接安装即可。

安装完成后打开客户端,点击"Create MQTT Client"创建客户端:

fc8b5b9e8c87bd455361bfada4c28a7f.png

填写客户端相关信息,如下图:

2d00d85e4d8ffca2d818f03e61c31819.png

点击Save提交后,应先开启一个订阅,如下图所示。"Topic to subscribe" 里填入要订阅的主题;"QoS" 选择 "0 - Almost Once" ;然后点击 "Subscribe" 按钮订阅。

然后发布一条消息,"Topic to publish" 中发布的主题 ,这里输入的主题的名字必须和订阅那里的输入相同;"QoS" 中选择 "0 - Almost Once" ;"Payload" 中输入任何内容都可以,如下图所示输入了一组JSON字符串。

d3cf93dfc88b145fe0214e3e713a65a8.png

订阅和发布的信息填写好后,点击Publish发布消息

ef0b58940a79e3dfda7d9ac45ef38471.png

此时订阅方能接收到消息,测试成功,说明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

efcd8c7b0f9bd93a8aa011f2483a094c.png

经查资料,try-to/swoole_mqtt使用了异步回调模块,而swoole在4.3版本后就不再支持异步客户端模块,该模块已迁移只ext-async扩展中,并且该模块不能在php-fpm中使用。

819c2271c6a5b40901cbd59ee39fc3ab.png

查看服务器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.

090c833126be1255aeb906e1b34a1440.png

继续翻查资料,有说4.2.10可以,然后再卸载,再安装4.2.10版本,依然是这个结果

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值