MQTT 协议学习:006-订阅主题

Posted schips

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MQTT 协议学习:006-订阅主题相关的知识,希望对你有一定的参考价值。

背景

之前我们提到了怎么发布消息对应的报文;现在我们来看,订阅一个主题的报文是怎么样的。

SUBSCRIBE - 订阅主题

客户端向服务端发送SUBSCRIBE报文用于创建一个或多个订阅。每个订阅注册客户端关心的一个或多个主题。为了将应用消息转发给与那些订阅匹配的主题,服务端发送PUBLISH报文给客户端。SUBSCRIBE报文也(为每个订阅)指定了最大的QoS等级,服务端根据这个发送应用消息给客户端。

SUBSCRIBE 的 固定报头

Bit 7 6 5 4 3 2 1 0
byte 1 MQTT控制报文类型 (0x8) 保留位(0x2)
1 0 0 0 0 0 1 0
byte 2 剩余长度

SUBSCRIBE控制报固定报头的第3,2,1,0位是保留位,必须分别设置为0,0,1,0。服务端必须将其它的任何值都当做是不合法的并关闭网络连接。
剩余长度字段 等于可变报头的长度(2字节)加上有效载荷的长度。

SUBSCRIBE 的 可变头

SUBSCRIBE 的 可变头 中只有 报文标识符(Packet Identifier) 这一个字段。

报文标识符(Packet Identifier) 占用2个字节。没什么新的知识点,这里不再介绍。

SUBSCRIBE 的 有效荷载

SUBSCRIBE报文的有效载荷必须包含至少一对主题过滤器QoS等级字段组合

每一个过滤器后面跟着一个字节,这个字节被叫做 服务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的最大QoS等级。

主题过滤器列表:表示客户端想要订阅的主题。

SUBSCRIBE报文有效载荷中的主题过滤器列表必须是UTF-8字符串。服务端应该支持包含通配符(4.7.1节定义的)的主题过滤器。如果服务端选择不支持包含通配符的主题过滤器,必须拒绝任何包含通配符过滤器的订阅请求。

请求的最大服务质量等级字段编码为一个字节,它后面跟着UTF-8编码的主题名,那些主题过滤器 /和QoS等级组合是连续地打包。

图例 3.22 – SUBSCRIBE报文有效载荷格式
? ?
描述 7 6 5 4 3 2 1 0
主题过滤器
byte 1 长度 MSB
byte 2 长度 LSB
byte 3..N 主题过滤器(Topic Filter)
服务质量要求(Requested QoS)
保留位 服务质量等级
byte N+1 0 0 0 0 0 0 X X

当前版本的协议没有用到服务质量要求(Requested QoS)字节的高六位。如果有效载荷中的任何位是非零值,或者QoS不等于0,1或2,服务端必须认为SUBSCRIBE报文是不合法的并关闭网络连接 [MQTT-3-8.3-4]。

有效载荷非规范示例

图例 3.23 – 有效载荷字节格式非规范示例 展示了 表格 3.5 – 有效载荷非规范示例 中简略描述的SUBSCRIBE报文的有效载荷。

表格 3.5 – 有效载荷非规范示例
主题名 “a/b”
服务质量要求 0x01
主题名 “c/d”
服务质量要求 0x02
图例 3.23 – 有效载荷字节格式非规范示例
描述 7 6 5 4 3 2 1 0
主题过滤器(Topic Filter)
byte 1 Length MSB (0) 0 0 0 0 0 0 0 0
byte 2 Length LSB (3) 0 0 0 0 0 0 1 1
byte 3 ‘a’ (0x61) 0 1 1 0 0 0 0 1
byte 4 ‘/’ (0x2F) 0 0 1 0 1 1 1 1
byte 5 ‘b’ (0x62) 0 1 1 0 0 0 1 0
服务质量要求(Requested QoS)
byte 6 Requested QoS(1) 0 0 0 0 0 0 0 1
主题过滤器(Topic Filter)
byte 7 Length MSB (0) 0 0 0 0 0 0 0 0
byte 8 Length LSB (3) 0 0 0 0 0 0 1 1
byte 9 ‘c’ (0x63) 0 1 1 0 0 0 1 1
byte 10 ‘/’ (0x2F) 0 0 1 0 1 1 1 1
byte 11 ‘d’ (0x64) 0 1 1 0 0 1 0 0
服务质量要求(Requested QoS)
byte 12 Requested QoS(2) 0 0 0 0 0 0 1 0

以上是关于MQTT 协议学习:006-订阅主题的主要内容,如果未能解决你的问题,请参考以下文章

MQTT协议

Linux编程MQTT实现主题发布订阅

ESP32-IDF05-4 WIFI-MQTT协议基础

MQTT协议探究

MQTT 协议学习:Retained(保留消息) 和LWT(最后遗嘱)

通过 mosquitto 了解 MQTT协议