文章目录
MQTT遗嘱
在之前的章节里,我们学习了MQTT协议的
心跳机制
。该机制可以让服务端随时掌握客户端连接情况。当客户端“心跳”正常时,服务端即知道客户端仍然在线(活着)。当心跳一旦停止,服务端就会发现该客户端已经断线(死亡)。
为了让客户端可以更好的发挥作用,便于服务端管理,MQTT协议允许客户端在“
活着
”的时候就写好遗嘱
,这样一旦客户端意外断线,服务端就可以将客户端的遗嘱公之于众。
客户端的遗嘱只在意外断线
时才会发布,如果客户端正常的断开
了与服务端的连接,这个遗嘱机制是不会启动的,服务端也不会将客户端的遗嘱公布。
当客户端
正常断开连接
时,会向服务端发送DISCONNECT报文
,服务端接收到该报文后,就知道,客户端是正常断开连接,而并非意外断开连接
。
然而,当服务端
在没有收到DISCONNECT报文
的情况下,发现客户端“心跳”停止
了,这时服务端就知道客户端是意外断线
了。
那究竟是什么原因会导致客户端意外断线呢?我们知道MQTT协议作为物联网协议可能用于不稳定的网络环境,假如客户端的网络信号突然出现问题,就会导致了意外断线。
另外,有些客户端设备使用电池供电,当电池没电时,也会出现意外断网的情况。当然,造成意外断网的情况还有很多,以上是较为常见的情况。
1 客户端如何将遗嘱消息发送给服务端
MQTT客户端要想
连接服务端
,首先要向服务端发送CONNECT报文
。下图是CONNECT报文
所包含的信息内容。
在上图的CONNECT报文
中,我特意使用红色
对一系列信息进行了标注。客户端正是在连接服务端时,利用这一系列信息将遗嘱消息发送给服务端。下面我们来分别看一下这些信息的作用。
1.1 lastWillTopic – 遗嘱主题
遗嘱消息
和普通MQTT消息
很相似,也有主题
和正文内容
。lastWillTopic
的作用正是告知服务端
,本客户端的遗嘱主题是什么。只有那些订阅了这一遗嘱主题的客户端才会收到本客户端的遗嘱消息。
以上图为例,此遗嘱主题为”hans/will
”。也就是说,只有订阅了主题”hans/will
”的客户端,才会收到这台客户端的遗嘱消息
。
1.2 lastWillMessage – 遗嘱消息
遗嘱消息
定义了遗嘱消息内容
。在本示例中,那些订阅了主题”hans/will
”的客户端会在客户端意外断线时,收到服务端发布的“unexpected exit
”。
1.3 lastWillQoS – 遗嘱QoS
对于
遗嘱消息
来说,同样可以使用服务质量
来控制遗嘱消息的传递和接收。这里的服务质量与普通MQTT消息的服务质量是一样的概念。也可以设置为0
、1
、2
。对于不同的服务质量级别,服务端会使用不同的服务质量来发布遗嘱消息。
1.4 lastWillRetain – 遗嘱保留
遗嘱保留
用于设置遗嘱消息
是否需要进行保留处理
。服务端会根据此处内容,对遗嘱消息进行相应的保留与否处理。
2 MQTT遗嘱操作建议
在使用
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
”。
内容来自 -----> 太极创客
详情可见太极创客官网,内有Arduino、ESP32等详细教程