我肯定错过了有关整个 MQTT 协议如何工作的一些信息,因为我无法掌握Last Will Treat消息的使用模式:它们的目的是什么?
我经常看到的一个例子是通知设备已离线。这对我来说没有多大意义,因为很明显,如果设备没有发布任何数据,它可能处于脱机状态或可能存在一些网络问题。
那么,LWT 有哪些实际用途呢?它是为了什么而发明的?
LWT 消息并不真正关心检测客户端是否已离线(该任务由 keepAlive 消息处理)。LWT 消息是关于客户端离线后发生的情况。
类比是真正的遗嘱:如果一个人死了,她可以制定一份遗嘱,她在遗嘱中声明她去世后应该采取什么行动。执行人将听取这些意愿并代表她执行。MQTT 世界中的类比是,客户端可以制定遗嘱,其中声明代理应在离线后代表它发送什么消息。
一个虚构的例子:
我有一个传感器,可以发送关键数据,但很少发送。它以 [topic: '/node/gone-offline', message: ':id'] 的形式制定了最后遗嘱声明,其中 :id 是传感器的唯一 ID。我还有一个主题为“node/gone-offline”的紧急订阅者,每次在该频道上发布消息时,它都会向我的手机发送一条短信。
在正常操作期间,传感器将通过发送穿插实际传感器读数的周期性 keepAlive 消息来保持与 MQTT 代理的连接打开。如果传感器离线,由于缺少 keepAlives,与代理的连接将超时。
这就是 LWT 的用武之地:如果没有指定 LWT,则代理不关心,只是关闭连接。然而,在我们的例子中,代理将执行传感器的最后遗嘱并发布 LWT 消息“/node/gone-offline::id”。然后,该消息将被发送给我的紧急订阅者,并且我将通过 SMS 通知我传感器的 ID,以便我可以检查发生了什么。
简而言之:
不仅在客户端离线后关闭连接,还可以利用 LWT 消息来定义要由代理代表客户端发布的消息,因为客户端离线并且无法再发布。
Just because a device is not publishing does not mean it is not online or there is a network problem.
Take for example a sensor that monitors a value that only changes very infrequently, good design says that the sensor should only publish the changes to help reduce bandwidth usage as periodically publishing the same value is wasteful. If the value is published as a retained value then any new subscriber will always get the current value without having to wait for the sensor value to change and it publish again.
In this case the LWT is used to published when the sensor fails (or there is a network problem) so we know of the problem as soon at the client keep alive times out.
MQTT Essentials 博客文章系列中提供了有关 Last-Will-and-Testament 消息的深入文章:http ://www.hivemq.com/mqtt-essentials-part-9-last-will-and-testament/ .
总结博客文章:
最后遗嘱和遗嘱功能在 MQTT 中用于通知其他客户端有关不正常断开连接的客户端。
MQTT 经常用在不可靠网络非常普遍的场景中。因此,假设某些客户端会不时地不优雅地断开连接,因为他们失去了连接,电池没电或任何其他可以想象的情况。最好知道已连接的客户端是否已正常断开连接(这意味着使用 MQTT DISCONNECT消息),以便采取适当的措施。