MQTT 协议以已定义方式交换一系列MQTT 控制分组工作,MQTT 控制分组最多由三部分组成:固定首部、可变首部、有效载荷。并且始终按如图15-5所示顺序排列。
图15-5 MQTT控制分组结构
每个MQTT 分组都有固定首部,如图15-6 所示,其中第一个字节的7~4位是一个4 位的无符号值,该值取值范围是0~15,表示MQTT 控制分组的类型,如该值为3 时,表示该分组是发送消息的分组PUBLISH,当该值为8 时,表示该分组时客户订阅请求分组SUBSCRIBE。第一个字节剩余的3~0位表示对每个MQTT控制分组类型的特定标记。
图15-6 MQTT控制分组固定首部
MQTT分组固定首部中,剩余长度是当前分组中剩余的字节数,包括可变首部和有效负载中的数据,剩余长度不包括用于编码“剩余长度”字段的字节。剩余长度使用可变长度编码方案进行编码,该方案使用单个字节表示最大127 位的值, 更大值需采用一定的算法处理,感兴趣的读者可参看MQTT协议标准文件。
每个字节的最低有效7 位对数据进行编码,最高有效位用于表示有后续字节,因此,每个字节编码128 位值和一个“连续位”,剩余长度字段中最大字节数为4。
(www.xing528.com)
图15-7 分组标识符字节
一些类型的MQTT 控制分组包含可变首部组件,它位于固定首部和有效载荷之间,可变首部的内容根据分组类型而有所不同。在几种类型分组中,可变分组首部的分组标识符字段是通用的,如图15-7 所示。许多控制分组类型的可变首部组件包括2 字节分组标识符字段,这些控制分组包括PUBLISH(其中QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、
SUBACK、UNSUBSCRIBE、UNSUBACK。
SUBSCRIBE、UNSUBSCRIBE 和PUBLISH(在QoS > 0 的情况下)控制分组必须包含非零的16 位分组标识符。每次客户端发送这些类型之一的新分组时,它必须为其分配当前未使用的分组标识符。如果客户端重新发送特定的控制分组,那么它必须在后续重新发送该分组时使用相同的分组标识符。客户端处理完相应的确认分组后,分组标识符可以重用。QoS 1 PUBLISH表示相应的控制分组PUBACK,QoS 2 表示分组PUBCOMP。对于SUBSCRIBE 或UNSUBSCRIBE 与SUBACK 或UNSUBACK 相对应,当服务器发送QoS > 0 的PUBLISH时,相同的条件适用于服务器。
如果其QoS 值设置为0,则PUBLISH 分组不得包含分组标识符。PUBACK、PUBREC或PUBREL分组必须包含与最初发送的PUBLISH分组相同的分组标识符,类似地,SUBACK 和UNSUBACK 必须包含分别在相应的SUBSCRIBE和UNSUBSCRIBE分组中使用的分组标识符。
客户端和服务器彼此独立地分配分组标识符,因此,客户-服务器对可以使用相同的分组标识符参与并发消息交换。客户端可以发送带有分组标识符0x1234 的PUBLISH 分组,然后在收到其发送的PUBLISH 的PUBACK 之前,从其服务器接收带有分组标识符位0x1234的不同PUBLISH。
一些MQTT 控制分组包含有效载荷作为分组的最后部分,在PUBLISH 分组中有效载荷是应用程序消息。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。