美文网首页
emqx 入门

emqx 入门

作者: 国服最坑开发 | 来源:发表于2023-05-30 17:37 被阅读0次

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}/down ,用于接收消息。 发消息时,向 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"}'

这样就可以了。

关于监控,可参考:EMQX+Prometheus+Grafana:MQTT 数据可视化监控实践

相关文章

网友评论

      本文标题:emqx 入门

      本文链接:https://www.haomeiwen.com/subject/lwteedtx.html