MQTT QoS 0, 1, 2

目录

# 开篇

1. 精细MQS TT QoS的行为

1.1 QoS 0: 最多交付一次(At Most Once)

1.2 QoS 1: 至少交付一次(At Least Once)

1.3 QoS 2: 只交付一次(Exactly Once)

1.4 传输过程图示

1.5 总结

2. MQTT 数据大小限制和发送原理

2.1 EMQX 数据大小限制

2.2 Mosquitto 数据大小限制

2.3 发送数据的原理

2.4 MQTT 原理的时序图

2.5 Qos中的四次握手

2.6 相关配置示例

2.6.1 EMQX 配置 QoS 示例

2.6.2 Mosquitto 配置 QoS 示例


# 开篇

Qos设置:

        很多时候,使用 MQTT 协议的设备都运行在网络受限的环境下,而只依靠底层的 TCP 传输协议,并不能完全保证消息的可靠到达。因此,MQTT 提供了 QoS 机制,其核心是设计了多种消息交互机制来提供不同的服务质量,来满足用户在各种场景下对消息可靠性的要求。

MQTT 定义了三个 QoS 等级,分别为:

  • QoS 0,最多交付一次。
  • QoS 1,至少交付一次。
  • QoS 2,只交付一次。

        其中,使用 QoS 0 可能丢失消息使用 QoS 1 可以保证收到消息但消息可能重复使用 QoS 2 可以保证消息既不丢失也不重复QoS 等级从低到高,不仅意味着消息可靠性的提升,也意味着传输复杂程度的提升

        在一个完整的从发布者到订阅者的消息投递流程中,QoS 等级是由发布者在 PUBLISH 报文中指定的,大部分情况下 Broker 向订阅者转发消息时都会维持原始的 QoS 不变。不过也有一些例外的情况,根据订阅者的订阅要求,消息的 QoS 等级可能会在转发的时候发生降级。

例如,订阅者在订阅时要求 Broker 可以向其转发的消息的最大 QoS 等级为 QoS 1,那么后续所有 QoS 2 消息都会降级至 QoS 1 转发给此订阅者,而所有 QoS 0 和 QoS 1 消息则会保持原始的 QoS 等级转发。

1. 精细MQS TT QoS的行为

        让我们来进一步明确每种 MQS TT QoS 的行为,特别是消息传输过程中丢失与重复的风险和保障:

1.1 QoS 0: 最多交付一次(At Most Once)

  • 特征
    • 无消息确认:发送者发送消息后,不需要确认消息是否到达接收者。
    • 无重试:如果消息在传输过程中丢失,发送者不会再次发送该消息。
  • 风险消息可能丢失。在网络不稳定或发生传输错误时,消息可能不会到达接收者。
  • 适用场景:适合对消息丢失不敏感的应用,例如发送传感器数据,实时监测数据,或日志记录。

1.2 QoS 1: 至少交付一次(At Least Once)

  • 特征
    • 消息确认:发送者发送消息后,需要接收者(或代理)确认消息已接收(通过 PUBACK)。
    • 支持重试:如果发送者在规定时间内未收到确认,将重新发送消息,直到收到确认。
  • 风险消息可能重复。由于重试机制,如果网络中断或接收确认消息丢失,发送者会重发,可能导致接收者收到重复的消息。
  • 适用场景:适合需要确保消息到达但能处理重复消息的应用,例如状态更新、简单的事务操作。

1.3 QoS 2: 只交付一次(Exactly Once)

  • 特征
    • 高级消息确认:通过复杂的四步握手过程(PUBRECPUBRELPUBCOMP),确保消息仅传输一次,避免重复。
    • 支持重试:如果在任何一步未收到确认,发送者和接收者都会重试相应步骤,直到完成整个确认过程。
  • 风险消息不会丢失或重复。确保了消息在传输中不会丢失,并且不会重复到达接收者。
  • 适用场景:适合不能接受消息丢失或重复的应用,例如金融交易、订单处理等关键业务场景。

1.4 传输过程图示

QoS 级别发送者行为接收者行为过程图示
QoS 0发送一次立即处理Publisher -> Broker -> Subscriber
QoS 1发送->等待确认确认->处理Publisher -> Broker <-> PUBACK -> Subscriber
QoS 2发送->等待 PUBREC -> PUBREL -> PUBCOMP确认 PUBREC -> 等待 PUBREL -> 确认 PUBCOMPPublisher -> Broker <-> PUBREC <-> PUBREL <-> PUBCOMP -> Subscriber

1.5 总结

  • QoS 0:适用于对消息丢失无所谓的场景。消息可能丢失。
  • QoS 1:适用于需要保证消息到达但能接受重复消息的场景。消息可能重复。
  • QoS 2:适用于需要严格保证消息不丢失且不重复的场景。消息不会丢失也不会重复。

选择合适的 QoS 级别取决于应用的可靠性需求和可以容忍的传输错误类型。

2. MQTT 数据大小限制和发送原理

