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.pswp.cn/web/37795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37795.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTTP協議頭中X-Forwarded-For是能做什么?

X-Forwarded-For和相關幾個頭部的理解 $remote_addr 是nginx與客戶端進行TCP連接過程中&#xff0c;獲得的客戶端真實地址. Remote Address 無法偽造&#xff0c;因為建立 TCP 連接需要三次握手&#xff0c;如果偽造了源 IP&#xff0c;無法建立 TCP 連接&#xff0c;更不會有后…

javascript 的 屬性、方法、事件

使用 javascript 設計一個學生類、&#xff08;屬性&#xff1a;ID、姓名、性別,方法&#xff1a;學習、休息、&#xff0c;事件&#xff1a;上學、放學、上課、下課&#xff09;學校有定時器每1秒鐘觸發一次時鐘事件&#xff0c;每節課45分鐘&#xff0c;課間15分鐘 var Stud…

13. Lammps入門in文件簡介-1

來源&#xff1a; “碼農不會寫詩”公眾號 鏈接&#xff1a;Lammps入門in文件簡介-1 文章目錄 01 in文件簡介02 in文件命令解析規則 書回正文 Lammps通過一次一行地從輸入腳本&#xff08;文本文件&#xff0c;通常稱in文件&#xff09;中讀取命令來執行計算&#xff0c;當輸入…

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…

Django 和 Django REST framework 創建對外 API

1. 環境準備 確保你已經安裝了 Python 和 Django。如果尚未安裝 Django REST framework&#xff0c;通過 pip 安裝它&#xff1a; pip install djangorestframework 2. 創建 Django 項目 如果你還沒有 Django 項目&#xff0c;可以通過以下命令創建&#xff1a; django-ad…

每日復盤-20240701

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

Lua實現鏈表(面向對象應用)

Lua實現面向對象 面向對象核心三要素Lua面向對象大致原理面向對象示例繼承與多態示例 面向對象核心三要素 1.封裝&#xff1a;對一個事物的抽象為一些屬性和行為動作的集合&#xff0c;封裝將屬性和行為動作&#xff08;操作數據的方法&#xff09;綁定在一起&#xff0c;并隱藏…

快錢支付股東全部股權已被質押!

根據近期工商信息&#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;…

圓圈序號1~10復制粘貼直接用

1. 空心圓圈數字序號&#xff1a; ①、②、③、④、⑤、⑥、⑦、⑧、⑨、⑩ 2. 實心圓圈數字序號&#xff1a; ?、?、?、?、?、?、?、?、?、? 3. 空心圓圈中文序號&#xff1a; 一、二、三、四、五、六、七、八、九、十

linux高級編程(線程)(1)

虛擬地址&#xff1a; 線程&#xff1a; 概念&#xff1a;線程是輕量級進程&#xff0c;一般是一個進程中的多個任務。 進程是系統中最小的資源分配單位。&#xff08;競爭計算機資源的最小單位&#xff09;&#xff08;進程能分配硬件資源&#xff0c;線程不行&#x…

解析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 …

Leetcode Java學習記錄——棧和隊列 IDEA

文章目錄 棧和隊列stack Classqueue InterfaceDeque Interfaceadd 和 push Priority Queue -- Class題目 codestyleIDEA 操作快捷鍵選擇代碼生成類 棧和隊列 stack Class google stack java 8/12 empty() peek() pop() push(E item) search(Object o) 最近相關性會用到棧 …

湘潭大學軟件工程數據庫總結

文章目錄 前言試卷結構給學弟學妹的一些參考自己的一些總結 前言 自己可能很早很早之前就準備復習了&#xff0c;但是感覺還是沒有學到要點&#xff0c;主要還是沒啥緊迫的壓力&#xff0c;我們是三月份開學&#xff0c;那時候實驗室有朋友挺認真開始學習數據庫了&#xff0c;…

理性決策的藝術:從購房到擇偶的數學智慧;37% 規則,做出最佳決策的秘訣;用數學模型解決人生難題

在面對人生重大決策時&#xff0c;如購房或擇偶&#xff0c;我們常常感到迷茫和困惑。然而&#xff0c;如果我們能夠將這些看似復雜的問題簡化為數學模型&#xff0c;我們就能以更加理性和系統的方式做出決策。 37%規則 1950年代&#xff0c;當時幾位數學家開始研究這樣一個問…

值得收藏!盤點那些適合普通人方便又好用的AIGC工具!(下)

【導讀】接上一篇文章&#xff0c;盤點國內外適合普通人能夠輕松上手的AIGC工具&#xff08;上&#xff09;。今天又為大家整理了一些好用又方便的AI設計工具、AI辦公工具、AI編程工具、AI指令工具和AI檢測工具&#xff0c;如果有沒更新到的工具也歡迎大家評論區交流。 一 、A…