0x01 安装
环境: CentOS 7
, 这里采用单机部署方式: Yum 方式安装
curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash
sudo yum install emqx -y
sudo systemctl start emqx
服务启动后,可通过netstat
指令查看相关端口
netstat -apn | grep emqx
tcp 0 0 0.0.0.0:18083 0.0.0.0:* LISTEN 30562/emqx
tcp 0 0 0.0.0.0:4370 0.0.0.0:* LISTEN 30562/emqx
tcp 0 0 0.0.0.0:8083 0.0.0.0:* LISTEN 30562/emqx
tcp 0 0 0.0.0.0:8883 0.0.0.0:* LISTEN 30562/emqx
tcp 0 0 0.0.0.0:8084 0.0.0.0:* LISTEN 30562/emqx
tcp 0 0 0.0.0.0:5370 0.0.0.0:* LISTEN 30562/emqx
tcp 0 0 0.0.0.0:1883 0.0.0.0:* LISTEN 30562/emqx
其中,
- 18030 : 为 dashboard 服务端口
- 1883 : mqtt 端口
- 8883 : mqtts 端口
其他不详,可能是ws, wss 端口。
0x02 Dashboard
初始密码: admin/public
, 首次登录后,需要自行修改密码。
0x03 Topic 通配符
先看个topic例子:
aa/bb/cc
这是个典型的topic, 有三个层级
可以通过通配符进行不通类型的topic查询
-
+
: 匹配一个层级,即:aa/+
可以命中 aa/bb, 但不命中 aa/bb/cc -
#
: 匹配多个层级,到末尾。例:aa/#
, 可以命中 aa/bb, aa/bb/cc -
$
: 单字符匹配,非第一个字符。如:以$开头的字符是系统保留字。
系统topic
- $SYS/xxxx :系统组件
- $share/xxx : 共享订阅
关于 topic 设计的一些建议
- 不建议使用 # 订阅所有主题;
- 不建议主题以 / 开头或结尾,例如 /chat 或 chat/;
- 不建议在主题里添加空格及非ASCII特殊字符;
- 同一主题层级内建议使用下划线 _ 或横杆 - 连接单词(或者使用驼峰命名);
- 尽量使用较少的主题层级;
- 当使用通配符时,将唯一值的主题层(例如设备号)越靠近第一层越好。
例如,device/00000001/command/# 比device/command/00000001/# 更好。
举例:
- 上行:
dev/${dev_id}/up
- 下午:
dev/${dev_id}/down
其中,${dev_id}
需要换成实际的设备id
场景说明:
设备端接入mqtt服务时,需要订阅 dev/{dev_id}/up 主题发送即可。
0x04 关于EMQx 的服务端使用架构
上行消息
emqx 开源版没有直接对接外部mq的能力,但提供了一个webhook接口调用。
需要我们人肉智能实现一套api 转 mq(kafka) .
下行消息
一般的做法,需要在服务端启一个长期运行的client实例,可用于下发消息。
但是 emqx 提供了一个 rest api 能力,可直接通过 api 发布消息。
0x05 自签证书双向认证
参考这一篇: SSL自签名证书双向认证实践
完成自签名证书生成。
在本机 /etc/hosts 配置好测试域名和服务器IP的绑定关系。
这时会有这样几个文件:
- ca.pem
- server.key
- server.crt
- client.key
- client.crt
其中,ca.pem在服务端和客户端都会用到,用于相互认证对端的crt证书。
5.1 emqx 服务端配置
本例emqx 部署在centos环境,配置文件位置: vim /etc/emqx/emqx.conf
上述前三个文件上传到服务器后,进行下述内容
listener {
ssl {
external = 8883
keyfile = /etc/emqx/ssl/server.key
certfile = /etc/emqx/ssl/server.crt
cacertfile = /etc/emqx/ssl/ca.crt
verify = verify_peer # 开启双向认证
fail_if_no_peer_cert = true
}
}
关于emqx lisener 生效,不需要重启整个实例。只需要对指定listener实例进行操作:
# 查看所有listener
emqx_ctl listeners
# 重启指定 ssl listener
emqx_ctl listeners restart ssl:default
到此,已完成服务端配置
5.2 客户端配置
与上述类似,给定三个文件,开启 ssl 连接,采用 8883 端口,完成配置。
心得
:服务端和客户端的证书,其实是属于同一个维度,他们并没有啥差异。
上面的证书是复用了之前的https访问测试例,他们都需要指定 域名
。
在mqtt 服务中可能不需要指定 域名
。TODO
: 这里以后有时间再进行验证。
0x06 通过API发布消息
使用场景:云端下发指令到设备端。
6.1 生成访问密钥
在dashboard上生成api key, 得到一组 ak,sk,可用于API调用
http://your ip
:18083/#/APIKey
6.2 Rest API
dashboard 服务也提供了 Swagger API接口:
http://your ip
:18083/api-docs/index.html
6.3 发布消息
结合上面两个信息,我们可以发布一个消息:
curl -u $ak:$sk http://${your_ip}:18083/api/v5/publish -H "content-type:application/json" -d '{"topic":"dev/device_id/down", "payload":"test"}'
这样就可以了。
网友评论