MQTT——取消订阅报文和断开连接报文

本文详细解析了MQTT协议中的取消订阅报文和断开连接报文。阐述了取消订阅报文的结构及其操作规范,并介绍了取消订阅确认报文(UNSUBACK)。此外,还解释了断开连接报文的简单结构及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者已经把连接报文,订阅报文,发布报文都讲解了完了。而接下来就是取消订阅报文和断开连接报文。和其他的报文比较的话,他们显示非常简单。甚至笔者觉得可以不必要拿出来讲。只要看一下MQTT文档就没有什么不清楚的。为了完整一点笔者就把他们放在一直了。

取消订阅报文

固定报头的结构笔者不都说了。主要记得固定报头的QOS为1就行了。笔者把官方的列表贴过来了。如下

我们知道固定报头分三部分,一个是报文类型,一个是报文标示。一个是剩余长度。取消订阅报文类型的值为10。然后我们看QOS 为1。对应的二进制为10100010。Remaining Length为剩余长度,同样子二进制为八位。所以固定报头的二进制一定是10100010  xxxxxxxx。

 xxxxxxxx表示剩余长度的二进制。后面笔者还会抓包来看。

可变报头里面就一个消息ID的项。没有其他的。

有效载何里面存放的是主题列表。就是用于取消订阅的主题列表。如下

笔者不知道到现还有没有人看不懂这种列表的。Topic Filter为主题过滤,即是主题名。而byte 1类似这种表示每一元素。比如上面举列中的Topic Filter是有五元素组成的。后面是每一个元素的二进制。

MQTT 文档里面对取消订阅报文并没有特别的要求。也只是删除的动作做了一些要求。删除这个订阅的时候,就必须停止发送任何信息了。同时如果有正在分送中的QOS 1 QOS2的信息就必须要完成才行。当然也可以分送准备的缓存信息。

上面我们看到了取消订阅报文的QOS为1。所以会有一个回应。即是取消订阅确定报文(UNSUBACK)。取消订阅确定报文(UNSUBACK)只有固定报头和可变报头,可变报头里面只有一个消息ID的项。没有什么可说的。

相关的包

取消订阅报文

取消订阅确定报文

我们可以看到取消订阅报文有多么的简单,但是还是不如断开连接报文来的简单。因为断开连接报文没有可变报头,没有有效载荷。就一个固定报头。没有错就是一个固定报头。不多说,笔者把固定报头的列表贴出来。如下

上面的列表就是断开连接报文的全部。

断开连接报的结构是最简单的。但是文档中还是指出了几点要注意的。

1)判断固定报头中的标示部分必须是0000,如果不是0就断开连接。

2)客户端不能在通过该连接发送任何信息了。

3)服报端要删除与当前连接关联的未发布的遗嘱消息。同时如果客户端没有断开的话,服务端必须断开。

断开连接报文

 

转载于:https://www.cnblogs.com/hayasi/p/7821093.html

### MQTT 协议消息格式解析 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽不可靠网络环境设计。其消息格式被优化以减少通信开销并提高效率。 #### 基本结构 每条 MQTT 报文由三个部分组成:固定头(Fixed Header)、可变头(Variable Header)以及有效载荷(Payload)。以下是各部分的具体说明: 1. **固定头 (Fixed Header)** 固定头是每条 MQTT 报文中都存在的部分,用于定义报文类型其他基础属性。它至少包含两个字节的信息: - 第一字节表示报文类型标志位组合。 - 高四位指定报文类型(如 CONNECT、PUBLISH 等),共有 16 种可能的类型[^3]。 - 后四位则根据具体的报文类型提供额外的功能指示。 - 第二字节及其后续字节(如果存在)表示剩余长度字段,采用多字节编码方式来节省空间。 2. **可变头 (Variable Header)** 可变头并非所有类型的报文都需要,但它通常用来携带与特定报文相关的附加信息。例如,在 `PUBLISH` 类型中,主题名称会作为可变头部的一部分发送给接收方;而在其他一些控制包里,则可能会有诸如消息 ID 的数据项加入其中。 3. **负载 (Payload)** 负载包含了实际要传递的数据内容。对于某些命令来说,比如订阅请求或断开连接通知等操作类指令,它们可以不带有任何应用层数据即为空体形式提交上去即可满足需求。而对于发布消息而言,这部分则是不可或缺的核心组成部分——也就是我们常说的主题关联的有效信息字符串或其他二进制序列等等。 #### 示例代码展示如何构建简单的 PUBLISH 消息 下面是一个 Python 实现的例子,演示了怎样手动创建一条最简化的 PUBLISH 消息: ```python def create_publish_message(topic, payload): # Fixed header setup for QoS level 0 publish without retain flag set. fixed_header_first_byte = 0b00110000 # 'Publish' packet type with flags indicating no DUP/QoS=0/no RETAIN remaining_length = 2 + len(topic) + len(payload) # Length of variable header plus payload length. # Encoding Remaining Length as per MQTT spec. encoded_remaining_length_bytes = [] while True: byte_value = remaining_length % 128 remaining_length //= 128 if remaining_length > 0: byte_value |= 0x80 encoded_remaining_length_bytes.append(byte_value) if remaining_length == 0: break topic_encoded_as_two_length_prefix_followed_by_actual_topic_name_in_utf_8_encoding = bytearray([len(topic)//256,(len(topic)%256)])+topic.encode('utf-8') full_packet = bytes([fixed_header_first_byte]) + bytes(encoded_remaining_length_bytes) \ + topic_encoded_as_two_length_prefix_followed_by_actual_topic_name_in_utf_8_encoding\ +payload.encode('utf-8') return full_packet example_topic="sensor/temperature" example_payload="72 degrees Fahrenheit" mqtt_msg=create_publish_message(example_topic, example_payload) print(mqtt_msg.hex()) ``` 上述脚本展示了如何按照 MQTT v3.1.1 版本的规定构造一个基本的 PUBLISH 数据帧。注意这里假设的是 Quality Of Service(QoS)=0 并且未启用保留消息功能的情况下的简化版本处理逻辑[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值