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

相关推荐
优信电子4 天前
ESP8266_ESP32 Smartconfig一键配网功能
esp32·esp8266·smartconfig·无线配网
ling9134 天前
微信小程序通过mqtt控制esp32
mqtt·微信小程序·小程序·esp32·巴法云
OSnotes7 天前
ESP-IDF教程2 GPIO - 输入、输出和中断
esp-idf
Freddy_Ssc8 天前
ESP32之阿里云IoT物模型通信(MQTT-TLS连接通信),基于VSCode环境下的ESP-IDF开发(附源码)
vscode·物联网·阿里云·esp32·物模型
OSnotes8 天前
ESP-IDF教程1 开发环境
esp-idf
宁子希9 天前
如何将 ESP32 快速接入高德、心知、和风天气API 获取天气信息
android·单片机·嵌入式硬件·esp32
mingupup9 天前
ESP32+Arduino入门(三):连接WIFI获取当前时间
esp32·arduino
政安晨10 天前
【嵌入式人工智能产品开发实战】(二十)—— 政安晨:小智AI嵌入式终端代码解读:【C】关于项目中的MQTT+UDP核心通信交互理解
网络·c++·mqtt·网络协议·udp·小智ai·实时打断
Mr_Chenph13 天前
为啥物联网用MQTT?
物联网·mqtt·http·报文字节对比
牛奶咖啡1313 天前
MQTT的构成、使用场景、工作原理介绍
mqtt·mqtt是什么·mqtt使用场景·mqtt的组成·mqtt工作原理·mqtt的安全认证·mqtt的数据存储