【MQTT学习笔记四】MQTT报文结构

 MQTT是一个二进制的协议,采用的是命令和命令确认的方式。其中,topic name,client id,user name和password是utf-8的字符串。有效载荷(payload)是二进制,格式和内容根据应用本身来指定。

  协议包含固定报头,可变报头和有效载荷三部分内容。其中,固定报头是必须的。

【MQTT学习笔记四】MQTT报文结构_第1张图片

 

  固定报头

包含两部分。第一部分又分为报文类型和控制标志。高位4个bit表示报文类型,比如是CONNECT/PUBLISH等。低位4个bit大部分都作为预留,只有publish报文会用到。结构如下:

【MQTT学习笔记四】MQTT报文结构_第2张图片

 

1)报文类型

比如CONNECT,报文的第一个字节的高4bit就是0001,PUBLISH是0011

 

 

【MQTT学习笔记四】MQTT报文结构_第3张图片

2)控制标志

大部分控制标志都是预留位,需要按照规则填写值(大部分是0000)。其中,PUBLISH报文的控制标志在MQTT3.1.1以上版本中使用,每一个bit代表意义如下:

【MQTT学习笔记四】MQTT报文结构_第4张图片 

3)固定报头

1)和2)占了固定报头的第一个字节,固定报头的第二部分是剩余长度。表示后面可变报头和有效载荷的总长度。这部分占用字节数为1~4,每个字节的低7bit用来表示数量,第7bit用来表示后面是否还有长度字节。几个例子:

1)长度为64,0100 0000 只需要一个字节即可表示,所以剩余长度为0x40

2)长度为321,1100 0001 0000 0010 需要2个字节表示,所以剩余长度为0xc1 0x02

  可变报头

某些需要传递额外信息的报文才需要。其中PINGREQ,PINGRESP和DISCONNECT没有可变报头。其他可变报头格式和内容见后面文章。

有效载荷(payload)

需要传递具体的信息时才需要payload。其中CONNACK, PUBACK,PUBREC,PUBREL,PUBCOMP,SUBACK,UNSUBACK,PINGREQ,PINGRESP,DISCONNECT没有payload。

你可能感兴趣的:(MQTT)