Protocols MQTT最后遗嘱的目的或用途是什么?

Protocols MQTT最后遗嘱的目的或用途是什么?,protocols,mqtt,Protocols,Mqtt,我肯定遗漏了一些关于整个MQTT协议是如何工作的,因为我无法掌握最后遗嘱消息的使用模式:它们的目的是什么? 我经常看到的一个例子是通知设备已脱机。这对我来说没有多大意义,因为很明显,如果一台设备没有发布任何数据,它可能处于脱机状态,或者可能存在一些网络问题 那么,LWT的一些实际用途是什么?它是为什么而发明的?仅仅因为设备没有发布并不意味着它没有在线或存在网络问题 例如,一个传感器监测的值变化非常少,good design表示传感器应该只发布这些变化以帮助减少带宽使用,因为定期发布相同的值是浪费

我肯定遗漏了一些关于整个MQTT协议是如何工作的,因为我无法掌握最后遗嘱消息的使用模式:它们的目的是什么?
我经常看到的一个例子是通知设备已脱机。这对我来说没有多大意义,因为很明显,如果一台设备没有发布任何数据,它可能处于脱机状态,或者可能存在一些网络问题


那么,LWT的一些实际用途是什么?它是为什么而发明的?

仅仅因为设备没有发布并不意味着它没有在线或存在网络问题

例如,一个传感器监测的值变化非常少,good design表示传感器应该只发布这些变化以帮助减少带宽使用,因为定期发布相同的值是浪费的。如果该值作为保留值发布,则任何新订户都将始终获得当前值,而无需等待传感器值更改并再次发布


在这种情况下,LWT用于在传感器发生故障(或存在网络问题)时发布,因此我们在客户端保持活动超时时立即知道问题。

LWT消息并不真正关心检测客户端是否已脱机(该任务由保持活动消息处理)。 LWT消息是关于客户端脱机后发生的事情

类似于真正的遗嘱: 如果一个人死了,她可以制定一份遗嘱,在遗嘱中她宣布她去世后应该采取什么行动。遗嘱执行人将注意这些愿望,并代表她执行这些愿望。 MQTT世界中的类比是,客户机可以制定一份遗嘱,在该遗嘱中,客户机声明代理在脱机后应该代表它发送什么消息

一个虚构的例子:

我有一个传感器,它发送关键数据,但很少。 它以[topic:'/node/gone offline',message:':id']的形式制定了最后的遗嘱声明,其中:id是传感器的唯一id。我还有一个主题为“节点/离线”的紧急订户,每当在该频道上发布消息时,它都会向我的手机发送短信

在正常操作期间,传感器将通过发送与实际传感器读数交错的定期keepAlive消息来保持与MQTT代理的连接打开。如果传感器脱机,由于缺少keepAlives,与代理的连接将超时

这就是LWT的作用:如果没有指定LWT,代理就不关心,只是关闭连接。然而,在我们的例子中,代理将执行传感器的最后一个遗嘱,并发布LWT消息“/node/gone offline::id”。该消息将被我的紧急订户使用,我将通过短信收到传感器ID的通知,以便我可以检查发生了什么

简而言之:


LWT消息可以用来定义代理代表客户端发布的消息,而不是在客户端脱机后关闭连接,由于客户端处于脱机状态,无法再发布。

有关最后遗嘱和遗嘱消息的深入文章可在MQTT Essentials博客文章系列中找到:

总结博客文章:

最后一个遗嘱和遗嘱功能在MQTT中用于向其他客户机通知未完全断开连接的客户机


MQTT通常用于不可靠网络非常常见的场景。因此,我们假设一些客户会不时地不正常地断开连接,因为他们失去了连接,电池是空的或任何其他可以想象的情况。最好知道连接的客户端是否正常断开连接(这意味着使用MQTT DISCONTACT消息),以便采取适当的操作。

此外,keepAlive消息只由代理发送和接收,与上一个遗嘱有一个主要区别:任何人都可以订阅此主题,并知道客户端正在脱机