【MQTT基础篇(十五)】MQTT遗嘱

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消息的服务质量是一样的概念。也可以设置为012。对于不同的服务质量级别,服务端会使用不同的服务质量来发布遗嘱消息。


1.4 lastWillRetain – 遗嘱保留

遗嘱保留用于设置遗嘱消息是否需要进行保留处理。服务端会根据此处内容,对遗嘱消息进行相应的保留与否处理。


2 MQTT遗嘱操作建议

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

假设我们现在有一台MQTT客户端。它的client idclient-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”。


内容来自 -----> 太极创客
详情可见太极创客官网,内有Arduino、ESP32等详细教程

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Proteus是一款电子电路仿真软件,可以用于设计、测试和验证电路原理图和PCB布局。而MQTT是一种轻量级的通信协议,用于物联网设备之间的消息传递。 在Proteus中使用MQTT,可以模拟物联网设备之间的通信。你可以使用MQTTBox或者编写代码来代替MQTT工具。首先,你需要在Proteus中添加一个虚拟串口工具(vspdpro.exe),用于模拟串口通信。然后,你可以在Proteus中添加一个TCP接收工具(通讯猫),用于接收MQTT消息。接下来,你可以使用Proteus提供的函数或者编写代码来实现MQTT的功能。 以下是一个使用Proteus和MQTT示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义MQTT消息处理函数 void mqtt_message_handler(char* topic, char* message) { printf("Received MQTT message:\n"); printf("Topic: %s\n", topic); printf("Message: %s\n", message); } int main() { // 初始化Proteus和MQTT Proteus_Init(); MQTT_Init(); // 订阅MQTT主题 MQTT_Subscribe("topic1"); MQTT_Subscribe("topic2"); // 设置MQTT消息处理函数 MQTT_SetMessageHandler(mqtt_message_handler); // 运行Proteus和MQTT Proteus_Run(); MQTT_Run(); return 0; } ``` 在上面的示例代码中,我们首先初始化Proteus和MQTT。然后,我们订阅了两个MQTT主题。接下来,我们设置了一个MQTT消息处理函数,用于处理接收到的MQTT消息。最后,我们运行了Proteus和MQTT。 请注意,上述示例代码仅为演示目的,实际使用时需要根据具体情况进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Eiker_3169

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

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

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

打赏作者

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

抵扣说明:

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

余额充值