文章目录
一、前言
写了这么多的嵌入式文章,这篇我给大家分享下 EMQ 服务器商用时候的心得;毕竟物联网通讯,第一时间就是想到服务器搭建,而第一想到的是开源的、免费的MQTT服务器搭建,2017年我出了一篇EMQ2.3版本的教程,时过境迁,本篇介绍 EMQ3.0 版本的搭建和使用!废话不多说,客官请看!
二、安装
使用 zip 包安装 EMQ X
- 1:选择系统和版本
https://www.emqx.io/downloads#broker
- 2:我这里选择3.23版本 centos7,得到下载链接:
https://packages.emqx.io/emqx-ce/v3.2.3/emqx-centos7-v3.2.3.zip
- 3:然后下载压缩包:
wget https://packages.emqx.io/emqx-ce/v3.2.3/emqx-centos7-v3.2.3.zip
- 4:安装或者更新 解压包zip工具:
yum install unzip -y
- 5.解压:
unzip emqx-centos7-v3.2.3.zip
- 6.运行:
./emqx/bin/emqx start
- 7.查看运行状态:
./emqx/bin/emqx_ctl status
三、禁止客户端任意连接
软件安装之后,我们的服务器还要开放以下端口:
端口号 | 用途 |
---|---|
18083 | mqtt服务器面板 |
1883 | tcp mqtt连接 |
8083 | websocket连接 |
8084 | websocket ssl连接 |
8080 | rest api http使用 |
EMQ软件不配置任何设置,都是可以匿名登录的,也即是可有可无用户名和密码鉴权登录连接,这点是非常危险的!下面教大家如何新建用户名和密码鉴权!
3.1 关闭匿名登录
首先,关闭匿名登录,编辑配置文件 emqx.conf
,修改为 allow_anonymous
改为 false
,即修改后是 allow_anonymous = false
;
vim emqx/etc/emqx.conf
操作演示:
这时候,我们再连接,怎么连接都是失败的;
3.2 开启用户名字密码认证插件
此插件emqx_auth_username.conf
是中间件,做客户端的认证处理!
./emqx/bin/emqx_ctl plugins load emqx_auth_username
启动之后,下面就可以添加用户了,比如我要添加 这样的客户端连接用户名字和密码数据:
username | password |
---|---|
emq_u | emq_x |
则,这样敲进去:
./emqx/bin/emqx_ctl users add emq_u emq_x
我们再看看是否添加:
./emqx/bin/emqx_ctl users list
:
四、通过Http接收和发送MQTT消息
这个特色,我觉得是最好用的,我对比过 阿里云、百度云和腾讯云提供的MQTT服务器,都是通过MNS消息队列这类的付费插件操作设备的上报消息,本来买他的MQTT付费了,再买一个消息队列这样的收费产品,真是“坑爹”!
4.1 配置私有服务器接收设备上报的消息
- WebHook 插件
emqx_web_hook 插件可以将所有 EMQ X 的事件及消息都发送到指定的 HTTP 服务器。
如下所示,打开插件,配置你的服务器uri接收地址!之后记得启动!
下面列举发送的常见格式
更多格式请访问获取:https://github.com/emqx/emqx-web-hook
- client.connected :客户端连接成功MQTT服务器
{
"action":"client_connected",
"client_id":"C_1492410235117",
"username":"C_1492410235117",
"keepalive": 60,
"ipaddress": "127.0.0.1",
"proto_ver": 4,
"connected_at": 1556176748,
"conn_ack":0
}
- client.disconnected :客户端断开MQTT服务器的连接
{
"action":"client_disconnected",
"client_id":"C_1492410235117",
"username":"C_1492410235117",
"reason":"normal"
}
- client.subscribe :客户端订阅主题
{
"action":"client_subscribe",
"client_id":"C_1492410235117",
"username":"C_1492410235117",
"topic":"world",
"opts":{
"qos":0
}
}
4.2 通过Http请求发送一则消息
这个也是蛮好的设计,平时我们想发送一则消息给设备,但是不想又不想连接MQTT直接发送,这个可以省去连接的步骤!
EMQ 的管理监控API (REST API),
用户可以通过 REST API 查询 MQTT 客户端连接(Connections)、会话(Sessions)、订阅(Subscriptions)和路由(Routes)信息,还可以检索和监控服务器的性能指标和统计数据。
首先,先在面板创建一个授权用户,如下操作:
之后,查看该用户的详细信息!得到 AppId 和 App 密钥!
这里,我使用postman测试,如下配置:
- 其中认证选择 basic auth ,名字和密码对应在面板创建应用的appid和app密钥!
- 访问的url为:
http://localhost:8080/api/v3/mqtt/publish
- body格式为下面,顾名思义我们看到其中字段的意思了:
{
"topic":"Hello",
"qos":1,
"retain":false,
"client_id":"xuhongPhpClient",
"username":"xuhongPhpClient",
"payload":"hellp"
}
- 回复 code = 0 ,则表示授权并成功发送!
另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!
- 玩转
esp8266
带你飞、加群付费QQ
群,不喜的朋友勿喷勿加:434878850 - 个人邮箱:xuhongv@yeah.net 24小时在线,有回必回复!
- esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
- 关注下面微信公众号二维码,干货多多,第一时间推送!