MQTT 控制报文类型、功能及格式(报文结构) - 第2章
目录
2.1 MQTT 控制报文的结构
2.2 固定报头
2.2.1 控制报文的类型
2.2.2 控制报文类型的标志位
2.2.3 剩余长度
2.3 可变报头
2.4 有效载荷
2.1 MQTT 控制报文的结构
MQTT控制报文由三部分组成:
- 固定报头
- 可变报头
- 有效载荷
名称 EN | 名称 CN | 所属情况 |
---|---|---|
Fixed Header | 固定报头 | 所有控制报文都包含 |
Variable Header | 可变报头 | 部分控制报文包含 |
Payload | 有效载荷 | 部分控制报文包含 |
2.2 固定报头
每个 MQTT 控制报文都包含一个固定报头。固定报头的数据长度为 2~5字节。(Byte = 8bit)
固定报头的格式:(MSB,高位在前)
Byte - Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
Byte 1 | MQTT 控制报文的类型(1 ~ 14) | 指定控制报文类型的标志位 | ||||||
Byte 2~5 | 剩余长度(1~4 Byte) |
- 剩余长度字段的长度,取决于帧长度,详细计算方法见 2.2.3章节。
2.2.1 控制报文的类型
位置:固定报头中,第 1 个字节的 Bit 7~4。
控制报文的定义如下:(0/15是保留位,无用。有效类型为 1~14)
报文类型 | 功能描述 | 流动方向 | 值 | 固定报头 | 可变报头 | 报文标识符 | 载荷 |
---|---|---|---|---|---|---|---|
CONNECT | 客户端请求连接服务端 | C -> S | 1 | 有 | 有 | 无 | 有 |
CONNACK | 服务端确认连接建立 | S -> C | 2 | 有 | 有 | 无 | 有 |
PUBLISH | 发布消息 | C <=> S | 3 | 有 | 有 | 有(Qos>0) | 有 |
PUBACK | 收到发布消息确认(QoS1等级) | C <=> S | 4 | 有 | 有 | 有 | 无 |
PUBREC | 发布消息收到(QoS2等级) | C <=> S | 5 | 有 | 有 | 有 | 无 |
PUBREL | 发布消息释放(QoS2等级) | C <=> S | 6 | 有 | 有 | 有 | 无 |
PUBCOMP | 发布消息完成(QoS2等级) | C <=> S | 7 | 有 | 有 | 有 | 无 |
SUBSCRIBE | 订阅请求 | C -> S | 8 | 有 | 有 | 有 | 有 |
SUBACK | 订阅确认 | S -> C | 9 | 有 | 有 | 有 | 有 |
UNSUBSCRIBE | 取消订阅 | C -> S | 10 | 有 | 有 | 有 | 有 |
UNSUBACK | 取消订阅确认 | S -> C | 11 | 有 | 有 | 有 | 无 |
PINGREQ | (保活)心跳请求 | C -> S | 12 | 有 | 无 | 无 | 无 |
PINGRESP | 心跳响应 | S -> C | 13 | 有 | 无 | 无 | 无 |
DISCONNECT | 客户端断开连接 | C -> S | 14 | 有 | 无 | 无 | 无 |
- Qos:Quality of service,服务质量。Qos 0/1/2 为MQTT规定的服务质量等级,其代表消息传递时不同的可靠程度。
- 其中,5、6、7为 Qos2时才会有的控制报文。
2.2.2 控制报文类型的标志位
位置:固定报头中,第 1 个字节的 Bit 3~0。
控制报文 | 固定报头标志 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
---|---|---|---|---|---|
CONNECT | Reserved | 0 | 0 | 0 | 0 |
CONNACK | Reserved | 0 | 0 | 0 | 0 |
PUBLISH | Used in MQTT 3.1.1 | DUP1 | QoS2 | QoS2 | RETAIN3 |
PUBACK | Reserved | 0 | 0 | 0 | 0 |
PUBREC | Reserved | 0 | 0 | 0 | 0 |
PUBREL | Reserved | 0 | 0 | 0 | 0 |
PUBCOMP | Reserved | 0 | 0 | 0 | 0 |
SUBSCRIBE | Reserved | 0 | 0 | 0 | 0 |
SUBACK | Reserved | 0 | 0 | 0 | 0 |
UNSUBSCRIBE | Reserved | 0 | 0 | 0 | 0 |
UNSUBACK | Reserved | 0 | 0 | 0 | 0 |
PINGREQ | Reserved | 0 | 0 | 0 | 0 |
PINGRESP | Reserved | 0 | 0 | 0 | 0 |
DISCONNECT | Reserved | 0 | 0 | 0 | 0 |
- DUP1 =控制报文的重复分发标志
- QoS2 = PUBLISH报文的服务质量等级
- RETAIN3 = PUBLISH报文的保留标志
- PUBLISH控制报文中的DUP, QoS和RETAIN标志的描述见 3.3.1节。
2.2.3 剩余长度
- 位置:固定报头中,从第2个字节开始。
- 剩余长度等于可变报头的长度(10字节)加上有效载荷的长度。
- 剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。
- 剩余长度不包括用于编码剩余长度字段本身的字节数。
剩余长度字段 的帧格式:
第1个字节 | 第2个字节 | ... | ||
---|---|---|---|---|
Bit 7 | Bit 6:0 | Bit 7 | Bit 6:0 | ... |
进位标志位 | 长度低字节 | 进位标志位 | 长度高字节 | ... |
- 剩余长度字段 的字节长度:最少1个字节,最多4个字节。
- 剩余长度字段 可以表示的长度:1个字节时,可以表示剩余 0~127 长度。4个字节时,最大表示长度为 2^(7*4) - 1 = 2^28 - 1 = 268435455 长度
字节数 | 表示长度的最小值(字节) | 表示长度的最大值(字节) |
---|---|---|
1 | 0 | 2^7 - 1 = 127 |
2 | 2^7 = 128 | 2^(7*2) - 1 = 16383 |
3 | 2^(7*2) = 16384 | 2^(7*3) - 1 = 2097151 |
4 | 2^(7*3) = 2097152 | 2^(7*4) - 1 = 268435455 |
- 提示:
之所以1个字节不能表示 2^8 - 1 = 255长度,是因为:每个字节的最高位 Bit7,并不表示数据,是进位标志位。
- 剩余长度的计算:
- 示例1:
假设本帧剩余字节为 200,计算剩余长度字段。
- 使用电脑计算器,将 200 转换为二进制 1100 1000(MSB高位在前)
- 从右侧低位每7Bit进行一次拆分,依次拆分出:
- 第1个字节为 100 1000,有进位,高位加上进位1为 1100 1000 = 0xC8 (16进制)。
- 第2个字节为 1,无进位,为 1 = 0x01 (16进制)。
那么对应的 字节长度的帧格式如下表:
第1个字节 | 第2个字节 | |||
---|---|---|---|---|
Bit 7 | Bit 6:0 | Bit 7 | Bit 6:0 | |
进位标志位 | 进位标志位 | |||
2进制 | 1 | 100 1000 | 0 | 000 0001 |
2进制 | 1100 1000 | 0000 0001 | ||
16进制 | 0xC8 | 0x01 |
- 示例2:
假设本帧剩余字节为 1000,计算剩余长度字段。
- 使用电脑计算器,将 1000 转换为二进制 11 1110 1000(MSB高位在前)
- 从右侧低位每7Bit进行一次拆分,依次拆分出:
- 第1个字节为 110 1000,有进位,高位加上进位1为 1110 1000 = 0xE8 (16进制)。
- 第2个字节为 11 1,无进位,为 11 1 = 0x07 (16进制)。
那么对应的 字节长度的帧格式如下表:
第1个字节 | 第2个字节 | |||
---|---|---|---|---|
Bit 7 | Bit 6:0 | Bit 7 | Bit 6:0 | |
进位标志位 | 进位标志位 | |||
2进制 | 1 | 110 1000 | 0 | 000 0111 |
2进制 | 1110 1000 | 0000 0111 | ||
16进制 | 0xE8 | 0x07 |
- 示例3:
假设本帧剩余字节为 100,000,000,计算剩余长度字段。
- 使用电脑计算器,将 100,000,000 转换为二进制 101 1111 0101 1110 0001 0000 0000(MSB高位在前)
- 从右侧低位每7Bit进行一次拆分,依次拆分出:
- 第1个字节为 000 0000,有进位,高位加上进位1为 1000 0000 = 0x80 (16进制)。
- 第2个字节为 10 0001 0,有进位,高位加上进位1为 1100 0010 = 0xC2 (16进制)。
- 第3个字节为 1 0101 11,有进位,高位加上进位1为 1101 0111 = 0xD7 (16进制)。
- 第4个字节为 101 111 = 00,无进位,为 10 1111 = 0x2F (16进制)。
那么对应的 字节长度的帧格式如下表:
第1个字节 | 第2个字节 | 第3个字节 | 第4个字节 | |||||
---|---|---|---|---|---|---|---|---|
Bit 7 | Bit 6:0 | Bit 7 | Bit 6:0 | Bit 7 | Bit 6:0 | Bit 7 | Bit 6:0 | |
进位标志位 | 进位标志位 | 进位标志位 | 进位标志位 | |||||
2进制 | 1 | 000 0000 | 1 | 100 0010 | 1 | 101 0111 | 0 | 010 1111 |
2进制 | 1000 0000 | 1100 0010 | 1101 0111 | 0010 1111 | ||||
16进制 | 0x80 | 0xC2 | 0xD7 | 0x2F |
2.3 可变报头
某些 MQTT 控制报文包含一个可变报头部分。它在固定报头和负载之间。
可变报头的内容根据报文类型的不同而不同。
可变报头的报文标识符(Packet Identifier)字段存在于多个类型的报文里。
2.4 有效载荷
某些MQTT控制报文在报文的最后部分包含一个有效载荷。对于PUBLISH来说有效载荷就是应用消息。
MQTT 控制报文类型、功能及格式(报文结构) - 第2章相关推荐
- ospf hello时间和dead_深入理解OSPF协议----第二讲:OSPF报文类型
各位小伙伴们:大家好,!今天让我们来继续一起聊聊OSPF协议:通过上一节的介绍,我们已经知道OSPF路由设备之间交流的是LSA(链路状态通告),并不是路由表:后续几节想给大家讲讲OSPF邻居之间是如何 ...
- xml格式报文的拼装,和解析成实体类
我们的微信支付,使用的是第三方的支付,某银行的微信支持渠道.所有的接口请求.应答都是xml格式报文,这样就需要用到xml格式报文的拼装和解析,这儿简单讲一下. 拼接xml格式报文. 从页面表单提交和配 ...
- MQTT——控制报文格式
了解控制报文格式是学习MQTT中,笔者认为最为重要的一个知识点.MQTT的所有行为都离不开他.控制报文可以分为三个部分组成,分别为:固定报头.可以变报头.有效载荷部分. 注意:上面的说的报文的类型.是 ...
- MQTT 控制报文 - PUBLISH发布消息,PUBACK,PUBREC,PUBREL,PUBCOMP - 第6章
目录 6.1 PUBLISH - 发布消息 6.1.1 固定报头 6.1.1.1 DUP重发标志 6.1.1.2 Qos服务质量等级 6.1.1.3 RETAIN保留标志 6.1.2 可变报头 6.1 ...
- ICMP协议 详解,ICMP协议的功能及实现原理,ICMP协议报文类型。
「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「专栏简介」:此文章已录入专栏<计算机网络零基础快速入门> ICM ...
- MQTT 控制报文 - SUBSCRIBE订阅报文,SUBACK,UNSUBSCRIBE,UNSUBACK - 第5章
目录 5.1 SUBSCRIBE - 订阅主题报文 5.1.1 固定报头 5.1.2 可变报头 5.1.3 有效载荷 5.2 SUBACK - 订阅确认 5.2.1 固定报头 5.2.2 可变报头 5 ...
- MQTT 控制报文 - PINGREQ心跳报文,PINGRESP - 第4章
目录 4.1 PINGREQ - 心跳请求 4.1.1 固定报头 4.2 PINGRESP - 心跳响应 4.2.1 固定报头 4.1 PINGREQ - 心跳请求 客户端发送PINGREQ报文给服务 ...
- HCNP——OSPF报文类型的五种格式
224.0.0.5:该组播IP地址意指所有的OSPF路由器. 224.0.0.6:该组播IP地址意指所有的OSPF DR路由器. OSPF一共定义了五种报文,各有各的用途. 类型 报文名称 报文描述 ...
- MQTT协议-报文分析及网络客户端报文测试(MQTT报文连接阿里云上传数据+订阅数据)
文章目录 一.本文章所涉及到的内容 二.感性认识MQTT协议 三.准备信息 (一)工具获取 (二)获取信息 1.获取三元组信息 2.获取发布topic和订阅topic 3.客户端ID,用户名,哈希加密 ...
最新文章
- C++中#ifndef XXX_H #difine XXX_H解析及dllexport、dllimport用法示例
- 学习java时的一些笔记(4)
- echarts legend颜色_echarts数据可视化图表(二):双柱状图
- eclipse中LogCat有时不显示信息的简单解决办法
- 3. 回归的线性模型(2)
- Python函数及相关知识
- win10弹不出密码输入框_电脑互访提示输入网络密码,怎么办?
- eclipse 与 tomcat 的那些路径
- ajax请求l类型,jquery 的ajax请求示例和注意事项
- 【渝粤教育】国家开放大学2018年秋季 7048-21T危急重症护理学(本) 参考试题
- 趣味CSS3(一)--旋转的大风车
- iOS开发-汤姆猫Tom(序列帧动画)附详细注释
- 瑞典皇工学院计算机,瑞典规模最大的理工院校,皇家理工学院
- localhost访问不了的解决方法
- 图像的高频和低频如何区分
- 【报名】RT-Thread师资培训,苏州大学王宜怀教授主讲!
- SSL集训 2021.07.16 提高B组 T1 下棋【博弈论】
- yolov5 的 detect 层 与 anchor 机制
- 通讯录姓氏多音字的问题解决
- 华为魔术2手机拆机图解_Honor Magic2拆解图形教程