有不少接触物联网、MQTT、EMQ X 的童鞋,都会询问如何获取设备上下线状态,因为设备上下状态数据是IoT数据一个基本呈现,很多更上层应用会基于此数据进行展现与分析,对此EMQ君将从MQTT协议侧、 Broker侧来介绍如何获取设备上下线状态:
通用方式
- MQTT协议-遗嘱机制
MQTT 协议层面获取设备上下线状态,可利用 MQTT 协议遗嘱机制获取设备状态,设备连接时启用遗嘱,在连接到Broker时,设置 Will-Topic、Will-Payload等属性,当Client异常断开时(即设备没有发送Disconnect报文),Broker会发布遗嘱 Topic 与 Payload,但遗嘱机制明显弊端是,只有异常断开才会获得下线状态。
- MQTT协议-主题设计
从MQTT协议侧,来获取设备上下线状态,更好的技巧和解决方法,可在 MQTT 协议 Topic 侧做设计,可以为 “presence” 进行主题设计。如,“presence/connect/client-id” ,当设备上线时,对其发布上线消息,当设备正常离线时(即设备发送Disconnect报文)对主题”presence/disconnect/client-id“发布其离线消息。
EMQ X 实现方式
以上两种方式,是依赖MQTT 协议的遗嘱机制,或是主题层面的设计来获取设备在线状态,可适用任何实现MQTT 协议的Broker,但 EMQ君,在这里介绍如何简单、快速从EMQ X Broker获取设备在线状态的三种方式。
- EMQ X 系统主题
EMQ X Broker 上下线状态主题:
上线主题:$SYS/brokers/<node>/clients/<clientid>/connected
下线主题:$SYS/brokers/<node>/clients/<clientid>/disconnected
1)<node>、<clientid> 可分别指定具体节点名、设备ClientID
2)支持'+'、‘#’通配符
mosquitto示例:
mosquitto_sub -i mosuqitto_test -t '$SYS/brokers/+/clients/+/+' -d
通过以上命令订阅系统上下线主题后,如有设备上、下线,将收到其上下线消息,将打印下面的消息:
<!--上线消息>
Client mosuqitto_test received PUBLISH (d0, q0, r0, m0, '$SYS/brokers/emqx@127.0.0.1/clients/emq/connected', ... (163 bytes))
{"clientid":"emq","username":"undefined","ipaddress":"127.0.0.1","connack":0,"ts":1538147419,"proto_ver":3,"proto_name":"MQIsdp","clean_start":true,"keepalive":60}
<!--下线消息>
Client mosuqitto_test received PUBLISH (d0, q0, r0, m0, '$SYS/brokers/emqx@127.0.0.1/clients/emq/disconnected', ... (75 bytes))
{"clientid":"emq","username":"undefined","reason":"closed","ts":1538147420}
- EMQ X Web Hook插件
EMQ X Broker官方提供了多种插件(更详细插件内容,可到官网查阅),其中emqx-web-hook(EMQ X 2.0版本为emq-web-hook)可将MQTT 消息桥接到用户所指定Web Server,其中包括设备上、下线状态,在Dashboard插件管理或终端emqx_ctl(2.0为emqttd_ctl)启动emqx_web_hook,如有设备上下线,即可获得设备上、下状态数据,以下是通过emq-web-hook桥接Web Server上下数据示例:
POST / HTTP/1.1
content-type: application/json
content-length: 93
te:
host: 127.0.0.1:8087
connection: keep-alive
{"action":"client_connected","client_id":"mqttjs_bc06a34f41","username":"admin","conn_ack":0}
下线消息:
POST / HTTP/1.1
content-type: application/json
content-length: 101
te:
host: 127.0.0.1:8087
connection: keep-alive
{"action":"client_disconnected","client_id":"mqttjs_bc06a34f41","username":"admin","reason":"normal"}
- EMQ X Enterprise - 直接存取数据库
以上两种方式,在 EMQ X 开源社区版已经支持,商业化版本EMQ X Enterprise可将 MQTT消息(订阅关系、设备在线状态、离线消息、保留消息)更高效存储到后端数据库(MySQL、PostgreSQL、Cassandra、Redis、MongoDB)、消息中间件(Kafka、RabbitMQ),用户可以通过直接查询数据库中相关的数据就得到设备上下线的状态信息。
EMQ X Enterpise设计目标是:
- 实现企业级高可靠,高可用;
- 支持承载海量物联网终端的MQTT连接;
- 支持在海量物联网设备间低延时消息路由,高效存储MQTT消息。
如需了解更多关于 EMQ X Enterprise产品功能,欢迎咨询试用。
总结
关于如何获取设备上下状态信息,EMQ君介绍到此,更多关于EMQ X 产品的探讨学习,可加入官方群组:
QQ群1:12222225
QQ群2:196066320
网友评论