推荐一款稳定的基于C编写的MQTT Client开源库 cMQTT
MQTT协议详解及开发教程(一)MQTT协议概述
MQTT协议详解及开发教程(二)MQTT服务器EMQx搭建
MQTT协议详解及开发教程(三)MQTT Client工具软件选择及简单测试
MQTT协议详解及开发教程(四)MQTT协议报文格式
MQTT协议详解及开发教程(五)CONNECT/CONNACK报文分析
MQTT协议详解及开发教程(六)PUBLISH发布QoS0消息报文分析
MQTT协议详解及开发教程(七)PUBLISH发布QoS1报文流程分析
MQTT协议详解及开发教程(八)PUBLISH发布QoS2报文流程分析
前言
在上一篇文章中,我们对PUBLISH发布QoS 2报文进行了分析,本文我们接着分析SUBSCRIBE及SUBACK的报文流程,“订阅机制”是MQTT协议的一大特点,个人也认为是MQTT最大的一个亮点。关于“订阅”的含义,可以参考前面的文章,这里不再赘述。
SUBSCRIBE的QoS等级不同,但是报文结构是相同的,所以本文以QoS2举例
1. Client 订阅SUBSCRIBE 主题示例
1.1 SUBSCRIBE抓包
源码如下:
82 0e 00 09 00 09 54 65 73 74 54 6f 70 69 63 02
1.2 固定报头
82 0e
其中:
82 – 对应的控制报文类型为SUBSCRIBE
0e – 剩余长度0x0e = 14个字节
1.3 可变报头
00 09 当前的报文 packet ID为 2
1.4 有效载荷
1.4.1 订阅topic信息
00 09 54 65 73 74 54 6f 70 69 63
其中,
00 09–对应topic 长度。
54 65 73 74 54 6f 70 69 63 --对应的ASCII码:TestTopic
1.4.2 订阅topic的QoS值
02–表示QoS 2
2 SUBACK 报文分析
2.1 SUBACK 抓包
源码:
90 03 00 09 02
2.2 固定报头
90 03
其中:
90 – 对应的控制报文类型为PUBREC,
04 – 剩余长度0x03 = 3个字节
2.3 可变报头
00 09
这里就是报文描述符Packet ID,与SUBSCRIBE中的是一致的。
2.4 有效载荷
返回码,每个返回码对应等待确认的SUBSCRIBE报文中的主题过滤器QoS,返回码的顺序必须与SUBSCRIBE报文中的QoS相同。
返回码值定义:
值 | 状态 | 描述 |
---|---|---|
0x00 | 成功 | 最大QoS 0 |
0x01 | 成功 | 最大QoS 1 |
0x02 | 成功 | 最大QoS 2 |
0x80 | 失败 | 订阅失败 |