MQTT 基础--遗嘱信息(Last will)和遗嘱标示(Testament):第 9 部分

本文围绕MQTT的遗嘱(LWT)功能展开。介绍了LWT可通知其他客户端有关不正常断开连接的客户端,说明了为客户端指定LWT消息的方式、代理发送LWT消息的情况,还给出了使用LWT的最佳实践,如结合保留消息存储客户端状态。

由于 MQTT 经常用于包含不可靠网络的场景,因此可以合理地假设这些场景中的某些 MQTT 客户端偶尔会不正常地断开连接。由于连接丢失、电池电量耗尽或许多其他原因,可能会发生不正常的断开连接。了解客户端是正常断开连接(使用 MQTT DISCONNECT消息)还是不正常断开连接(没有断开连接消息),有助于您正确响应。遗嘱信息和遗嘱标示功能为客户提供了一种以适当方式应对非正常断开连接的方法。

最后的遗嘱和遗嘱

在 MQTT 中,您使用遗嘱 (LWT) 功能来通知其他客户端有关不正常断开连接的客户端。每个客户端在连接到代理时都可以指定其遗嘱消息(Last will message)。遗嘱消息是一条普通的 MQTT 消息,带有主题、保留消息标志、QoS 和有效负载。代理存储消息,直到它检测到客户端不正常地断开连接。作为对不正常断开连接的响应,代理将遗嘱消息发送给遗嘱消息主题的所有订阅客户端。如果客户端使用正确的 DISCONNECT 消息优雅地断开连接,则代理会丢弃存储的 LWT 消息。

LWT 帮助您在客户端连接断开时实施各种策略(或至少通知其他客户端有关离线状态)。

如何为客户端指定 LWT 消息?

客户端可以在 CONNECT 消息中指定 LWT 消息,用于启动客户端和代理之间的连接。

要了解有关如何建立客户端和代理之间的连接的更多信息,请参阅

代理何时发送 LWT 消息?

根据MQTT 3.1.1 规范,Broker 必须在以下情况下分发客户端的 LWT:

  • 代理检测到 I/O 错误或网络故障。

  • 客户端无法在定义的 Keep Alive 期限内进行通信。

  • 客户端在关闭网络连接之前不会发送 DISCONNECT 数据包。

  • 由于协议错误,代理关闭了网络连接。

我们将在下一篇文章
中听到更多关于 Keep Alive 时间的信息。

最佳实践 - 什么时候应该使用 LWT?

LWT 是通知其他订阅客户端有关另一个客户端意外丢失连接的好方法。在实际场景中,LWT 通常与保留消息
结合使用,以存储客户端在特定主题上的状态。例如,client1 首先向代理发送一条 CONNECT 消息,其中包含“ Offline ”作为有效负载的 lastWillMessage,lastWillRetain 标志设置为 true,lastWillTopic 设置为client1/status。接下来,客户端向同一主题 ( client1/status ) 发送一条带有有效负载“ Online ”且将保留标志设置为 true 的 PUBLISH 消息。只要 client1 保持连接,新订阅到 client1/status 主题的客户端就会收到“ Online” 保留的消息。如果 client1 意外断开,broker 会发布带有有效负载“ Offline ”的 LWT 消息作为新的保留消息。在 client1 离线时订阅主题的客户端会从代理接收 LWT 保留消息(“ Offline ”)。这种保留消息的模式使其他客户端能够及时了解特定主题的 client1 的当前状态。


这将我们带到了 MQTT Essentials 系列的第九部分的结尾。感谢您加入我们。在本系列的最后一篇文章中,我们将介绍MQTT 心跳机制以及代理如何知道客户端在线或离线

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网络安全那些事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值