MQTT QoS 0, 1, 2

news2024/12/26 0:47:01

目录

# 开篇

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

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

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

相关文章

迈阿密色主题学科 HTML5静态导航源码

源码介绍 迈阿密色主题学科 HTML5静态导航源码&#xff0c;源码直接上传可用&#xff0c;有技术的可以拿去写个后端搜索调用百度接口&#xff0c;也可用于做引导页下面加你网址添加一个A标签就行了&#xff0c;很简单&#xff0c;需要的朋友就拿去吧 界面预览 源码下载 迈阿…

【Git 学习笔记】Ch1.1 Git 简介 + Ch1.2 Git 对象

还是绪个言吧 今天整理 GitHub 仓库&#xff0c;无意间翻到了几年前自学 Git 的笔记。要论知识的稳定性&#xff0c;Git 应该能挤进前三——只要仓库还在&#xff0c;理论上当时的所有开发细节都可以追溯出来。正好过段时间会用到 Git&#xff0c;现在整理出来就当温故知新了。…

【Python机器学习】模型评估与改进——简单的网格搜索

为了提升模型的泛化性能&#xff0c;我们可以通过调参来实现。 在尝试调参之前&#xff0c;重要的是理解参数的含义&#xff0c;找到一个模型的重要参数&#xff08;提供最佳泛化性能的参数&#xff09;的取值是一项棘手的任务&#xff0c;但对于几乎所有模型和数据集来说都是…

详细讲解 Keil Pack Installer,以及通过 Keil 官网获取 Pack

前言 大家好&#xff0c;我是梁国庆。 收到粉丝留言&#xff0c;说 Keil 安装 Pack 不太明白&#xff0c;可不可以详细演示一下&#xff1f; 当然可以有&#xff0c;直接视频&#xff0b;文章全部安排&#xff0c;我就是宠粉。 PS&#xff1a;第一次录视频有些紧张&#xff…

