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

news2024/11/29 4:53:19

接前一篇文章:ESP32-C3模组上跑通MQTT(2)

本文内容参考:

《ESP32-C3 物联网工程开发实战》

MQTT协议及使用_mqtt endpoint-CSDN博客

你不得不看的图文并茂的MQTT协议通信过程!!!_mqtt流程图-CSDN博客

车联网平台消息传输质量保障|车联网平台搭建从入门到精通 04|qos|通信|可靠性_网易订阅

特此致谢!

上一回对于MQTT协议及其原理作了介绍和讲解,本回继续对于MQTT进行深入讲解。

四、MQTT消息格式

在MQTT协议中,MQTT控制报文固定头(Fixed Header)可变头(Variable Header)消息体(Payload)三部分组成。

1. 固定头

固定头存在于所有MQTT控制报文中。MQTT控制报文固定头说明见下表:

Bit76543210
第1个字节控制报文的类型用于指定控制报文的标志位
第2个字节剩余长度

(1)控制报文的类型

MQTT控制报文的类型占4 bits,一共有14种类型,如下表所示:

名字报文流动方向描述
Reserved0禁止保留
CONNECT1客户端到服务器端客户端请求连接服务器端
CONNACK2服务器端到客户端连接报文确认
PUBLISH3两个方向都允许发布消息
PUBACK4两个方向都允许QoS 1消息发布收到确认
PUBREC5两个方向都允许发布收到(保证交付第一步)
PUBREL6两个方向都允许发布释放(保证交付第二步)
PUBCOMP7两个方向都允许QoS 2消息发布完成(保证交互第三步)
SUBSCRIBE8客户端到服务器端客户端订阅请求
SUBACK9服务器到客户端订阅请求报文确认
UNSUBSCRIBE10客户端到服务器端客户端取消订阅请求
UNSUBACK11服务器端到客户端取消订阅报文确认
PINGREQ12客户端到服务器端心跳请求
PINGRESP13服务器端到客户端心跳响应
DISCONNET14客户端到服务器端客户端断开连接

(2)消息质量等级

MQTT消息质量有三个等级,即QoS 0、QoS 1和QoS 2。

1)QoS 0

最多分发一次。消息的传输完全依赖底层的TCP/IP网络,MQTT协议里没有定义应答和重试,消息要么只会到达服务器端一次,要么根本没有到达。

如果当时客户端不可用,则会丢失该消息。Sender(可能是Publisher或者Broker)发送一条消息之后,就不再关心它有没有发送到对方,也不设置任何重发机制。

MQTT QoS 0的流程如下图所示:

2)QoS 1

至少分发一次。服务器的消息接收由PUBACK消息进行确认,如果通信链路或发送设备异常、或者在指定时间内没有收到确认消息,则发送端会重发这条报文,并且在MQTT控制报文固定头中设置重发标志位(DUP)。

发布者在每次发送新的应用消息都必须分配一个未使用的报文标识符,在发布消息的同时将消息存储起来,等待服务器的应答,直到从接收者那收到对应的PUBACK报文。发送的PUBLISH报文必须包含报文标识符且QoS等于1,DUP等于0。一旦发布者收到来自服务器的PUBACK报文后,这个报文标识符就可以重复使用。

接收者响应的PUBACK报文必须包含一个报文标识符,这个标识符来自接收到的PUBLISH报文。在发送了PUBACK报文之后,接收者必须将任何包含相同报文标识符的入站PUBLISH报文当作一个新的消息,并忽略它的DUP标志的值。

MQTT QoS 1的流程如下图所示:

3)QoS 2

只分发一次。这是最高级别的服务质量等级,消息丢失和重复都是不可接受的,使用此服务质量等级会有额外的开销。

QoS 2的消息可变报头中有报文标识符。

QoS 2的PUBLISH报文的接收者使用一个两步确认过程来确认收到。

发送者必须给要发送的新应用消息分配一个未使用的报文标识符。发送的PUBLISH报文必须包含报文标识符且报文的QoS等于2,DUP等于0。

在消息发出去后,需要将这个消息存储起来,而且必须将这个PUBLISH报文看作是未确认的,直到从接收者那收到对应的PUBREC报文。

当发布者收到的PUBREC报文后必须发送一个PUBREL报文。PUBREL报文必须包含与原始PUBLISH报文相同的报文标识符。而且发布者还必须必须将这个PUBREL报文看作是未确认的,直到从接收者那收到对应的PUBCOMP报文。一旦发送了对应的PUBREL报文就不能重发这个PUBLISH报文。

MQTT QoS 2的流程如下图所示:

QoS 2对应的分发消息也是比较复杂的,一般有两种处理方案,每一种方案都要确保消息有且只有处理一次。

  • 方案1

接收者(此处指服务器)响应的PUBREC报文必须包含报文标识符,这个标识符来自接收到的PUBLISH报文。

发送PUBREC报文后,在收到对应的PUBREL报文之前,接收者可以将消息分发给订阅者,但是必须要存储报文标识符;接收者也可以丢弃存储的报文标识符,而不必再分发应用消息给订阅者。

  • 方案2

当然,接收者(此处指服务器)在这种情况下,也可以存储消息,直到收到PUBREL报文才将消息分发到订阅者。

而当它收到PUBREL报文后,它必须发送PUBCOMP报文响应发布者,该报文必须包含与PUBREL报文相同的标识符。

如果此前没有分发应用消息给订阅者,那么此时需要分发应用消息给订阅者,然后丢弃消息。

在接收者发送PUBCOMP报文之后,接收者必须将包含相同报文标识符的任何后续PUBLISH报文当作一个新的发布。

(3)标志位

MQTT控制报文固定头的bit0~bit3为标志位,依照控制报文类型有不同的含义。事实上,除了PUBLISH类型,其它控制报文类型的标志位均为系统保留。在不使用标志位的消息类型中,标志位被作为保留位。如果收到无效的标志,接收端就必须关闭网络连接。

PUBLISH报文头Byte 1中bit0~bit3组成如下:

1)DUP(bit3)

重发标志位。如果DUP标志位被设置为0,则表示这是客户端或服务器端第一次请求发送PUBLISH报文;如果DUP标志被设置为1,则表示这可能是一个早前报文请求的重发。对于QoS 0的消息,DUP标志位必须设置为0。

2)QoS(bit2~bit1)

发布消息的服务质量等级,保证消息传输的次数。QoS值与bit2~bit1的关系如下表所示:

QoS值bit2bit1描述
000最多分发一次
101至少分发一次
210只分发一次
11保留

3)RETAIN(bit0)

保留标志位。如果客户端发给服务器端的PUBLISH报文的保留(RETAIN)标志位被设置为1,则服务器端必须存储这个报文和它的服务质量等级(QoS),以便它可以被分发给未来与主题名匹配的订阅者。在建立一个新的订阅时,对于每个匹配的主题名,如果存在最近保留的消息,则该消息必须被发送给这个订阅者。

RETAIN标志位通常用于遗嘱消息,例如在设备异常离线后,代理服务器会将遗嘱消息告知给智能手机,智能手机就会显示设备离线的状态。

MQTT消息格式的更多内容请看下回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1658995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux(centos)安装 MySQL 8 数据库(图文详细教程)

前言 前几天写了个window系统下安装Mysql的博客,收到很多小伙伴私信需要Linux下安装Mysql的教程,今天这边和大家分享一下,话不多说,看教程。 一、删除以前安装的MySQL服务 一般安装程序第一步都需要清除之前的安装痕迹&#xff…

EPAI手绘建模APP分析、灯光、相机

(13) 分析 标题 图 280 分析工具栏-1 标题 图 281 分析工具栏-2 ① 分析工具栏包括测量、信息、标注、注释、分析功能。 ② 测量顶点、角度、半径、直径、距离、长度、面积、体积。 标题 图 282 测量顶点 标题 图 283 测量角度 标题 图 284 测量半径 标题 图 285 测量直径 标…

LeNet-5上手敲代码

LeNet-5 LeNet-5由Yann LeCun在1998年提出,旨在解决手写数字识别问题,被认为是卷积神经网络的开创性工作之一。该网络是第一个被广泛应用于数字图像识别的神经网络之一,也是深度学习领域的里程碑之一。 LeNet-5的整体架构: 总体…

3分钟快速了解VR全景编辑器

说到VR全景,想必大多数人都见过那种可以360旋转拖动观看的图片。虽然这种技术已经不算新鲜,如果你以为这就是VR全景的全部,那就大错特错了! 上面看到的这种形式,只能算VR全景的第一层形态。现在的VR全景已经发展成为了…

vue+canvas实现根据数据展示不同高度,不同j渐变颜色的长方体效果

文章目录 不一样的长方体1. 实现效果预览2.实现思路2.1效果难点2.2 实现思路 3.实现3.1 测试数据编写3.2 编写canvas绘制函数 不一样的长方体 1. 实现效果预览 俗话说的好,没有实现不了的页面效果,只有禁锢的思想, 这不ui又给整了个新奇的页…

模型查询器在使用别名后不能使用tp6

在我们定义了模型的查询器时,再通过模型进行连表加别名的时候,使用查询器,查询器会没办法使用; 那我们可以将查询器前缀增加表名或者__TABLE__ 以上两种方式都可以,个人建议使用__TABLE__,因为这个查询器可…

单单单单单の刁队列

在数据结构的学习中,队列是一种常用的线性数据结构,它遵循先进先出(FIFO)的原则。而单调队列是队列的一种变体,它在特定条件下保证了队列中的元素具有某种单调性质,例如单调递增或单调递减。单调队列在处理…

