在上两期文章中,我们介绍了MQTT 5.0中的:
MQTT Packet详解【01】:CONNECT & CONNACK
MQTT Packet详解【02】:PUBLISH & PUBACK
我这期重点介绍SUBCRIBE和UNSUBSCRIBE订阅和取消订阅数据包结构。
在MQTT中,SUBSCRIBE包用于发起订阅请求,而SUBACK包用于返回订阅结果。取消订阅时使用UNSUBSCRIBE和UNSUBACK数据包。订阅主题比取消订阅更常用。但是,在本文中,我们仍然将介绍订阅和取消订阅数据包的结构和组成。
首先,我们使用Wireshark捕获一个真实的MQTT订阅请求和响应。在这里,我们使用MQTTX CLI向公共MQTT服务器发起订阅请求。以下命令将创建一个订阅,主题为demo
,最大QoS设置为2:
以下是Wireshark捕获的SUBSCRIBE和SUBACK数据包:
此十六进制字节串对应于以下数据包内容:
也许你开始想知道他们是如何完成从简单的MQTTX CLI命令到复杂的数据包数据的转换的,或者好奇如何在捕获MQTT数据包时提取所需的信息。
在下面介绍SUBSCRIBE、SUBACK、UNSUBSCRIBE和UNSUBACK的数据包结构时,您的问题将得到解答。
SUBSCRIBE包结构
Fixed Header固定头
在SUBSCRIBE数据包中,固定报头中第一个字节的高4位必须设置为8(0b1000),而保留的低4位必须设置为2(0b0010)。在第一个字节之后,仍然有剩余长度字段,它是一个可变字节整数。
SUBSCRIBE数据包的变量报头按顺序包含以下字段:
SUBSCRIBE数据包的有效载荷包含一个或多个主题过滤器和订阅选项对。Topic Filter是一个UTF-8 Encoded String,用于向服务器指示客户端希望订阅的主题,而Subscription Option仅占用一个字节,目前由以下四个选项组成:
Fixed Header固定头
对于SUBACK包,固定报头的第一个字节由MQTT控制包类型的高4位和保留位的低4位组成,前者必须为9(0b1001),后者必须为0(0b0000).
SUBACK数据包的变量报头按顺序包含以下字段:
Payload 载荷
SUBACK 包的负载包含一个原因代码列表,原因代码表示订阅是否成功或失败的原因。一个原因代码对应于 SUBSCRIBE 包中的一个主题过滤器,因此 SUBACK 包中原因代码的顺序必须与 SUBSCRIBE 包中主题过滤器的顺序一致。
下表列出了 SUBACK 报文的所有原因代码:
Fixed Header固定头
与 SUBSCRIBE 包相同,唯一的区别是 Packet Type 字段的值从 8(0b1000)变为 10(0b1010)。
紧随其后的是剩余长度字段,它指示当前数据包中剩余的字节数。
Variable Header 变量头
与 SUBSCRIBE 包相同。
Fixed Header固定头
对于 UNSUBACK 报文,固定头部的第一个字节由 MQTT 控制报文类型的高位 4 位和保留位的低位 4 位组成,前者必须是 11(0b1011),后者必须是 0(0b0000)。
UNSUBACK 的可变头部包含按顺序排列的包标识符和属性字段,可用属性与 SUBACK 包中的属性相同。
Payload 载荷
UNSUBACK 的负载还包含一个 Reason Code 列表。Reason Code 表示取消订阅是否成功或失败。这些 Reason Code 与 UNSUBSCRIBE 包中的 Topic Filters 按顺序对应。
以下表格列出了 UNSUBACK 包的所有可用 Reason Codes:
结论
SUBSCRIBE 和 SUBACK 报文用于订阅,而 UNSUBSCRIBE 和 UNSUBACK 用于取消订阅。要订阅或取消订阅的主题过滤器列表位于相应报文的 Payload 中。SUBSCRIBE 报文中的每个主题过滤器都与一组订阅选项相关联。
SUBACK 和 UNSUBACK 报文中的 Reason Code 表示请求结果,它是一个列表,与请求报文中对应的主题过滤器一一对应。
参考链接:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有