2.1 EMQX 数据大小限制

  • 默认最大数据大小:1 MB
  • 最大可配置数据大小:256 MB
  • 设置项:可以通过配置文件 emqx.conf 或 EMQX Dashboard 中的 Max Packet Size 来调整。

2.2 Mosquitto 数据大小限制

  • 默认最大数据大小:可以通过 mosquitto.conf 文件中的 message_size_limit 配置项调整,具体默认值随版本和配置不同而异,一般设置为 268435455 字节 (约 256 MB) 。

2.3 发送数据的原理

MQTT 发送数据的基本流程

  1. 连接:客户端与 MQTT Broker 建立连接。
  2. 订阅:客户端订阅一个或多个主题。
  3. 发布:客户端向订阅的主题发布消息。
  4. 接收:订阅该主题的客户端接收消息。
  5. 确认:根据 QoS(服务质量)等级,可能会有确认消息的发送。

详细步骤

  • 建立连接:客户端使用 MQTT 协议的 CONNECT 报文连接到 Broker。
  • 订阅主题:客户端发送 SUBSCRIBE 报文,指定要订阅的主题。
  • 发布消息:使用 PUBLISH 报文发布消息到某个主题。
  • 消息转发:Broker 接收到消息后,将其转发给所有订阅该主题的客户端。
  • 消息接收和确认:客户端接收消息,若 QoS 级别要求,需要发送 PUBACK(QoS 1)或 PUBREC/PUBREL/PUBCOMP(QoS 2)确认消息的递送。

2.4 MQTT 原理的时序图

        MQTT(Message Queuing Telemetry Transport)协议是一种基于发布/订阅模式的轻量级消息传输协议,广泛应用于物联网(IoT)领域。以下是 MQTT 消息从客户端到 Broker 再到订阅者的完整时序图。

解释: 

  • CONNECT: 客户端发起连接请求。
  • CONNACK: Broker 响应连接请求。
  • SUBSCRIBE: 客户端订阅一个或多个主题。
  • SUBACK: Broker 确认订阅。
  • PUBLISH (QoS 0): 客户端发布消息,QoS 0 表示最多一次交付,不需要确认。
  • PUBLISH (QoS 1): 客户端发布消息,QoS 1 表示至少一次交付,需要确认。
  • PUBLISH (QoS 2): 客户端发布消息,QoS 2 表示精确一次交付,需经过四次握手确认。
  • DISCONNECT: 客户端断开连接。

2.5 Qos中的四次握手

        MQTT(Message Queuing Telemetry Transport)协议中的QoS(Quality of Service)级别有三个等级:0、1、2。QoS 2 是最高级别的保证消息传递的质量。

在MQTT中,QoS 2使用了四次握手来确保消息的可靠传递:

  1. 发起请求:发送端(Publisher)将消息发送给接收端(Subscriber),并请求QoS 2级别的确认。
  2. 接收确认:接收端收到消息后,向发送端发送确认收到的消息(PUBREC)。
  3. 发送确认:发送端接收到确认消息后,发送PUBREL给接收端,表示可以释放消息。
  4. 完成确认:接收端收到PUBREL后,发送最终的确认消息(PUBCOMP),表示消息已经完成传递。

这四次握手确保了消息的可靠性和顺序性,即使在网络不稳定或断开连接后,也能够确保消息不会丢失或重复传输。

2.6 相关配置示例

2.6.1 EMQX 配置 QoS 示例

emqx.conf 中:

mqtt.max_qos = 2
2.6.2 Mosquitto 配置 QoS 示例

Mosquitto 配置 QoS 示例

max_qos 2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何避免爬取网站时IP被封?

互联网协议 (IP) 地址是识别网络抓取工具的最常见方式。IP 是每个互联网交换的核心&#xff0c;对其进行跟踪和分析可以了解很多有关连接客户端的信息。 在网络抓取中&#xff0c;IP 跟踪和分析&#xff08;又名指纹&#xff09;通常用于限制和阻止网络抓取程序或其他不需要的访…

面向阿克曼移动机器人(自行车模型)的LQR(最优二次型调节器)路径跟踪方法

线性二次调节器&#xff08;Linear Quadratic Regulator&#xff0c;LQR&#xff09;是针对线性系统的最优控制方法。LQR 方法标准的求解体系是在考虑到损耗尽可能小的情况下, 以尽量小的代价平衡其他状态分量。一般情况下&#xff0c;线性系统在LQR 控制方法中用状态空间方程描…

汇聚荣拼多多电商好不好?

拼多多电商好不好?这是一个值得探讨的问题。拼多多作为中国领先的电商平台之一&#xff0c;以其独特的商业模式和创新的营销策略吸引了大量用户。然而&#xff0c;对于这个问题的回答并不是简单的好或不好&#xff0c;而是需要从多个方面进行综合分析。 一、商品质量 来看拼多…

【源码+文档+调试讲解】居家养老系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了居家养老系统的开发全过程。通过分析高校学生综合素质评价管理方面的不足&#xff0c;创建了一个计算机管理居家养老系统的方案。文章介绍了居家养老系统的系统分…

jvm性能监控常用工具

