【笔记】CentOS 利用 EMQX--搭建 MQTT 服务器

Linux tytrock ⋅ 于 2021-01-21 17:46:00 ⋅ 3737 阅读

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

image.png

检查emqx状态

$ emqx_ctl status

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

image.png


4、测试Emqx 服务是否可用

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

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

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

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

image.png



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

image.png


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

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

image.png

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

image.png

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

github 地址
码云地址

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

image.png

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

image.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版本

卸载当前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.

image.png

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


参考资料:

https://wiki.swoole.com/wiki/page/p-async.html

https://blog.csdn.net/weixin_40277513/article/details/85400481

https://www.jianshu.com/p/774108407696

https://www.cnblogs.com/zjfree/p/11428718.html

本帖已被设为精华帖!
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter