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

相关推荐
启明云端wireless-tag19 小时前
乐鑫ESP32物联网方案,设备人机交互技术应用,启明云端乐鑫代理商
物联网·esp32·无线通信·乐鑫
唐诺20 小时前
android MQTT使用示例
android·mqtt
skywalk81633 天前
esp32c3开发板通过micropython的mqtt库连MQTT物联网消息服务器
单片机·物联网·mqtt·esp32·micropython
scoone3 天前
利用MQTT和SSL/TLS实现数据加密
开发语言·mqtt
橘色的喵10 天前
工业通信协议对比:OPC-UA、Modbus、MQTT、HTTP
mqtt·网络协议·http·modbus·opc-ua·工业协议
flashier12 天前
ESP32学习笔记_FreeRTOS(1)——Task的创建和使用
c语言·开发语言·笔记·学习·esp32
氦客13 天前
MQTT协议解析 : 物联网领域的最佳选择
物联网·mqtt·协议·解析·发布订阅模式·iot·broker
T0uken13 天前
【ESP32+MicroPython】硬件控制基础
python·单片机·嵌入式硬件·esp32
极客小张15 天前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
田三番16 天前
使用 vscode 简单配置 ESP32 连接 Wi-Fi 每日定时发送 HTTP 和 HTTPS 请求
单片机·物联网·http·https·嵌入式·esp32·sntp