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

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

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

相关文章

7-1作业

1.实验目的&#xff1a;完成字符收发 led.h #ifndef __GPIO_H__ #define __GPIO_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC,GPIO,UART初始化 void init();//字符数据发送 void set_tt…

Web端登录页和注册页源码

前言&#xff1a;登录页面是前端开发中最常见的页面&#xff0c;下面是登录页面效果图和源代码&#xff0c;CV大法直接拿走。 1、登录页面 源代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登录</ti…

每日复盘-20240701

今日关注&#xff1a; 20240701 六日涨幅最大: ------1--------301182--------- 凯旺科技 五日涨幅最大: ------1--------300977--------- 深圳瑞捷 四日涨幅最大: ------1--------300977--------- 深圳瑞捷 三日涨幅最大: ------1--------300461--------- 田中精机 二日涨幅最…

快钱支付股东全部股权已被质押!

根据近期工商信息&#xff0c;第三方支付机构快钱支付清算信息有限公司&#xff08;简称“快钱支付”&#xff09;实际控股方快钱金融服务&#xff08;上海&#xff09;有限公司&#xff08;简称“快钱金融”&#xff09;&#xff0c;作为出质股权标的企业&#xff0c;被出质给…

【SGX系列教程】(三)Intel-SGX 官方示例分析(SampleCode)——SampleEnclave

文章目录 一. 引言二. README2.1 项目目的2.2 构建和执行示例代码的步骤2.3 配置参数解释2.4 配置文件分析2.5 启动令牌初始化 三. 重点代码分析3.1 App文件夹3.1.1 App/App.cpp3.1.2 App/Edger8rSyntax文件夹3.1.2.1 App/Edger8rSyntax/Arrays.cpp3.1.2.2 App/Edger8rSyntax/F…

一文全概括,建议收藏,那些你不可错过的IC设计书籍合集(可下载)

集成电路设计工程师的角色不仅是推动技术创新的中坚力量&#xff0c;更是实现产品从概念到现实的关键桥梁。随着对高性能、低功耗芯片的需求不断增长&#xff0c;IC设计工程师的专业技能和知识深度成为了衡量其职业价值的重要标准。无论是在数字逻辑设计、功能验证、可测试性设…

JMeter--定时执行的方法

原文网址&#xff1a;JMeter--定时执行的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍JMeter如何使用定时器定时执行测试任务。 Java技术星球&#xff1a;way2j.com 方法 第一步&#xff1a;新建定时器 右键测试任务> Add > Timer> Constant Timer 如下图所示…

qt中数据库和excel互导数据————附带详细步骤和代码

文章目录 0 背景1 准备QXlsx环境1.1 cmake安装使用1.2 qmake使用 2 把excel数据导出到mysql数据库3 把mysql数据库的数据写入到excel4 完整代码5 项目代码仓库 0 背景 因为需要批量导入和导出数据&#xff0c;所以需要用到excel。实现把数据库的数据导入到excel中&#xff0c;…

解析QAnything启动命令过程

一.启动命令过程日志 启动命令bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat。输入日志如下所示&#xff1a; rootMM-202203161213:/mnt/l/20230918_RAG方向/QAnything# bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat From …

理性决策的艺术:从购房到择偶的数学智慧;37% 规则,做出最佳决策的秘诀;用数学模型解决人生难题

在面对人生重大决策时&#xff0c;如购房或择偶&#xff0c;我们常常感到迷茫和困惑。然而&#xff0c;如果我们能够将这些看似复杂的问题简化为数学模型&#xff0c;我们就能以更加理性和系统的方式做出决策。 37%规则 1950年代&#xff0c;当时几位数学家开始研究这样一个问…

值得收藏!盘点那些适合普通人方便又好用的AIGC工具!(下)

【导读】接上一篇文章&#xff0c;盘点国内外适合普通人能够轻松上手的AIGC工具&#xff08;上&#xff09;。今天又为大家整理了一些好用又方便的AI设计工具、AI办公工具、AI编程工具、AI指令工具和AI检测工具&#xff0c;如果有没更新到的工具也欢迎大家评论区交流。 一 、A…

C#/WPF 自制截图工具

在日常使用电脑办公时&#xff0c;我们经常遇到需要截图然后保存图片&#xff0c;我们往往需要借助安装截图工具才能实现&#xff0c;现在我们通过C#自制截图工具&#xff0c;也能够轻松进行截图。 我们可以通过C#调用WindousAPI来实现截图&#xff0c;实例代码如下&#xff1a…

AI基本概念(人工智能、机器学习、深度学习)

人工智能 、 机器学习、 深度学习的概念和关系 人工智能 &#xff08;Artificial Intelligence&#xff09;AI- 机器展现出人类智慧机器学习 &#xff08;Machine Learning) ML, 达到人工智能的方法深度学习 &#xff08;Deep Learning&#xff09;DL,执行机器学习的技术 从范围…

算法 —— 滑动窗口

目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 找到字符串中所有字母异位词 长度最小的子数组 sum比target小就进窗口&#xff0c;sum比target大就出窗口&#xff0c;由于数组是正数&#xff0c;所以相加会使sum变大&#xff0c;相减…

DiskGeniusV5.6.0.1565发布!

DiskGenius是一款功能强大的磁盘管理和数据恢复工具&#xff0c;V5.6.0.1565上线。新版本变化比较大&#xff0c;增加新的功能&#xff0c;修正已经问题&#xff0c;值得试一下。提醒大家&#xff0c;磁盘管理软件涉及数据安全&#xff0c;请始终使用最新版本&#xff01; 下面…

C++ initializer_list类型推导

目录 initializer_list C自动类型推断 auto typeid decltype initializer_list<T> C支持统一初始化{ }&#xff0c;出现了一个新的类型initializer_list<T>&#xff0c;一切类型都可以用列表初始化。提供了一种更加灵活、安全和明确的方式来初始化对象。 class…

IO-Link OD介绍

IO-Link OD&#xff08;On-request Data&#xff0c;按需数据&#xff09;是IO-Link通信中的一种重要数据类型&#xff0c;主要用于参数读写、指令交互、事件上传等动作。以下是关于IO-Link OD的结构、构成以及功能使用的详细说明&#xff1a; 结构与构成 定义&#xff1a;OD…

同一个excel表格,为什么在有的电脑上会显示#NAME?

一、哪些情况会产生#NAME?的报错 1.公式名称拼写错误 比如求和函数SUM&#xff0c;如果写成SUN就会提示#NAME&#xff1f;报错。 2.公式中的文本值未添加双引号 如下图&#xff1a; VLOOKUP(丙,A:B,2,0) 公式的计算结果会返回错误值#NAME?&#xff0c;这是因为公式中文本…

【PLC】三菱PLC如何和汇川伺服实现485通信

前言 一开始选用的是汇川SV660P脉冲型伺服&#xff0c;由于生产需求需要对伺服的个别参数进行读取和写入操作&#xff0c;但是SV660P并不支持这种情况&#xff0c;因此需要使用485通信来满足。PLC这边选用的是三菱FX5U。 开始 1、首先准备按照下图的引脚提示准备好一根带屏蔽…

(七)glDrawArry绘制

几何数据&#xff1a;vao和vbo 材质程序&#xff1a;vs和fs(顶点着色器和片元着色器) 接下来只需要告诉GPU&#xff0c;使用几何数据和材质程序来进行绘制。 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…