一 使用场景
由于IOT设备会出现掉线的情况,所以应该在通讯过程中,采用一个消息,告诉服务端,设备已经下线了。这样方便设备的统一和管理。
二 IOT协议选择
采用了目前很通用的IOT通讯消息机制,MQTT。在MQTT协议中,可以通过设置LWT消息。当设备下线的时候,会发送一个消息告诉后台,设备已经下线。
三 LWT(遗嘱消息) 消息使用
3.1 LWT(遗嘱消息) 消息的作用
Broker 检测到底层的 I/O 异常;
Client 未能在 Keep Alive 的间隔内和 Broker 之间有消息交互;
Client 在关闭底层 TCP 连接前没有发送 DISCONNECT 数据包;
Broker 因为协议错误关闭和 Client 的连接,比如 Client 发送了一个格式错误的 MQTT 数据包
在这个情况,broker会受到一个LWT消息,方便后台其他服务的使用和管理。
3.2 LWT(遗嘱消息)的标志位
Will Flag:是1否0使用 LWT
Will Topic:遗嘱主题名,不可使用通配符(在 CONNECT报文中的 有效载荷 中 设置)
Will Qos:发布遗嘱消息时使用的 QoS 等级,如果遗嘱标志(Will Flag)被设置为0,遗嘱QoS也必须设置为0(0x00)
Will Retain:遗嘱消息的 Retain 标识
Will Message:遗嘱消息内容(在 CONNECT报文中的 有效载荷 中 设置)
topic 可以和普通消息使用相同的topic
四 可能遇到的问题
- 在使用过程中,如果普通的消息也设置了retained消息,会导致LWT消息被retained消息覆盖。因此在使用的时候需要注意。避免普通消息覆盖LWT消息。这个情况解决的一个简单办法就是使用不同的topic将上下线消息与普通通讯消息进行隔离。
- 在设备重新上线后,应该需要将LWT消息进行清除。否则可能出现这样一个情况:其他客户端链接Broker的时候,即使设备重新上线,新链接上的客户端也会受到LWT消息,认为设备下线。会引起设备混乱。
解决办法:在LWT的topic上,发送一条空指令,告知broker不在对新链接上来的客户端推送LWT消息。