本文内容参考:
什么是MQTT遗嘱消息?如何配置和处理遗嘱消息?_mqtt last will-CSDN博客
【MQTT基础篇(十五)】MQTT遗嘱_last-will qos-CSDN博客
MQTT 协议学习:Retained(保留消息) 与 LWT(最后遗嘱)
特此致谢!
MQTT在笔者的相关文章中以及介绍过了,这里只再简单说一下。MQTT的英文全称为Message Queuing Telemetry Transport,中文译为消息队列遥测传输。MQTT是一种轻量级的消息传输协议,被广泛应用于物联网和传感器网络中。
简要介绍完了MQTT,来看今天的主角 —— MQTT遗嘱信息。
1. 遗嘱消息的概念
遗嘱消息的英文全称为Last Will and Testament,简称LWT。在MQTT中,遗嘱消息是一种特殊类型的消息,用于在客户端异常断开连接时向其他订阅者通知其离线状态或执行一些预定义操作。
遗嘱消息是在客户端连接到MQTT代理服务器(MQTT Broker)时,客户端通过设置遗嘱消息选项来指定的一条消息,说得更明白一些,就是我们在连接到Broker时提到的遗嘱,包括遗嘱主题、遗嘱QoS、遗嘱消息等。当客户端异常断开连接时(例如网络故障或客户端崩溃),MQTT代理会自动将该遗嘱消息发布给其他订阅者。遗嘱消息的目的是提供一种机制,使得其他订阅者能够得知客户端的离线状态,或者执行一些预定义的操作。
遗嘱消息由以下几个关键属性组成:
- 主题(Topic)
遗嘱消息需要指定一个主题,用于标识遗嘱消息的内容。
- 负载(Payload)
遗嘱消息可以包含任意的负载数据,用于传递有关客户端的状态或其它信息。
- QoS(Quality of Service)
遗嘱消息的发布可以选择不同的QoS级别,以确保可靠的消息传递。
- 保留(Retained)
遗嘱消息可以选择保留,这意味着新的订阅者在订阅该主题时将收到最近的遗嘱消息。
遗嘱消息的配置是可选的,每个客户端可以根据自己的需求选择是否设置遗嘱消息。当客户端连接到MQTT代理时,可以通过设置遗嘱消息选项来指定遗嘱消息的内容和属性。
2. Retain的详细介绍
关于保留(Retained)一项,详细说明一下。假设有这样一个场景:
有一个温度传感器,它每三个小时向一个 Topic 发布当前的温度。那么问题来了,有一个新的订阅者在它刚刚发布了当前温度之后订阅了这个主题,那么这个新的订阅端必须等到三个小时以后,才能收到温度传感器再次发布消息的时候。在这之前,这个新的订阅者对传感器的温度数据一无所知。
那么怎么解决这个问题?这个时候就轮到Retained消息出场了。Retained消息是指在PUBLISH数据包中Retain标识设为1的消息,Broker收到这样的PUBLISH包以后,将保存这个消息,当有一个新的订阅者订阅相应主题的时候,Broker会马上将这个消息发送给订阅者。
Retain消息有以下一些特点:
-
一个Topic只能有1条Retained消息,发布新的Retained消息将覆盖老的Retained消息;
-
如果订阅者使用通配符订阅主题,它会收到所有匹配的主题上的Retained消息;
-
只有新的订阅者才会收到Retained消息。如果订阅者重复订阅一个主题,也会被当做新的订阅者,然后收到 Retained 消息;
-
Retained消息发送到订阅者时,消息的Retain标识仍然是1,订阅者可以判断这个消息是否是 Retained消息,以做相应的处理。
如果想要删除一个Retained消息也很简单,只需要向这个主题发布一个Payload长度为0的 Retained消息就可以了。
这样,这一场景的解决方案就很简单了,温度传感器每 3 个小时发布当前的温度的Retained消息,那么无论新的订阅者什么时候进行订阅,它都能收到温度传感器上一次发布的数据。
3. 遗嘱消息的用途
遗嘱消息在MQTT中具有多种用途,以下是其中一些常见的应用场景:
(1)状态通知
客户端可以设置一个遗嘱消息来通知其他订阅者其在线或离线状态。当客户端正常断开连接时,代理会发布遗嘱消息,告知其他订阅者该客户端已经离线。
(2)资源释放
某些场景下,客户端连接异常断开时可能需要释放所占用的资源或执行清理操作。通过设置遗嘱消息,客户端可以指示代理在其断开连接时执行相应的资源释放或清理操作。
(3)信息传递
遗嘱消息可以携带有关客户端的信息,例如设备的状态、位置或其他重要数据。当客户端断开连接时,这些信息可以被传递给其他订阅者,以便及时了解客户端的状态或其他相关信息。
更多MQTT遗嘱消息机制的介绍和讲解,请看下回。