MQTT的遗嘱机制
先说原理
MQTT协议中的遗嘱机制允许客户端在连接时指定一条遗嘱消息,
当客户端意外断线时,服务端会发布这条遗嘱消息只要对订阅这个主题都可以收到这个消息
遗嘱机制的目的是在客户端意外断线时通知其他设备客户端的状态变化。
概念
lastWillTopic – 遗嘱主题
- 遗嘱消息和普通MQTT消息很相似,也有主题和正文内容。
- lastWillTopic的作用正是告知服务端,本客户端的遗嘱主题是什么。
- 只有那些订阅了这一遗嘱主题的客户端才会收到本客户端的遗嘱消息。
- 以上图为例,此遗嘱主题为”hans/will”。也就是说,只有订阅了主题”hans/will”的客户端,才会收到这台客户端的遗嘱消息。
lastWillMessage – 遗嘱消息
- 遗嘱消息定义了遗嘱消息内容。在本示例中,那些订阅了主题”hans/will”的客户端会在客户端意外断线时,收到服务端发布的“unexpected exit”。
lastWillQoS – 遗嘱QoS
- 对于遗嘱消息来说,同样可以使用服务质量来控制遗嘱消息的传递和接收。
- 这里的服务质量与普通MQTT消息的服务质量是一样的概念。
- 也可以设置为0、1、2。对于不同的服务质量级别,服务端会使用不同的服务质量来发布遗嘱消息。
lastWillRetain – 遗嘱保留
- QoS 0【At most once】:最多一次,快速但不可靠。
- QoS 1【At least once】:至少一次,保证消息可靠传递,但可能重复。
- QoS 2【Exactly once】:只有一次,确保消息准确且仅一次传递,最可靠但效率最低。
- 遗嘱消息也可以设置为保留消息,遗嘱保留用于设置遗嘱消息是否需要进行保留处理。服务端会根据此处内容,对遗嘱消息进行相应的保留与否处理。
具体操作流程
- 在使用MQTT遗嘱时,我们建议您通过以下方法让设备的MQTT遗嘱机制可以更好的发挥作用。
- 假设我们现在有一台MQTT客户端。它的client id是 client-1。它的遗嘱主题是“client-1-will”
- 当client-1连接服务端时,CONNECT报文中的遗嘱消息是“offline”。并且它的遗嘱保留设置为true。
- 当client-1成功连接服务端后,立即向遗嘱主题“client-1-will”发布一条消息“online”。同时在发布此消息时,保留标志设置为true。这样,只要client-1在线,那么任何设备一订阅“client-1-will”就能收到设备在线的消息“online”。
- 如果client-1发生意外离线。那么任何设备一订阅“client-1-will”就会收到设备离线的消息”offline”。
- 如果client-1恢复连接,那么它会将遗嘱主题“client-1-will”的保留消息更改为“online”,这样任何设备一订阅“client-1-will”就能收到设备在线的消息“online”。
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/18678034