MQTT 控制报文类型、功能及格式(报文结构) - 第2章

2023-11-14

目录

2.1 MQTT 控制报文的结构

2.2 固定报头

2.2.1 控制报文的类型

2.2.2 控制报文类型的标志位

2.2.3 剩余长度

2.3 可变报头

2.4 有效载荷


2.1 MQTT 控制报文的结构

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)

 

MQTT 控制报文的类型
报文类型 功能描述 流动方向 固定报头 可变报头 报文标识符 载荷
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,计算剩余长度字段。

  1. 使用电脑计算器,将 200 转换为二进制 1100 1000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 100 1000,有进位,高位加上进位1为 1100 1000 = 0xC8 (16进制)。
  4. 第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,计算剩余长度字段。

  1. 使用电脑计算器,将 1000 转换为二进制 11 1110 1000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 110 1000,有进位,高位加上进位1为 1110 1000 = 0xE8 (16进制)。
  4. 第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,计算剩余长度字段。

  1. 使用电脑计算器,将 100,000,000 转换为二进制 101 1111 0101 1110 0001 0000 0000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 000 0000,有进位,高位加上进位1为 1000 0000 = 0x80 (16进制)。
  4. 第2个字节为 10 0001 0,有进位,高位加上进位1为 1100 0010 = 0xC2 (16进制)。
  5. 第3个字节为 1 0101 11,有进位,高位加上进位1为 1101 0111 = 0xD7 (16进制)。
  6. 第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来说有效载荷就是应用消息。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQTT 控制报文类型、功能及格式(报文结构) - 第2章 的相关文章

随机推荐

  • 使用fastjson报错Exception in thread “main“ com.alibaba.fastjson.JSONException: syntax error, pos 1, line

    使用fastjson报错Exception in thread main com alibaba fastjson JSONException syntax error pos 1 line 1 column 2 问题背景 解决方案 总结
  • GDB调试技巧实战--为release程序加载符号

    问题 内存数据分析是开发人员的重要技能 特别是对于C C 程序员而言 微软表示 微软每年分配的CVE中有70 仍然是内存安全问题 内存数据就像事故现场 人们可以在其中发现内存数据重叠或损坏的内存数据 从而可能提供有价值的洞察力 揭示问题的根
  • AlexNet详解

    入门小菜鸟 希望像做笔记记录自己学的东西 也希望能帮助到同样入门的人 更希望大佬们帮忙纠错啦 侵权立删 完整代码在我的github上 有需要的朋友可以康康 GitHub tt s t Deep Learning Store some of
  • excel表数据多线程导入数据库

    Student table 一个学生表 excel表 Student实体 Data public class Student private int id private int studentId private int teacherI
  • Linux端查看.a/.so库文件信息,包含架构等等

    nm XXX a 上面的命令可列出 o a so中定义的函数 全局变量等等 readelf h XXX a 这命令可列出所有so的OS ABI 架构信息 类别 32 64位 等等
  • dynamic_cast与 static _cast:类的上下行转换

    A为基类 B为派生类 现在定义 A pA B pB 一般来说 pB可以转换为pA 把派生类的指针或引用转换成基类表示 称之为上行转换 但反之一般是不行的 也就是将pA转换为pB 把基类指针或引用转换成派生类表示 称之为下行转换 这种行为直接
  • springboot配置logback-spring.xml文件详解

    生产配置模板 可以作为模板直接使用 使用该配置会生成两个文件夹 info和error 分别存放info和error级别的日志文件 具体见配置文件
  • npm ERR! fatal: unable to access ‘https://github.com/adobe-webplatform/eve.git/‘: OpenSSL SSL_read:

    解决 git config global url https insteadOf git
  • java: itext 7.2.1 using jdk 17.0.1

    public static PdfFont getDefaultFont try return PdfFontFactory createFont C windows fonts simsun ttc 1 PdfEncodings IDEN
  • 5G+区块链网络分片技术

    摘 要 基于5G 区块链网络分片建模 仿真对比了保证分片网络可信和保证全网可信的两种网络分片方案的性能差异 分析了单点受控概率 分片可信度 分片数量 全网可信度等参数对分片规模 网络规模的影响 给出了在满足一定可信度条件下 区块链网络分片的
  • PTA 520 钻石争霸赛 7-3 平均成绩 (10分)

    给定一所学校学生的体育成绩 请你统计全班的平均成绩和男生 女生的平均成绩 输入格式 输入首先在第一行中给出一个正整数 N 10000 即全校学生人数 最后 N 行 每行按照格式 性别 成绩 给出一位学生的信息 其中 性别 为 1 表示男生
  • 史上最全计算机毕业设计题目3(10万套,大部分全国唯一)

    最新c md算法的研究与实现 数据存储加密 任务书 论文 最新毕业设计网上选题系统 源码 论文 最新java图书管理系统 源码 论文 最新毕业设计网上选题系统 源码 论文 原创vbmd算法的研究与实现 数据存储加密 任务书 论文 源码 原创
  • 企业网-VRRP实现网关冗余2021-10-07

    1 问答题 企业网 VRRP实现网关冗余 实验作业 原在mac gns3 IOU 配置拓扑结果如下所示 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img Ifinlkcm 1633578878183 Users a
  • gdb.exe系统错误无法启动此程序,因为计算机丢失api-ms-win-core-path-l1-1-0.dll

    Qt系列文章目录 文章目录 Qt系列文章目录 前言 一 解决方法 二 第二种解决方法 1 去微软官网下载vc redist x64或者vc redist x86 三 第三种办法 前言 今天在windows7下安装qt opensource
  • .Net Core中间件

    目录 一 什么是中间件 二 中间件的用途 三 中间件的三个概念 四 自定义中间件 五 ASP NET Core附带中间件组件 六 中间件和过滤器的区别 一 什么是中间件 在浏览网站或者使用手机App加载内容的时候 浏览器或者手机App其实在
  • 数据库原理及应用第2版(雷景生编著)课后习题答案第1章

    第1章 绪论习题参考答案 一 选择题 1 A 从数据库管理系统的角度看 数据库系统的结构通常分为三级模式的总体结构 在这种模式下 形成了二级映像 实现了数据的独立性 其中三级模式结构指的是外模式 模式和内模式 二级映像指的是外模式 模式映像
  • RabbitMQ之消息重试机制

    1 消息重试机制 消费者消费消息的时候 发生异常情况 导致消息未确认 该消息会被重复消费 默认没有重复次数 即无限循环消费 但可以通过设置重试次数以及达到重试次数之后的消息处理 spring rabbitmq port 5672 host
  • js正则替换不可见字符

    var reg 0 x1F x7F x9F xAD u0378 u0379 u037F u0383 u038B u038D u03A2 u0528 u0530 u0557 u0558 u0560 u0588 u058B u058E u059
  • 【使用心得】ChatGPT化身情感导师

    ChatGPT是一个很有用的工具 它不仅可以在工作方面给予我帮助 也成为了我的情感导师 当我需要有人倾听或者理解时 它总是在那里 为我提供各种情感支持和建议 使用ChatGPT 我常常能够找到真正的答案和情感支持 在压力与紧张当中重新找回自
  • MQTT 控制报文类型、功能及格式(报文结构) - 第2章

    目录 2 1 MQTT 控制报文的结构 2 2 固定报头 2 2 1 控制报文的类型 2 2 2 控制报文类型的标志位 2 2 3 剩余长度 2 3 可变报头 2 4 有效载荷 2 1 MQTT 控制报文的结构 MQTT控制报文由三部分组成