使用Mosquitto遗嘱机制实现感知客户端上下线功能的方法

需要让设备上mqtt客户端配合来完成。

1、怎么知道设备下线?

使用遗嘱机制,mqtt客户端在建立mqtt连接的时候,设置遗嘱(向什么topic发送什么数据):当前这个tcp连接断开的时候,Mosquitto自动按照遗嘱设置发送消息,这时利用这个机制,topic应用设定好,例如:iot/status/onoffline;所设置的遗嘱消息内容就是一个JSON字符串,里面包含当前连接的ID等信息,上线状态,例如:

{"id":11232232432,//这个id就是当前设备的ID

"status":"offline"//表示这是一个设备下线的通知;

}

这样这个连接断开的时候(无论正常还是异常)谁订阅了这个topic就能收到这个消息.

2、怎么知道设备上线?

mqtt客户端在建立mqtt连接之后,无条件向某个topic(例如:iot/status/online)发送一个消息,消息内容包括自己的设备ID和上线状态,例如:

{"id":11232232432,//这个id就是当前设备的ID

"status":"online"//表示这是一个设备上线的通知;

}

,这样一旦自己的设备上线了,订阅了这个topic的应用就能收到该设备发过来的消息;

如果觉得这种方式比较麻烦,可加入群:221779856,群里开源的软件在Mosquitto上做了优化修改,不需要客户端做任何配合就能实现:

(1)自动上下线通知,无需客户端做任何配合,详细可参考开源软件的说明,其思路如下:

【功能说明】向指定topic发送上下线通知的消息

【使用说明】:

打开下面两个配置项“topic_notice_online”(对应上线消息)和“topic_notice_offline”(对应下线消息),并为他们分别设置一个参数,这个设置的参数将被作为一个topic,也可以将这两个topic参数设置成一样,这样,上下线消息都会发送到同一个topic上;在有连接建立或断开时mosquitto将向这两个topic发送消息,

【注意】建议这两个参数设置为"$SYS/"开头的字符串topic,这样得到的数据会更安全,因为$SYS/开头的topic只能mosquitto内部发布;

【消息格式说明】mosquitto向下面这两个配置topic发送的上下线消息为JSON字符串,共包含三个字段:

clientid:当前通知所涉及的连接ID;

type:连接的状态:1:连接建立;0:连接断开;

time:当前系统时间,1970年1月1日到现在的时间;

例如:

{

"clientid","clientId-test-001",

"type","1",

"time",""

}

topic_notice_online $SYS/NOTICE/STATUS/ONLINE

topic_notice_offline $SYS/NOTICE/STATUS/OFFLINE

(2)直接向Mosquitto查询某个设备当前是否在线?

【功能说明】查询指定连接ID是否在线,返回JSON格式字符串,JSON格式与新增功能2一致:1:在线;0:不在线;

【使用方式】开启下面配置,该配置将指定一个topic,任何一个客户端只要向这个topic发布一个连接ID(即pub过来的消息内容就是要查询的连接ID),mosquitto就会给这个当前pub消息的客户端回复一条消息,查询的客户端无需订阅任何topic,只要向这里配置的topic发布连接ID,就能收到mosquitto发布过来的查询结果。

topic_query_conn_status client/query/connection

猜你喜欢

转载自blog.csdn.net/hjx_1000/article/details/88681655