基于 EMQX MQTT 开发了一个设备管理,及日志存储的后台系统。
在设备管理页,想看到设备是否在线的状态显示。然后发现原来 MQTT 协议是不支持这个查询的,而是需要通过 EMQX 开放的接口中进行查询。
这里记录一下
显示效果
接口认证
参考 EMQX 官方文档,里面有多种开发语言的实现,例如这个是 go 的。
https://docs.emqx.com/zh/emqx/latest/admin/api.html#go
- 调用接口时,只需要把 url 替换为对应的接口即可。
- api key 和 secret 需要登录 EMQX 服务自带的 web 后台,系统设置-API 密钥,去生成一个就行了。还能设置有效期。
认证方式支持 basic auth 和 jwt token,为了省事,我直接用了 basic auth。
批量查询在线状态
https://docs.emqx.com/en/emqx/v5.8/admin/api-docs.html#tag/Clients/paths/~1clients/get
通过 /api/v5/clients 接口可以一次查询多个设备的在线状态。很适合在列表页批量查询。否则逐个查询太浪费时间。多个设备 id 的查询参数
clientid=c1&clientid=c2
信息字段中,还能查询到 ip_address IP 地址, connected_at 建立连接的时间。
查询单个设备的在线状态
https://docs.emqx.com/en/emqx/v5.8/admin/api-docs.html#tag/Clients/paths/~1clients~1%7Bclientid%7D/get
即通过 /api/v5/clients/{clientid} 进行查询。
相对于批量查询,这个接口还能查询到断开连接的时间 disconnected_at (connected 是 false 时才有)。
前端显示
在线状态在列表中固定在线状态这列,更直观一些。
后续
下面就是测试一下对于 QoS 为 0 的设备,在离线状态下是否可以远程下发 QoS 为 1 的锁机指令。如果不支持,就只能自己通过队列缓存实现了 😅
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式