本文翻译自http://www.hivemq.com/blog/mqtt-essentials-part-9-last-will-and-testament
未经允许,不得转载
MQTT经常被用在网络不可靠的情况下。因此客户端可能会不时地意外断开连接,可能是没电了或者是其他原因。因此,我们需要知道客户端是否是正常断开连接的(是否发送了MQTTDISCONNECT消息),以便于采取适当的行动。遗嘱功能为客户端提供了一个恰当的解决办法。
遗嘱
MQTT使用遗嘱(LWT)功能通知其他客户端某个客户端意外断开连接了。每个客户端都可以在连接broker时指定其最新的遗嘱(一个具备主题,保留标志,QoS的普通MQTT消息)。broker将会存储遗嘱直至它发现客户端意外断开连接。如果一个客户端突然断开连接,broker将会给所有此主题的订阅者发送最新的遗嘱消息。而遗嘱消息会在客户端发送DISCONNECT消息正常断开连接后被丢弃。
遗嘱帮助实现了客户端掉线时的应对策略,至少可以将掉线状态通告给其他客户端。
如何为客户端指定一个遗嘱消息?
遗嘱消息可以被每个客户端在CONNECT消息中指定,其作为客户端和broker初始化连接时的一项服务。
更多关于broker和客户端建立连接的内容请参见Part 3。
broker何时发送遗嘱消息
根据MQTT 3.1.1说明书,broker将会在以下情况分发遗嘱消息。
- 服务器发现一个I/O错误或者网络错误。
- 客户端没有按时发送心跳包。
- 客户端没有在断开连接前发送DISCONNECT包。
- 服务器因为协议错误而断开连接。
我们在下一章会介绍更多心跳包的内容。
最佳实践 - 何时使用遗嘱?
遗嘱是为了在发布者连接丢失时通知订阅者而设计的。在实际使用中,遗嘱经常和保留消息一起使用,以便于通过主题来存储客户端当前的状态。例如,在客户端刚连接上broker时,它会向主题client/status发送一个消息体为“online”的保留消息。然后在连接过程中,客户端再发送一个消息体为“offline”的遗嘱消息,并将此消息设为保留消息。如果客户端此时意外断开连接,那么broker将发布此消息体为“offline”的保留消息。这种模式允许其他客户端通过一个主题来观察此客户端的状态,并且因为它是个保留消息,所以新连上来的客户端也会立刻就知道此设备的状态。