接前一篇文章:ESP32-C3模组上跑通MQTT(3)
本文内容参考:
《ESP32-C3 物联网工程开发实战》
特此致谢!
上一回讲到了MQTT的消息格式,讲解了MQTT控制报文中的固定头中的控制报文的类型、消息质量等级和标志位。本回继续讲解MQTT消息格式的更多内容。
四、MQTT消息格式
在MQTT协议中,MQTT控制报文 由固定头(Fixed Header) 、可变头(Variable Header) 和消息体(Payload)三部分组成。
1. 固定头
固定头存在于所有MQTT控制报文中。MQTT控制报文固定头说明见下表:
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
第1个字节 | 控制报文的类型 | 用于指定控制报文的标志位 | ||||||
第2个字节 | 剩余长度 |
(1)控制报文的类型
(2)消息质量等级
(3)标志位
(4)剩余长度
第2个及以后的字节表示剩余长度,表示当前控制报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度字段使用一个可变长度的编码方案,对小于128的值使用单字节编码。更大的值按以下方式处理:低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节。因此,每个字节可以编码128个数值和一个延续位。剩余长度字段最大为4B(4个字节)。剩余长度字节数如下表所示:
字节 | 最小值 | 最大值 |
---|---|---|
1 | 0(0x00) | 127(0x7F) |
2 | 128(0x80 0x01) | 16383(0xFF 0x7F) |
3 | 16384(0x80 0x80 0x01) | 2097151(0xFF 0xFF 0x7F) |
4 | 2097152(0x80 0x80 0x80 0x01) | 268435455(0xFF 0xFF 0xFF 0x7F) |
2. 可变头
某些MQTT控制报文包含一个可变报头部分,它在固定包头和负载之间,可变报头的内容根据控制报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于多种类型的控制报文中,如PUBLISH(QoS>0时)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK。
3. 有效载荷
消息体位于MQTT数据报的第三部分,包含了CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE、PUBLISH五种类型的消息。
1)CONNECT
消息体内容主要是客户端的ClientID、订阅的Topic、Message以及用户名和密码。
2)SUBSCRIBE
消息体内容是一系列要订阅的主题以及QoS。
3)SUBACK
消息体内容是服务器对于SUBSCRIBE所申请的主题以及QoS进行的确认和回复。
4)UNSUBSCRIBE
消息体内容是要取消订阅的主题。
5)PUBLISH
消息体内容是发布的应用消息,可以是零长度的。
五、协议对比
TCP、UDP、HTTP和CoAP等协议除了用于本地控制,还能用于远程控制。那么MQTT与这些协议相比,区别和联系如何呢?
1. MQTT协议与TCP协议的对比
MQTT协议是基于TCP协议的应用协议,两者都可以进行远程数据通信。对于套接字,TCP协议需要用户自行开发上层的应用协议,自行开发的应用协议使用场景很有限,不适合当下物联网万物互联的大环境。而MQTT是一个标准的物联网轻量级协议,目前大部分的云服务器,如阿里云、亚马逊云都使用MQTT协议,有利于产品的对接。
2. MQTT协议与HTTP协议的对比
HTTP协议和MQTT协议一样,采用的都是客户端/服务器端模型,都是基于TCP协议的应用协议。但HTTP协议报文开销比MQTT协议大很多 ,而且HTTP协议一般很难实现服务器向客户端主动推送数据,无法满足物联网远程控制的需求。如果设备只是单纯地上报数据,则可以使用HTTP协议。
3. MQTT协议与CoAP协议的对比
CoAP协议与HTTP协议类似,模仿HTTP协议的REST模型,服务器端以URI方式创建资源,客户端可以通过GET、PUT、POST、DELETE方法访问这些资源,并且协议风格也和HTTP协议极为相似,它比HTTP协议需要更少的设备资源与网路开销,非常适合物联网协议,但CoAP协议不适合远程控制。如果智能手机发送控制命令进行远程控制,则CoAP协议可能需要CoAP+Web+DataBase+App的架构。使用CoAP协议时,控制命令必须经过DataBase才能转给设备,因为CoAP协议是无连接的,智能手机发送控制命令时,服务器会先将控制命令存储到DataBase,设备会通过GET方法请求服务器端是否有控制命令,然后选择是否需要操作设备。而MQTT协议是面向连接的,服务器端会将智能手机发送的控制命令转发给每个订阅的设备,存储控制命令不是必需的,只需要MQTT客户端+MQTT服务器+App就能实现,在部署方面MQTT协议更具优势。
至此,MQTT理论基础部分的内容就讲完了,下一回结合官方例程进行代码分析及实际操作。