在java的/bin目录下有许多java自带的工具。 我们常用的有 基础工具 jar:创建和管理jar文件 java&#xff1a;java运行工具&#xff0c;用于运行class文件或jar文件 javac&#xff1a;java的编译器 javadoc&#xff1a;java的API文档生成工具 性能监控和故障处理 jps jstat…

Sourcecodester Fantastic Blog CMS v1.0 SQL 注入漏洞(CVE-2022-28512)

前言 CVE-2022-28512 是一个存在于 Sourcecodester Fantastic Blog CMS v1.0 中的 SQL 注入漏洞。攻击者可以通过 "/fantasticblog/single.php" 中的 id 参数注入恶意 SQL 查询&#xff0c;从而获得对数据库的未经授权的访问和控制。 漏洞详细信息 漏洞描述: 该漏…

JavaScript将参数传递给事件处理程序

本篇文件我们将实现导航栏中&#xff0c;选中时候&#xff0c;会将您选中的进行高亮显示&#xff1b; ● 首先我们来获取我们想要的HTML元素 const nav document.querySelector(.nav);● 接着我们来写选中的高亮显示 nav.addEventListener(mouseover, function (e) { //鼠…

内网穿透小工具

内网穿透小工具 前言 当在本地或者虚拟机&#xff0c;内网搭建了项目&#xff0c;数据库。可是在外网无法访问。下面的两款小工具可以暂时实现内网穿透能力。&#xff08;不支持自定义域名&#xff0c;但是不限制隧道数量&#xff01;且免费&#xff01;免费&#xff01;免费…

【小贪】项目实战——Zero-shot根据文字提示分割出图片目标掩码

目标描述 给定RGB视频或图片&#xff0c;目标是分割出图像中的指定目标掩码。我们需要复现两个Zero-shot的开源项目&#xff0c;分别为IDEA研究院的GroundingDINO和Facebook的SAM。首先使用目标检测方法GroundingDINO&#xff0c;输入想检测目标的文字提示&#xff0c;可以获得…

互联网框架五层模型详解

注&#xff1a;机翻&#xff0c;未校对。 What is the Five Layers Model? The Framework of the Internet Explained 五层模型互联网框架解释 Computer Networks are a beautiful, amazing topic. Networks involve so much knowledge from different fields, from physics…

[OHOS_ERROR]: Please call hb utilities inside ohos source directory

当执行hb set报如下错误时&#xff1a;原因时重新拉取了源码&#xff0c;且源码路径被改了 [OHOS_ERROR]: Please call hb utilities inside ohos source directory 【解决办法】 卸载hb并在源码路径下重新安装 python3 -m pip uninstall ohos-build 安装hb python3 -m pi…

python-逻辑语句

if else语句 不同于C&#xff1a;else if range语句&#xff1a; continue continue的作用是&#xff1a; 中断所在循环的当次执行&#xff0c;直接进入下一次 continue在嵌套循环中的应用 break 直接结束所在的循环 break在嵌套循环中的应用 continue和break&#xff0c;在…

力扣:LCR 024. 反转链表(Java)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#x…

【嵌入式DIY实例】- LCD ST7735显示DHT11传感器数据

LCD ST7735显示DHT11传感器数据 文章目录 LCD ST7735显示DHT11传感器数据1、硬件准备与接线2、代码实现本文介绍如何将 ESP8266 NodeMCU 板 (ESP-12E) 与 DHT11 (RHT01) 数字湿度和温度传感器连接。 NodeMCU 从 DHT11 传感器读取温度(以 C 为单位)和湿度(以 rH% 为单位)值,…

1.5 Canal 数据同步工具详细教程

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

【你也能从零基础学会网站开发】关系型数据库中的表(Table)设计结构以及核心组成部分

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 关系型数据库中…

FTP 文件传输协议:概念、工作原理;上传下载操作步骤

目录 FTP 概念 工作原理 匿名用户 授权用户 FTP软件包 匿名用户上传下载实验步骤 环境配置 下载 上传 wget 授权用户上传下载步骤 root用户登录FTP步骤 监听 设置端口号范围 修改用户家目录 匿名用户 授权用户 FTP 概念 FTP&#xff08;File Transfer Prot…

C语言之线程的学习

线程属于某一个进程 共同点&#xff1a;都能并发 线程共享变量&#xff0c;进程不共享。 多线程任务中&#xff0c;其中某一个线程调用了exit了&#xff0c;其他线程会跟着一起退出 如果是特定的线程就调用pthread_exit 失败返回的是错误号 下面也是

VSCode无法识别 node、npm

一、前提 电脑新安装了node.js&#xff0c;在cmd查看node和npm版本没有问题&#xff0c;但是在VSCode无法识别 1.cmd查看版本&#xff1a; 2.VSCode报错信息&#xff1a; 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果…

C#——Property属性详情

属性 属性&#xff08;Property&#xff09;是类&#xff08;class&#xff09;、结构体&#xff08;structure&#xff09;和接口&#xff08;interface&#xff09;的成员&#xff0c;类或结构体中的成员变量称为字段&#xff0c;属性是字段的扩展&#xff0c;使用访问器&am…