我肯定错过了关于整个MQTT协议的工作方式,因为我无法掌握 Last Will Testament 消息的使用模式:他们的目的是什么?
我经常看到的一个例子是告知设备已脱机。它对我来说并不是很有意义,因为很明显,如果设备没有发布任何数据,它可能会脱机,或者可能存在一些网络问题。
那么,LWT的一些实际用法是什么?是为它发明了什么?
答案 0 :(得分:65)
LWT消息并不关心检测客户端是否已脱机(该任务由keepAlive消息处理)。 LWT消息是关于客户端脱机后会发生什么。
这个比喻是真实的最后一个: 如果一个人去世,她可以制定一个遗嘱,她宣布在她去世后应该采取什么行动。遗嘱执行人将听取这些意愿并代表她执行。 MQTT世界中的类比是客户可以制定一个遗嘱,其中它声明了代理在离线后代表它应该发送的消息。
一个虚构的例子:
我有一个传感器,可以发送关键数据,但很少发送。 它以[topic:'/ node / gone-offline',message:':id']的形式制定了最后一个声明,其中:id是传感器的唯一ID。我还有一个紧急订阅者主题为“节点/离线”,每次在该频道上发布消息时,都会向我的手机发送短信。
在正常操作期间,传感器将通过发送定期的keepAlive消息来保持与MQTT-broker的连接打开,这些消息散布在实际的传感器读数中。如果传感器脱机,由于缺少keepAlive,与代理的连接将超时。
这是LWT的用武之地:如果未指定LWT,则代理不关心并且只是关闭连接。然而,在我们的例子中,代理将执行传感器的最后遗嘱并发布LWT消息'/ node / gone-offline :: id'。然后该消息将被消费给我的紧急订户,我将通过短信通知传感器的ID,以便我可以查看正在发生的事情。
简而言之:
不是仅在客户端脱机后关闭连接,而是可以利用LWT消息来定义代理客户端发布的消息,因为客户端处于脱机状态且无法再发布。
答案 1 :(得分:10)
仅仅因为设备未发布并不意味着它不在线或存在网络问题。
例如,一个传感器监视一个只会很少变化的值,好的设计表明传感器应该只发布更改以帮助减少带宽使用,因为定期发布相同的值是浪费。如果该值作为保留值发布,则任何新订阅者将始终获取当前值,而无需等待传感器值更改并再次发布。
在这种情况下,LWT用于在传感器发生故障时发布(或存在网络问题),因此我们会在客户端保持活动状态时立即知道问题。
答案 2 :(得分:8)
MQTT Essentials博客文章系列中提供了有关“遗嘱和遗嘱”消息的深入文章:http://www.hivemq.com/mqtt-essentials-part-9-last-will-and-testament/。
总结博客文章:
遗嘱和遗嘱功能在MQTT中用于通知其他客户端有关非正常断开连接的客户端。
MQTT经常被用于场景不可靠的网络非常普遍。因此,假设某些客户端会不时地断开连接,因为它们丢失了连接,电池是空的或任何其他可以想象的情况。最好知道连接的客户端是否已正常断开连接(这意味着使用MQTT DISCONNECT 消息),以便采取适当的措施。