[leetcode]longest-arithmetic-subsequence-of-given-difference. 最长定差子序列

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int longestSubsequence(vector<int> &arr, int difference) {int ans 0;unordered_map<int, int> dp;for (int v: arr) {dp[v] dp[v - difference] 1;ans max(ans, dp[v]);}return ans…

朋友圈自由松弛感文案

“零碎的岛屿会找到海” “去发光而不是被照亮” “一没病&#xff0c;二没灾&#xff0c;小小日子&#xff0c;悠哉悠哉。” “我深知这是我一个人的困局” “山鬼不识字&#xff0c;西风不动情” “没有销声匿迹&#xff0c;我在热爱生活” “都是风景&#xff0c;幸会…

仓库管理系统24--统计报表

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、引用LiveCharts 2、创建LiveChartViewModel using GalaSoft.MvvmLight; using LiveCharts.Wpf; using LiveCharts; using Sy…

mybatis实现多表查询

mybatis高级查询【掌握】 1、准备工作 【1】包结构 创建java项目&#xff0c;导入jar包和log4j日志配置文件以及连接数据库的配置文件&#xff1b; 【2】导入SQL脚本 运行资料中的sql脚本&#xff1a;mybatis.sql 【3】创建实体来包&#xff0c;导入资料中的pojo 【4】User…

PCL 基于点云RGB颜色的区域生长算法

RGB颜色的区域生长算法 一、概述1.1 算法定义1.2 算法特点1.3 算法实现二、代码示例三、运行结果🙋 结果预览 一、概述 1.1 算法定义 点云RGB区域生长算法: 是一个基于RGB颜色信息的区域生长算法,用于点云分割。该算法利用了点云中相邻点之间的颜色相似性来将点云分割成…

SQLAlchemy(alembic)和Flask-SQLAlchemy入门教程

SQLAlchemy 是 Python 生态中最流行的 ORM 类库&#xff0c;alembic 用来做 OMR 模型与数据库的迁移与映射&#xff0c;Flask-SQLAlchemy 是 Flask 的扩展&#xff0c;可为应用程序添加对 SQLAlchemy 的支持&#xff0c;简化 SQLAlchemy 与 Flask 的使用。 一.SQLAlchemy 和 a…

鸿蒙本地签名不匹配问题

连接鸿蒙手机运行项目报如下错误 这是由于本地签名和鸿蒙设备签名不匹配导致的&#xff0c;需要注释掉如下代码&#xff0c;选择file project 自动签名 勾选auto选项&#xff0c;会在build-profile.json5中生成一个签名&#xff0c;然后运行就ok了~

商汤上海AI实验室联合发布:自动驾驶全栈式高精度标定工具箱(含车、IMU、相机、激光雷达等的标定)

前言 在自动驾驶技术飞速发展的今天&#xff0c;传感器的精确标定对于确保系统性能至关重要。SensorsCalibration&#xff0c;一个专为自动驾驶车辆设计的标定工具箱&#xff0c;提供了一套全面的解决方案&#xff0c;用于校准包括IMU、激光雷达、摄像头和雷达在内的多种传感器…

探索智慧校园人事系统,了解人事合同功能的核心优势

智慧校园人事系统中的人事合同管理功能&#xff0c;是一个高度集成且自动化的模块&#xff0c;专注于优化合同的全生命周期管理&#xff0c;从合同创建、审批、签署到存档及续签提醒&#xff0c;旨在提升人事管理工作的规范性与效率&#xff0c;同时保障学校的法律合规性。 在智…

ARP 原理详解 一

ARP 原理 ARP&#xff08;Address Resolution Protocol&#xff09;地址解析协议&#xff0c;是根据 IP 地址获取物理地址的一个 TCP/IP 协议。 OSI 网络七层模型中&#xff0c;IP 地址在 OSI 模型第三层&#xff0c;MAC 地址在第二层&#xff0c;彼此不直接通信。 在通过以…

HTMLCSS(入门)

HTML <html> <head><title>第一个页面</title></head><body>键盘敲烂&#xff0c;工资过万</body> </html> <!DOCTYPE>文档类型声明&#xff0c;告诉浏览器使用哪种HTML版本显示网页 <!DOCTYPE html>当前页面采取…

汽车零部件材料耐候性测试氙光太阳辐射系统试验箱

概述 汽车零部件等领域的材料耐候性测试是一项关键的质量控制环节&#xff0c;它关乎汽车部件在各种气候条件下的性能表现和寿命。塑料件光照老化实验箱&#xff0c;即氙灯老化试验箱&#xff0c;在其中扮演着至关重要的角色。通过模拟自然环境中的光照、温度、湿度等条件&…

分享一个在 WinForm 桌面程序中使用进度条展示报表处理进度的例子,提升用户体验

前言 在有些比较消耗时间的业务场景中&#xff0c;比如生成报表等&#xff0c;如果没有在操作的过程中向用户反馈操作进度&#xff0c;会让用户以为程序 “死” 掉了&#xff0c;用户体验非常不好。 WinForm 桌面程序项目与 Console 项目不一样&#xff0c;如果 Console 项目…

农村程序员陈随易2024年中总结

今天是 2024年7月1日&#xff0c;时间如白驹过隙&#xff0c;今年已去其一半。 总结一下今年上半年的情况&#xff0c;给大家提供一些参考和建议。 希望大家关注一下公众号 陈随易&#xff0c;有些内容只在公众号发表。 先看看我的年初计划&#xff0c;这个在今年年初的时候&…

【解锁未来:深入了解机器学习的核心技术与实际应用】

解锁未来&#xff1a;深入了解机器学习的核心技术与实际应用 &#x1f48e;1.引言&#x1f48e;1.1 什么是机器学习&#xff1f; &#x1f48e;2 机器学习的分类&#x1f48e;3 常用的机器学习算法&#x1f48e;3.1 线性回归&#xff08;Linear Regression&#xff09;&#x1…

141个图表,完美展示数据分类别关系!

本文介绍使用Python工具seaborn详细实现分类关系图表&#xff0c;包含8类图141个代码模版。 分类关系图表用于展示数字变量和一个或多个分类变量之间的关系&#xff0c;可以进一步分为&#xff1a;箱形图&#xff08;box plot&#xff09;、增强箱形图&#xff08;enhanced bo…