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

相关推荐
CHHC18807 天前
mqtt网关数据接入rabbitmq,缓存离线数据,实现消息保留
mqtt·网关·rabbitmq·消息保存
Crazy Struggle8 天前
.NET 开源高性能 MQTT 类库
mqtt·网络协议·.net·mqttnet·物联网平台
听我一言10 天前
ESP32-WROOM-32 [创建AP站点-TCP服务端-数据收发]
esp32
听我一言12 天前
ESP32-WROOM-32 [ESP连接路由器+TCP Client 透传 + TCP Server数据发送]
网络·网络协议·tcp/ip·esp32
听我一言13 天前
ESP32-WROOM-32 [创建AP站点-客户端-TCP透传]
网络·网络协议·tcp/ip·esp32
康de哥14 天前
使用SonarQube扫描ESP32项目,如何生成build-wrapper-dump.json
esp32·sonarqube·idf·build-wrapper
启明云端wireless-tag15 天前
ESP32无线WiFi蓝牙SOC,设备物联网通信方案,启明云端乐鑫代理商
嵌入式硬件·物联网·wifi·esp32·乐鑫·wifi模组
EMQX16 天前
提高数据集成稳定性:EMQX Platform 端到端规则调试指南
mqtt·emqx
霸道流氓气质17 天前
CentOS上使用Mosquitto实现Mqtt主题消息发布和订阅mqtt主题消息连同时间戳记录到文件
linux·运维·mqtt·centos·mosquitto
只是个~小不点20 天前
Qt与MQTT交互通信
mqtt