MQTT协议总结报文基础结构报文组成是否可选固定报文头固定存在可变报文头可选有效荷载可选固定报文头每个MQTT报文都包含固定报文头固定报文头字节索引高低位作用报文类型1高命令的种类共16种0~15标志位1低命令的具体行为特征长度2-5全可变高8位为0时不往下读取可变头包含每个报文的上下文信息每个报文类型的可变头内容和长度都不同后面在介绍报文的时候一起总结荷载用于传递报文真正的业务数据同样每个报文类型的荷载数据各不相同后面在介绍报文的时候一起总结QoSQos 分为 3个等级 0、1、20等级生产者发送数据后无需接收响应无重传机制1等级生产者发送数据后需要一次响应有重传机制2等级生产者发送数据后需要交互两次有重传机制报文类型整理链接与断开标志位序号16进制序号命令名称方向作用10x1CONNECT客户端-服务器发起TCP连接后的第一个报文携带ClientID、账号密码、心跳时间20x2CONNACK服务端-客户端服务端对CONNECT的回应告诉你“连上了”或“密码错误”140xEDISCONNECT双向优雅地断开连接通知Broker“我要下线了别等我心跳了CONNECT真实报文10 1D 00 04 4D 51 54 54 04 C2 00 3C 00 04 74 65 73 74 00 05 61 64 6D 69 6E 00 04 70 61 73 73字段名称字节范围内容所属部分作用报文类型标志位110固定头CONNECT长度21D固定头剩余长度 29协议名3-800 04 4D 51 54 54可变头两字节长度 4字节“MQTT”固定标识协议级别904可变头用的是3.1.1 (0x04) 还是5.0 (0x05)连接标识10C2可变头可变头控制是否带密码、是否清理会话、是否有遗嘱保活时间11-1200 3C可变头超过多少秒没发数据可以踢ClinetID13-1800 04 74 65 73 74有效荷载2字节长度 ID这里是test用户名19-2500 05 61 64 6D 69 6E有效荷载2字节长度 用户名这里是admin密码26-3000 04 70 61 73 73有效荷载2字节长度 密码这里是pass连接标识的意义0xC211 00 001 0││││ │││└─ Bit 0: Reserved 0││││ ││└── Bit 1: Clean Session 1 → 清理会话││││ │└─── Bit 2: Will Flag 0 → 无遗嘱││││ └──── Bit 3: Will QoS bit0 0 ┐│││└────── Bit 4: Will QoS bit1 0 ┘ → QoS 0││└─────── Bit 5: Will Retain 0 → 无效│└──────── Bit 6: Password Flag 1 → 有密码└───────── Bit 7: User Name Flag 1 → 有用户名CONNACK 真实报文20 02 01 00字段名称字节范围内容所属部分作用报文类型标志位120固定头CONNACK长度202固定头剩余长度 2连接标识301可变头连接返回码连接返回码400可变头连接返回码如下0x00 连接已接受0x01 拒绝不支持的协议版本0x02 拒绝无效的客户端标识符0x03 拒绝服务端不可用0x04 拒绝用户名或密码错误0x05 拒绝未授权Session Present位只有 Clean Session 0不清理会话时这个位才有意义。如果 Clean Session 1服务端必须将此位置 0。DISCONNECT 真实报文E0 00字段名称字节范围内容所属部分作用报文类型标志位1E0固定头DISCONNECT长度200固定头剩余长度 0消息发布流转标志位序号16进制序号命令名称方向作用30x30PUBLISH双向真正的消息载体。生产者发它给BrokerBroker也发它给消费者40x40PUBACK双向QoS 1专用。接收方说我已收到这条消息QoS 1不用重发了50x50PUBREC双向QoS 2专用第1步。接收方说我收到你的QoS 2消息了60x60PUBREL双向QoS 2专用第2步。发送方说好的那你把这条消息释放给消费者吧70x60PUBCOMP双向QoS 2专用第3步。接收方说我已经处理完了这事彻底了结PUBLISH 真实报文生产者向代理发送数据、代理发向消费者3A 11 00 0B 73 65 6E 73 6F 72 2F 74 65 6D 70 00 01 32 35 2E 36字段名称字节范围内容所属部分作用报文类型1高4位0x3固定头PUBLISH标志位1低4位0xA固定头DUP 重发标识、QoS bit1、QoS bit0、Retain保留标志长度211固定头长度 17主题长度3-400 0B可变头主题名长度 11字节主题名5-1573 65 6E 73 6F 72 2F 74 65 6D 70可变头sensor/temp报文标识符16-1700 01Packet ID (QoS0时必须)数据内容18-2132 35 2E 36有效荷载生产者发送的数据 26.5PUBACK 真实报文代理回复生产者、消费者回复代理只有QoS 1 需要 PUBACK40 02 00 01字段名称字节范围内容所属部分作用报文类型标志位10x40固定头PUBACK长度20x02固定头长度2字节报文标识符3-42可变头Packet ID (QoS0时必须)PUBREC 真实报文只有QoS 2 需要 PUBREC50 02 00 01字段名称字节范围内容所属部分作用报文类型标志位10x50固定头PUBREC长度20x02固定头长度2字节报文标识符3-42可变头Packet ID (QoS·1时必须)PUBREL 真实报文只有QoS 2 需要 PUBREL62 02 00 01字段名称字节范围内容所属部分作用报文类型标志位10x62 固定头PUBREL长度20x02固定头长度2字节报文标识符3-42可变头Packet ID (QoS·1时必须)PUBCOMP 真实报文只有QoS 2 需要 PUBCOMP70 02 00 01字段名称字节范围内容所属部分作用报文类型标志位10x70 固定头PUBCOMP长度20x02固定头长度2字节报文标识符3-42可变头Packet ID (QoS·1时必须)订阅与取消订阅标志位序号16进制序号命令名称方向作用80x8SUBSCRIBE客户端-服务端客户端发起订阅请求90x9SUBACK服务端-客户端服务端回应订阅100xAUNSUBSCRIBE客户端-服务端客户端发起取消订阅110xBUNSUBACK服务端-客户端服务端回应取消SUBSCRIBE 真实报文82 17 00 01 00 0B 73 65 6E 73 6F 72 2F 74 65 6D 70 01 00 05 63 6D 64 2F 23 00字段名称字节范围内容所属部分作用报文类型 标志位10x82固定头SUBSCRIBE长度20x17固定头剩余长度 23包ID3-400 01可变头Packet ID 1主题1长度5-600 0B有效荷载主题长度 11主题1名7-1773 65 6E 73 6F 72 2F 74 65 6D 70有效荷载“sensor/temp”主题1的QoS等级1801有效荷载主题1的QoS等级 1主题2长度19-2000 05有效荷载主题2的长度主题2名21-2563 6D 64 2F 23有效荷载主题2名称 cmd/#主题2QoS等级2600有效荷载主题2的QoS等级 0SUBACK真实报文90 04 00 01 01 00字段名称字节范围内容所属部分作用报文类型 标志位10x90固定头SUBACK长度 20x4固定头剩余长度 4长度20x17固定头剩余长度 23包ID3-400 01可变头Packet ID 1主题1返回501有效荷载主题1返回码QoS 1 授予主题2返回600有效荷载主题1返回码QoS 2 授予其中主题返回有4种情况值含义0x00QoS 0 成功0x01QoS 1 成功0x02QoS 2 成功0x80失败被拒绝UNSUBSCRIBE 真实报文A2 0E 00 02 00 0B 73 65 6E 73 6F 72 2F 74 65 6D 70字段名称字节范围内容所属部分作用报文类型标志位10xA2固定头UNSUBSCRIBE长度20x0E固定头剩余长度 14包ID3-400 02可变头Packet ID 2主题1长度5-600 0B有效荷载主题长度 11主题1名7-1773 65 6E 73 6F 72 2F 74 65 6D 70有效荷载“sensor/temp”UNSUBACK 真实报文B0 02 00 02字段名称字节范围内容所属部分作用报文类型 标志位10xB0固定头UNSUBACK长度20x02固定头剩余长度 2包ID3-400 02可变头Packet ID 2心跳保活PINGREQ 真实报文客户端-服务端C0 00字段名称字节范围内容所属部分作用报文类型 标志位10xC0固定头PINGREQ长度20x00固定头剩余长度 0PINGRESP 服务端-客户端D0 00字段名称字节范围内容所属部分作用报文类型 标志位10xD0固定头PINGRESP长度20x00固定头剩余长度 0