ESP32-C3模组上跑通MQTT(4)

接前一篇文章: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理论基础部分的内容就讲完了,下一回结合官方例程进行代码分析及实际操作。

相关推荐
不懂的浪漫16 小时前
mqtt-plus 架构解析(四):MqttMessageInterceptor 的扩展点设计
java·spring boot·物联网·mqtt
EMQX18 小时前
Everything Will Flow:面向 AI 的新一代融合消息流平台 FlowMQ 正式发布
物联网·mqtt·智能硬件·flowmq
不懂的浪漫19 小时前
mqtt-plus 架构解析(五):错误处理与 ErrorAction 聚合策略
java·spring boot·后端·物联网·mqtt·架构
不懂的浪漫19 小时前
mqtt-plus 架构解析(三):Payload 序列化与反序列化,为什么要拆成两条链
java·spring boot·物联网·mqtt·架构
deepwater_zone1 天前
ESP32芯片对比
esp32
星野云联AIoT技术洞察2 天前
OPC UA、MQTT、Modbus 应该如何分层:工业 IoT 接入架构新思路
mqtt·modbus·opc ua·边缘网关·设备接入·协议分层·工业iot
EMQX2 天前
S3 正在吞噬一切:AI 时代的基础软件架构革命
人工智能·物联网·mqtt·flowmq
不懂的浪漫2 天前
mqtt-plus 架构解析(一):分层架构与设计哲学
spring boot·分布式·物联网·mqtt·架构
Z文的博客2 天前
嵌入式 ARM 设备交叉编译 mosquitto 2.0.20 (完整 TLS 支持) 详细教程 TRAE全程辅助,没敲一行代码
qt·mqtt·嵌入式·ai编程·mosquitto·嵌入式linux·trae
乐鑫科技 Espressif4 天前
使用 MCP 服务器,把乐鑫文档接入 AI 工作流
人工智能·ai·esp32·乐鑫科技