Linux -- > vim

vi和vim是什么 vi和vim是两款流行的文本编辑器,广泛用于Unix和类Unix系统中。它们以其强大的功能和灵活的编辑能力而闻名,特别是在编程和系统管理中非常受欢迎。 vi(Visual Interface) vi是最初的文本编辑器之一,由…

AI赋能EasyCVR视频汇聚/视频监控平台加快医院安防体系数字化转型升级

近来,云南镇雄一医院发生持刀伤人事件持续发酵,目前已造成2人死亡21人受伤。此类事件在医院层出不穷,有的是因为医患纠纷、有的是因为打架斗殴。而且在每日大量流动的人口中,一些不法分子也将罪恶的手伸到了医院,实行扒…

不要错过!实景三维倾斜摄影在3D引擎的丝滑用法

在3D领域,倾斜摄影模型的应用是一个常见的瓶颈。工程建设、工业制造、科学分析、古建遗产,倾斜摄影是占主导地位的处理对象,但模型数据量大、精度要求高以及线上线下同步困难等,会导致生成的三维项目出现瑕疵。 所以在行业内&…

Electron学习笔记(二)

文章目录 相关笔记笔记说明 三、引入现代前端框架1、配置 webpack(1)安装 webpack 和 electron-webpack:(2)自定义入口页面 2、引入 Vue(1)安装 Vue CLI (2)调试配置 -- …

【解决】Android APK文件安装时 已包含数字签名相同APP问题

引言 在开发Android程序过程中,编译好的APK文件,安装至Android手机时,有时会报 包含数字签名相同的APP 然后无法安装的问题,这可能是之前安装过同签名的APP,但是如果不知道哪个是,无法有效卸载,…

KaiwuDB 参编的《分析型数据库技术要求》标准正式发布

近期,中国电子工业标准化技术协会正式发布团体标准《分析型数据库技术要求》(项目号:T-CESA 2023-006)。该标准由中国电子技术标准化研究院、KaiwuDB(上海沄熹科技有限公司) 等国内 16 家企业联合起草&…

婚恋程序_婚恋系统_交友程序_ 婚恋相亲交友系统-一站式搭建婚恋平台-社交婚恋系统-相亲交友APP小程序H5系统婚恋交友社交软件开发语音视频聊天平台定制开发

快速搭建线上平台 赋予十大线上盈利 快速精准牵线匹配 会员资料管理跟进 精美多样海报系统 红娘独立办公系统 丰富拓客引流工具 合伙红娘拓展客源 可多区域连锁运营 外呼电销到店邀约 线下约见服务管理 1对1技术服务支持 无感自动更新升级 行业领先的研发技术与服…

武汉凯迪正大—钢管焊缝裂纹探伤仪

产品概述 武汉凯迪正大无损探伤仪是一种便携式工业无损探伤仪器, 能够快速便捷、无损伤、精确地进行工件内部多种缺陷(裂纹、夹杂、气孔等)的检测、定位、评估和诊断。既可以用于实验室,也可以用于工程现场。 设置简单&#xff0c…

Swift 集合类型

集合类型 一、集合的可变性二、数组(Arrays)1、数组的简单语法2、创建一个空数组3、创建一个带有默认值的数组4、通过两个数组相加创建一个数组5、用数组字面量构造数组6、访问和修改数组7、数组的遍历 三、集合(Sets)1、集合类型…

IDEA 使用maven编译,控制台出现乱码问题的解决方式

前言 使用idea进行maven项目的编译时,控制台输出中文的时候出现乱码的情况。 通常出现这样的问题,都是因为编码格式不一样导致的。既然是maven出的问题,我们在idea中查找下看可以如何设置文件编码。 第一种方式 在pom.xml文件中&#xff…

LeetCode-2079. 给植物浇水【数组 模拟】

LeetCode-2079. 给植物浇水【数组 模拟】 题目描述:解题思路一:简单的模拟题,初始化为0,考虑先不浇灌每一个植物解题思路二:初始化为n,考虑每一个植物需要浇灌解题思路三:0 题目描述&#xff1a…

2024车载测试还有发展吗?

2024年已过接近1/4了,你是不是还在围观车载测试行业的发展? 现在入车载测试还来得及吗? 如何高效学习车载测试呢? 首先我们看一下车载测试行情发展,通过某大平台,我们后去数据如下: 这样的数据可以预估一下未来车载测试还是会持续发展. 随着科技的发展和汽车行业的不断创新,…

Python import 必看技巧:打造干净利落的代码结构

大家好,学习Python你肯定绕不过一个概念import,它是连接不同模块的桥梁,是实现代码复用和模块化的关键。本文将带你深入探索Python中import的原理,并分享一些实用的导入技巧。 1. import 原理 导入机制概述 在Python中,模块(module)是一种封装Python代码的方式,它允许…