2-6 MQTT遗嘱

位置导航: 首页 / 零基础入门学用物联网总目录 / MQTT篇目录 /本页

在之前的课程里,我们学习了MQTT协议的心跳机制。该机制可以让服务端随时掌握客户端连接情况。当客户端“心跳”正常时,服务端即知道客户端仍然在线(活着)。当心跳一旦停止,服务端就会发现该客户端已经断线(死亡)。

为了让客户端可以更好的发挥作用,便于服务端管理,MQTT协议允许客户端在“活着”的时候就写好遗嘱,这样一旦客户端意外断线,服务端就可以将客户端的遗嘱公之于众。

请注意,在上面的这段话中,我将意外断线这几个字特意做了标注,这是因为,客户端的遗嘱只在意外断线时才会发布,如果客户端正常的断开了与服务端的连接,这个遗嘱机制是不会启动的,服务端也不会将客户端的遗嘱公布。

那么什么是意外断线呢?

当客户端正常断开连接时,会向服务端发送DISCONNECT报文,服务端接收到该报文后,就知道,客户端是正常断开连接,而并非意外断开连接。

MQTT断开连接报文
MQTT断开连接报文

然而,当服务端在没有收到DISCONNECT报文的情况下,发现客户端“心跳”停止了,这时服务端就知道客户端是意外断线了。

那究竟是什么原因会导致客户端意外断线呢?我们知道MQTT协议作为物联网协议可能用于不稳定的网络环境,假如客户端的网络信号突然出现问题,就会导致了意外断线。

另外,有些客户端设备使用电池供电,当电池没电时,也会出现意外断网的情况。当然,造成意外断网的情况还有很多,以上是较为常见的情况。

MQTT服务端在客户端意外断开连接时将遗嘱信息发布

通过以上讲解,我们了解了客户端遗嘱的作用,接下来我们仔细看一下关于客户端遗嘱的几个重要话题:

  1. 客户端如何将遗嘱消息发送给服务端
  2. MQTT遗嘱使用建议

1. 客户端如何将遗嘱消息发送给服务端

在之前的课程里我为大家讲解了MQTT客户端是如何连接服务端的

MQTT客户端要想连接服务端,首先要向服务端发送CONNECT报文。下图是CONNECT报文所包含的信息内容。

MQTT CONNECT报文
MQTT CONNECT报文中的遗嘱信息

在上图的CONNECT报文中,我特意使用红色对一系列信息进行了标注。客户端正是在连接服务端时,利用这一系列信息将遗嘱消息发送给服务端。下面我们来分别看一下这些信息的作用。

lastWillTopic – 遗嘱主题

遗嘱消息和普通MQTT消息很相似,也有主题和正文内容。lastWillTopic的作用正是告知服务端,本客户端的遗嘱主题是什么。只有那些订阅了这一遗嘱主题的客户端才会收到本客户端的遗嘱消息。

以上图为例,此遗嘱主题为”hans/will”。也就是说,只有订阅了主题”hans/will”的客户端,才会收到这台客户端的遗嘱消息。

lastWillMessage – 遗嘱消息

遗嘱消息定义了遗嘱消息内容。在本示例中,那些订阅了主题”hans/will”的客户端会在客户端意外断线时,收到服务端发布的“unexpected exit”。

lastWillQoS – 遗嘱QoS

在之前的课程里,我们学习了服务质量的概念。对于遗嘱消息来说,同样可以使用服务质量来控制遗嘱消息的传递和接收。这里的服务质量与普通MQTT消息的服务质量是一样的概念。也可以设置为0、1、2。对于不同的服务质量级别,服务端会使用不同的服务质量来发布遗嘱消息。

lastWillRetain – 遗嘱保留

遗嘱消息也可以设置为保留消息,关于保留消息的具体内容,我们在之前的课程中曾经学习过。遗嘱保留用于设置遗嘱消息是否需要进行保留处理。服务端会根据此处内容,对遗嘱消息进行相应的保留与否处理。

MQTT遗嘱操作建议

在使用MQTT遗嘱时,我们建议您通过以下方法让设备的MQTT遗嘱机制可以更好的发挥作用。

假设我们现在有一台MQTT客户端。它的client id是 client-1。它的遗嘱主题是“client-1-will”

1. 当client-1连接服务端时,CONNECT报文中的遗嘱消息是“offline”。并且它的遗嘱保留设置为true。

2. 当client-1成功连接服务端后,立即向遗嘱主题“client-1-will”发布一条消息“online”。同时在发布此消息时,保留标志设置为true。这样,只要client-1在线,那么任何设备一订阅“client-1-will”就能收到设备在线的消息“online”。

3. 如果client-1发生意外离线。那么任何设备一订阅“client-1-will”就会收到设备离线的消息”offline”。

4. 如果client-1恢复连接,那么它会将遗嘱主题“client-1-will”的保留消息更改为“online”,这样任何设备一订阅“client-1-will”就能收到设备在线的消息“online”。