1、整体结构
协议MQTT3.1.1中,所有的协议信息都来源于此,通过固定包头中不同的控制包类型进行扩展。根据不同的固定包头,安排不同的可变包头和载荷。
通俗的来说就是,所有的协议数据都采用这个结构,数据包的第一个字节确定这个包是什么类型(连接、连接确认、数据、订阅、心跳等),只是不同的包在可变包头和载荷部分有区别(如发送数据包时载荷里面就会包含发送的数据,但是心跳包就没有数据也就没有载荷部分)。
整体结构表
控制包 结构 | 固定包头 (所有控制包) | 控制包类型bit[7-4] | 1字节 |
控制包类型的特殊标识bit[3-0] | |||
剩余长度 | 最大4个字节 | ||
可变包头 (部分控制包) | 取决于包的类型 | 如连接时的连接协议名称 | |
载荷 (部分控制包) | 取决于包的类型 | 如发布消息时的消息的内容 |
(1)、固定包头中,控制包类型bit[7-4]
控制包类型bit[7-4]表
Name | Value | Direction of flow | Description |
Reserved | 0 | Forbidden | Reserved |
CONNECT | 1 | C2S | |
CONNACK | 2 | S2C | Connect acknowledgment |
PUBLISH | 3 | C2S or S2C | Publish message |
PUBACK | 4 | C2S or S2C | Publish acknowledgment |
PUBREC | 5 | C2S or S2C | Publish received (part 1) |
PUBREL | 6 | C2S or S2C | Publish release (part 2) |
PUBCOMP | 7 | C2S or S2C | Publish complete (part 3) |
SUBSCRIBE | 8 | C2S | Client subscribe request |
SUBACK | 9 | S2C | Subscribe acknowledgment |
UNSUBSCRIBE | 10 | C2S | Unsubscribe request |
UNSUBACK | 11 | S2C | Unsubscribe acknowledgment |
PINGREQ | 12 | C2S | PING request |
PINGRESP | 13 | S2C | PING response |
DISCONNECT | 14 | C2S | Client is disconnecting |
Reserved | 15 | Forbidden | Reserved |
说明:S-server,C-client
(2)、固定包头中,控制包类型的特殊标识bit[3-0]
特殊标识bit[3-0]表
Control Package | Fixed header flags | Bit3 | Bit2 | Bit1 | Bit0 |
CONNECT | Reserved | 0 | 0 | 0 | 0 |
CONNACK | Reserved | 0 | 0 | 0 | 0 |
PUBLISH | Used in MQTT3.1.1 | DUP1 | QoS2 | Qo2 | 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 |
说明:DUP2 = 重复发送PUBLISH控制包 QoS2 = PUBLISH质量服务 RETAIN3 = PUBLISH保留标识。