我肯定忽略了整个MQTT协议的工作方式,因为我无法理解“最后遗嘱”消息的使用模式:它们的目的是什么?
我经常看到的一个例子是通知设备已经脱机。这对我来说没有多大意义,因为很明显,如果一个设备没有发布任何数据,它可能是离线的,或者可能会出现一些网络问题。
那么,LWT的一些实际用途是什么呢?它是为了什么而发明的?
发布于 2013-06-29 14:30:43
LWT消息并不真正关心检测客户端是否脱机(该任务由keepAlive消息处理)。LWT消息是关于的,在客户机离线之后会发生什么。
比喻是一个真正的最后的遗嘱:如果一个人死了,她可以写一份遗嘱,在遗嘱中她宣布在她去世后应该采取什么行动。遗嘱执行人会注意到这些愿望并代表她执行。在MQTT世界中的类比是,一个客户可以制定一个遗嘱,其中它声明了什么消息应该由经纪人代表它发送,当它离线后。
一个虚构的例子:
我有一个传感器,它发送关键的数据,但很少。它以主题的形式制定了最后一个will声明:‘/node/ for脱机’,消息:' :id ',其中: id是传感器的唯一id。我也有一个紧急订阅的主题‘节点/离线’,它将发送一条短信到我的手机,每次消息发布在该频道。
在正常操作期间,传感器将通过发送带有实际传感器读数的周期性keepAlive消息来保持与MQTT的连接。如果传感器脱机,由于缺少keepAlives,到代理的连接将超时。
这就是LWT进来的地方:如果没有指定LWT,代理就不会在意,只会关闭连接。然而,在我们的示例中,代理将执行传感器的最后一个意愿,并发布LWT-message‘/node/id脱机::id’。然后,该消息将被消费到我的紧急用户,我将被通知传感器的ID通过短信,以便我可以检查发生了什么。
简而言之::
与其在客户端脱机后关闭连接,还可以利用LWT消息来定义代理代表客户端发布的消息,因为客户机是脱机的,不能再发布消息。
发布于 2013-06-24 00:26:50
仅仅因为设备不发布并不意味着它不是在线的,或者存在网络问题。
例如,如果传感器监视一个值的变化非常罕见,良好的设计表明传感器应该只发布这些更改以帮助减少带宽使用,因为定期发布相同的值是浪费的。如果该值作为保留值发布,则任何新订阅服务器都将始终获得当前值,而不必等待传感器值更改并再次发布。
在这种情况下,LWT用于在传感器故障(或者存在网络问题)时发布,因此我们在客户端知道问题所在,保持生命周期。
发布于 2015-03-19 16:44:59
一篇关于“最后遗嘱”和“遗嘱”消息的深入文章可在MQTT基本博客文章系列:http://www.hivemq.com/mqtt-essentials-part-9-last-will-and-testament/中获得。
为了总结这篇博文:
MQTT中使用了“最后的遗嘱”和“遗嘱”功能来通知其他客户端一个不正常的断开连接的客户端。
MQTT是经常使用的场景,在不可靠的网络中非常常见。因此,人们认为有些客户会不时地断线,因为他们失去了连接,电池是空的,或者任何其他可以想象的情况。最好知道连接的客户端是否已经断开连接(这意味着使用MQTT断开消息),以便采取适当的操作。
https://stackoverflow.com/questions/17270863
复制相似问题