MQTT 協議入門:輕松上手,快速掌握核心要點

文章目錄

  • 什么是 MQTT?
  • MQTT 的工作原理
    • MQTT 客戶端
    • MQTT Broker
    • 發布-訂閱模式
    • 主題
    • QoS
  • MQTT 的工作流程
  • 開始使用 MQTT:快速教程
    • 準備 MQTT Broker
    • 準備 MQTT 客戶端
    • 創建 MQTT 連接
    • 通過通配符訂閱主題
    • 發布 MQTT 消息
    • MQTT 功能演示
      • 保留消息
      • Clean Session
      • 遺囑消息

在這里插入圖片描述

什么是 MQTT?

MQTT(Message Queuing Telemetry Transport)是一種輕量級、基于發布-訂閱模式的消息傳輸協議,適用于資源受限的設備和低帶寬、高延遲或不穩定的網絡環境。它在物聯網應用中廣受歡迎,能夠實現傳感器、執行器和其它設備之間的高效通信。

MQTT 的工作原理

要了解 MQTT 的工作原理,首先需要掌握以下幾個概念:MQTT 客戶端MQTT Broker發布-訂閱模式主題QoS

MQTT 客戶端

任何運行 MQTT 客戶端庫的應用或設備都是 MQTT 客戶端。例如,使用 MQTT 的即時通訊應用是客戶端,使用 MQTT 上報數據的各種傳感器是客戶端,各種 MQTT 測試工具也是客戶端。

MQTT Broker

MQTT Broker 是負責處理客戶端請求的關鍵組件,包括建立連接、斷開連接、訂閱和取消訂閱等操作,同時還負責消息的轉發。一個高效強大的 MQTT Broker 能夠輕松應對海量連接和百萬級消息吞吐量,從而幫助物聯網服務提供商專注于業務發展,快速構建可靠的 MQTT 應用。

發布-訂閱模式

發布-訂閱模式與客戶端-服務器模式的不同之處在于,它將發送消息的客戶端(發布者)和接收消息的客戶端(訂閱者)進行了解耦。發布者和訂閱者之間無需建立直接連接,而是通過 MQTT Broker 來負責消息的路由和分發。

下圖展示了 MQTT 發布/訂閱過程。溫度傳感器作為客戶端連接到 MQTT Broker,并通過發布操作將溫度數據發布到一個特定主題(例如 Temperature)。MQTT Broker 接收到該消息后會負責將其轉發給訂閱了相應主題(Temperature)的訂閱者客戶端。
在這里插入圖片描述

主題

MQTT 協議根據主題來轉發消息。主題通過 / 來區分層級,類似于 URL 路徑,例如:

chat/room/1sensor/10/temperaturesensor/+/temperature

MQTT 主題支持以下兩種通配符:+ 和 #。

  • +:表示單層通配符,例如 a/+ 匹配 a/x 或 a/y。
  • #:表示多層通配符,例如 a/# 匹配 a/x、a/b/c/d。

注意:通配符主題只能用于訂閱,不能用于發布。

QoS

MQTT 提供了三種服務質量(QoS),在不同網絡環境下保證消息的可靠性。

  • QoS 0:消息最多傳送一次。如果當前客戶端不可用,它將丟失這條消息。
  • QoS 1:消息至少傳送一次。
  • QoS 2:消息只傳送一次。

MQTT 的工作流程

在了解了 MQTT 的基本組件之后,讓我們來看看它的一般工作流程:

  1. 客戶端使用 TCP/IP 協議與 Broker 建立連接,可以選擇使用 TLS/SSL 加密來實現安全通信。客戶端提供認證信息,并指定會話類型(Clean Session 或 Persistent Session)。
  2. 客戶端既可以向特定主題發布消息,也可以訂閱主題以接收消息。當客戶端發布消息時,它會將消息發送給 MQTT Broker;而當客戶端訂閱消息時,它會接收與訂閱主題相關的消息。
  3. MQTT Broker 接收發布的消息,并將這些消息轉發給訂閱了對應主題的客戶端。它根據 QoS 等級確保消息可靠傳遞,并根據會話類型為斷開連接的客戶端存儲消息。

開始使用 MQTT:快速教程

下面我們將通過一些簡單的示例來展示如何使用 MQTT。在開始之前,需要準備 MQTT Broker 和 MQTT 客戶端。

準備 MQTT Broker

您可以選擇私有部署或完全托管的云服務來建立自己的 MQTT Broker。或者您也可以使用免費的公共 Broker。

  • 私有部署
    EMQX 是最具擴展性的開源 MQTT Broker,適用于物聯網、工業物聯網和車聯網。您可以運行以下 Docker 命令來安裝 EMQX。
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx
  • 全托管的云服務
    通過全托管的云服務啟動 MQTT 服務是最便捷的方式。如下圖所示,EMQX Cloud 可以在幾分鐘內啟動,并在 AWS、Google Cloud 和 Microsoft Azure 的 17 個區域提供運行支持。

在這里插入圖片描述

  • 免費的公共 MQTT Broker
    在本文中,我們將使用 EMQ 提供的免費公共 MQTT Broker,它基于完全托管的 MQTT 云服務 - EMQX Cloud 創建。服務器信息如下:
Server: broker.emqx.ioTCP Port: 1883WebSocket Port: 8083SSL/TLS Port: 8883Secure WebSocket Port: 8084

準備 MQTT 客戶端

在本文中,我們將使用 MQTTX 提供的支持瀏覽器訪問的 MQTT 客戶端工具,訪問地址為 http://www.emqx.io/online-mqtt-client 。 MQTTX 還提供了桌面客戶端命令行工具

MQTTX 是一款跨平臺的 MQTT 5.0 桌面客戶端,可在 macOS、Linux、Windows 操作系統上運行。其用戶友好的聊天式界面使用戶能夠輕松創建多個 MQTT/MQTTS 連接,并進行 MQTT 消息的訂閱和發布。

在這里插入圖片描述

目前,各種編程語言都擁有成熟的開源 MQTT 客戶端庫。我們在流行的 MQTT 客戶端庫和 SDK 中精選了多個編程語言的 MQTT 客戶端庫,并提供了詳細的代碼示例,旨在幫助您快速了解 MQTT 客戶端的使用。

創建 MQTT 連接

在使用 MQTT 協議進行通信之前,客戶端需要創建一個 MQTT 連接來連接到 Broker。

在瀏覽器中打開 http://www.emqx.io/online-mqtt-client , 點擊頁面中間的 New Connection 按鈕,將看到如下頁面。

在這里插入圖片描述

我們在 Name 中輸入 Simple Demo,然后點擊右上角的 Connect 按鈕,建立一個 MQTT 連接。如下圖所示,表示連接成功。

在這里插入圖片描述

通過通配符訂閱主題

接下來,我們在上面創建的 Simple Demo 連接中通過通配符訂閱主題 sensor/+/temperature,這樣就可以接收所有傳感器發送的溫度數據了。

如下圖所示,點擊 New Subscription 按鈕,在彈出框中的 Topic 字段中輸入主題 sensor/+/temperature,QoS 保持默認值 0。

在這里插入圖片描述

訂閱成功后,會在訂閱列表的中間看到新增了一條記錄。

在這里插入圖片描述

發布 MQTT 消息

接下來,我們點擊左側菜單上的 + 按鈕創建兩個連接,分別命名為 Sensor 1Sensor 2,用來模擬兩個溫度傳感器。

在這里插入圖片描述

連接創建成功后,會看到三個連接,每個連接左側的在線狀態指示燈都是綠色的。

在這里插入圖片描述

選擇 Sensor 1 連接,在頁面下方的發布主題中輸入 sensor/1/temperature,在消息框中輸入以下 JSON 格式的消息,然后點擊右下方的發布按鈕發送消息。

{"msg": "17.2"
}

在這里插入圖片描述

如下圖所示,消息發送成功。

在這里插入圖片描述

使用相同的步驟,在 Sensor 2 連接中發布以下 JSON 消息到 sensor/2/temperature 主題。

{"msg": "18.2"
}

您會看到 Simple Demo 連接收到兩條新消息。

在這里插入圖片描述

點擊 Simple Demo 連接,會看到兩個傳感器發送的兩條消息。

在這里插入圖片描述

MQTT 功能演示

保留消息

當 MQTT 客戶端向服務器發布消息時,可以設置保留消息標志。保留消息存儲在消息服務器上,后續訂閱該主題的客戶端仍然可以收到該消息。

如下圖所示,我們在 Sensor 1 連接中勾選 Retain 選項,然后向 retained_message 主題發送兩條消息。

在這里插入圖片描述

接著,我們在 Simple Demo 連接中訂閱 retained_message 主題。訂閱成功后,會收到 Sensor 1 發送的第二條保留消息,這說明服務器只會為主題保留最近的一條保留消息。

在這里插入圖片描述

Clean Session

MQTT 客戶端通常只能在在線狀態下接收其它客戶端發布的消息。如果客戶端離線后重新上線,它將無法收到離線期間的消息。

但是,如果客戶端連接時設置 Clean Session 為 false,并且使用相同的客戶端 ID 再次上線,那么消息服務器將為客戶端緩存一定數量的離線消息,并在它重新上線時發送給它。

本次演示使用的公共 MQTT 服務器設置為緩存 5 分鐘的離線消息,最大消息數為 1000 條,且不保存 QoS 0 消息。

下面,我們創建一個 MQTT 3.1.1 連接,并用 QoS 1 來演示 Clean Session 的使用。

MQTT 5.0 中將 Clean Session 拆分成了 Clean Start 與 Session Expiry Interval。

創建一個名為 MQTT V3 的連接,設置 Clean Session 為 false,選擇 MQTT 版本為 3.1.1。

在這里插入圖片描述

連接成功后,訂閱 clean_session_false 主題,并將 QoS 設置為 1。

在這里插入圖片描述

訂閱成功后,點擊右上角的斷開按鈕,斷開連接。

在這里插入圖片描述

然后,創建一個名為 MQTT_V3_Publish 的連接,MQTT 版本也設置為 3.1.1。連接成功后,向 clean_session_false 主題發布三條消息。

在這里插入圖片描述

接著,選擇 MQTT_V3 連接,點擊連接按鈕重新連接到服務器,會收到三條離線消息。

在這里插入圖片描述

遺囑消息

MQTT 客戶端在向服務器發起 CONNECT 請求時,可以選擇是否發送遺囑消息標志,并指定遺囑消息的主題和有效載荷。

如果 MQTT 客戶端異常離線(在斷開連接前沒有向服務器發送 DISCONNECT 消息),MQTT 服務器會發布遺囑消息。

我們創建一個名為 Last Will 的連接來演示這個功能。為了快速看到效果,我們把 Keep Alive 設置為 5 秒。

  • Last-Will Topic 設置為 last_will
  • Last-Will QoS 設置為 1
  • Last-Will Retain 設置為 true
  • Last-Will Payload 設置為 offline

在這里插入圖片描述

連接成功后,我們斷開電腦網絡超過 5 秒(模擬客戶端異常斷開連接),然后再恢復網絡。

接著啟動 Simple Demo 連接,并訂閱 last_will 主題。您會收到 Last Will 連接設置的遺囑消息。

在這里插入圖片描述
本文詳細介紹了 MQTT 的基本概念和使用流程,您可以按照本文所學的內容嘗試使用 MQTT 協議。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/207093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207093.shtml
英文地址,請注明出處:http://en.pswp.cn/news/207093.shtml

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

相關文章

【WPF】使用ObservableCollection解決:累積計數x與實際計數x不相同

使用觀察模式和集合 錯誤代碼 public List<IPAddress> iPAddressDevices new List<IPAddress>();public List<IPAddress> IPAddressDevices { get > iPAddressDevices; set {iPAddressDevices value;RaisePropertyChanged(nameof(IPAddressDevices));…

spring IOC介紹

spring的Ioc真是個好東西啊&#xff0c;那它到底是什么東西呢&#xff0c;控制反轉&#xff0c;到底是怎么轉的呢&#xff1f; 假設啊你現在是一個導演&#xff0c;想排部戲&#xff0c;那是不是得需要演員和舞臺(spring中的bean)&#xff0c;如果按平常的編程思維就是new 一個…

vue-baidu-map實現在地圖上選擇范圍并解決相關問題

vue-baidu-map實現在地圖上選擇范圍并解決相關問題 實現地圖上選擇不規則范圍實現功能遇到的問題1、覆蓋物多邊形怎么才能蓋住覆蓋物點2、遇到其他問題 實現地圖上選擇不規則范圍 這個功能比較簡單&#xff0c;只需要使用vue-baidu-map插件的覆蓋物多邊形功能就行了。直接看文…

Win10專業版找不到安全中心選項的解決方法

在Win10電腦中&#xff0c;安全中心功能起到很大的作用。但是&#xff0c;有用戶在Win10專業版電腦上找不到安全中心選項&#xff0c;從而影響到自己的正常使用。下面小編分享解決Win10專業版系統沒有安全中心的簡單方法&#xff0c;解決后在Win10專業版就能成功找到安全中心了…

哈希表及其基礎(java詳解)

目錄 一、哈希表基礎 二、哈希函數的設計 哈希函數的設計原則 三、java中的hashCode 基本數據類型的hashCode使用 自定義類型的hashCode使用 需要注意 四、哈希沖突的處理 鏈地址法Seperate Chaining 五、實現屬于我們自己的哈希表 六、哈希表的動態空間處理和復雜…

通過項目管理軟件監管新員工入職流程的方法與策略

項目管理軟件是什么&#xff1f;項目管理軟件都能做什么&#xff1f;是不是只有項目團隊需要啊&#xff1f;NO&#xff01;項目管理軟件乍聽其名不免讓人覺得這不過是個項目領域的專用工具。 那什么是項目呢&#xff1f;項目是為創造獨特的產品、服務或成果而進行的體系化的工…

物聯網+AI智慧工地云平臺源碼(SaaS模式)

智慧工地云平臺充分運用數字化技術&#xff0c;聚焦施工現場崗位一線&#xff0c;依托物聯網、互聯網、AI等技術&#xff0c;圍繞施工現場管理的人、機、料、法、環五大維度&#xff0c;以及施工過程管理的進度、質量、安全三大體系為基礎應用&#xff0c;實現全面高效的工程管…

stm32中滴答定時器與普通定時器的區別

1、兩者在單片機中的位置不一樣 滴答定時器在內核上&#xff0c;普通定時器在外設上。 由于位置不同&#xff0c;滴答定時器的程序可以移植到所有相同內核的芯片上&#xff0c;但普通定時器的程序卻不可以。 2、兩者的中斷優先級不一樣 滴答定時器優先級高&#xff0c;普通定…

CTF刷題記錄

刷題 我的md5臟了KFC瘋狂星期四坤坤的csgo邀請simplePHPcurl 我的md5臟了 g0at無意間發現了被打亂的flag&#xff1a;I{i?8Sms??Cd_1?T51??F_1?} 但是好像缺了不少東西&#xff0c;flag的md5值已經通過py交易得到了&#xff1a;88875458bdd87af5dd2e3c750e534741 flag…

關于微信/支付寶等平臺驗簽/簽名sign生成算法

引言 我們在日常工作中經常會遇到對接微信平臺、支付寶平臺、或者自己對外開放一個api服務&#xff0c;那么這里經常會出現一個名字&#xff1a;sgin&#xff08;簽名&#xff09;。 舉個栗子 這是微信支付統一下單接口文檔&#xff0c;最簡單的理解就是&#xff0c;服務端為…

Unirest-Java:Java發起GET、POST、PUT、DELETE、文件上傳,文件下載工具類介紹

一、簡介 Unirest-Java是一個輕量級的HTTP客戶端庫&#xff0c;用于在Java應用程序中發送HTTP請求。 它提供了簡單易用的API&#xff0c;可以方便地處理GET、POST、PUT、DELETE等HTTP方法。 Unirest-Java支持異步和同步請求&#xff0c;可以輕松地與JSON、XML等數據格式進行…

最優化方法復習——線性規劃之對偶問題

一、線性規劃對偶問題定義 原問題&#xff1a; 對偶問題&#xff1a; &#xff08;1&#xff09;若一個模型為目標求 “極大”&#xff0c;約束為“小于等于” 的不等式&#xff0c;則它的對偶模型為目標求“極小”&#xff0c;約束是“大于等于”的不等式。即“Max&#xff0…

2024年甘肅省職業院校技能大賽信息安全管理與評估三階段理論樣題一

2024年甘肅省職業院校技能大賽高職學生組電子與信息大類信息安全管理與評估賽項樣題一 第六部分 理論技能與職業素養&#xff08;100 分&#xff09; 【注意事項】 1.該部分答題時長包含在第三階段競賽時長內&#xff0c;請在臨近競賽結束前提交。 2.參賽團隊可根據自身情況…

數據庫系統概論復習資料

數據庫系統概論考試需知 一、分值分布 1、判斷題&#xff08;10分&#xff09; 1分一個 2、填空題&#xff08;20分&#xff09; 2分一個 3、選擇題&#xff08;20分&#xff09; 2分一個 4、分析題&#xff08;30分&#xff09; 第一題10分&#xff0c;第二題…

如何設置echart圖表在vue頁面屏幕比例縮放自適應問題

問題&#xff1a;頁面的echart圖表在瀏覽器縮放屏幕比例時無法隨著屏幕的比例自動改變大小 解決方式&#xff1a; 可以通過監聽窗口的 resize 事件&#xff0c;并在事件回調函數中重新調整圖表的大小。 <template><div ref"chartContainer" style"w…

Enterprise Architect 12版本使用教程

Enterprise Architect 12版本使用教程 1.下載安裝Enterprise Architect 122.Enterprise Architect原始DDL模板配置及存在的問題1.DDL Column Definition原始模板&#xff08;沒有default值&#xff1a;可忽略&#xff09;2.DDL Data Type原始模板&#xff08;timestamp等時間字…

Apollo新版本Beta自動駕駛技術沙龍參會體驗有感—百度自動駕駛開源框架

在繁忙的都市生活中&#xff0c;我們時常對未來的科技發展充滿了好奇和期待。而近日&#xff0c;我有幸參加了一場引領科技潮流的線下技術沙龍&#xff0c;主題便是探索自動駕駛的魅力——一個讓我們身臨其境感受創新、了解技術巨擘的機會。 在12月2日我有幸參加了Apollo新版本…

智能優化算法應用:基于沙貓群算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼

智能優化算法應用&#xff1a;基于沙貓群算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼 文章目錄 智能優化算法應用&#xff1a;基于沙貓群算法無線傳感器網絡(WSN)覆蓋優化 - 附代碼1.無線傳感網絡節點模型2.覆蓋數學模型及分析3.沙貓群算法4.實驗參數設定5.算法結果6.參考文獻7.…

kotlin協程反編譯java學習原理

前情提要 GlobalScope.launch(Dispatchers.Main) { // 默認是Default異步 // 1.從當前協程體作用域Dispatchers.Main 協程依附的線程 到 掛起點 掛起函數 到 執行 請求耗時操作 而 切換到 IO異步線程 // 2.IO異步線程執行完成后&#xff0c;開始恢復&#xff0c;當前作…

modbus轉profinet網關解決plc插槽號不夠用的情況

PLC作為常用的控制設備之一&#xff0c;其插槽號有時會限制外部設備的連接數量。然而&#xff0c;通過使用modbus轉profinet網關&#xff0c;可以解決這一問題。這種設備能夠將modbus協議轉換為profinet協議&#xff0c;實現PLC與更多外部設備的連接。 modbus轉profinet網關還具…