什麼是 MQTT 協議及其工作原理?
https://www.emqx.com/en/blog/the-easiest-guide-to-getting-started-with-mqtt
本文將透過程式碼範例向讀者展示如何開始使用 MQTT 協定。IoT和MQTT初學者可以透過本文了解MQTT相關概念,快速開始發展MQTT服務與應用。
什麼是 MQTT?
MQTT(訊息佇列遙測傳輸)是一種輕量級、基於發布-訂閱的訊息傳遞協議,專為資源受限的設備和低頻寬、高延遲或不可靠的網路而設計。它廣泛應用於物聯網 (IoT) 應用,在感測器、執行器和其他設備之間提供高效的通訊。
為什麼 MQTT 是物聯網的最佳協定?
MQTT 因其針對物聯網系統特定需求而客製化的獨特特性和功能,已成為最好的物聯網協定之一。一些關鍵原因包括:
- 輕量級:物聯網設備通常在處理能力、記憶體和能耗方面受到限制。MQTT 的最小開銷和較小的資料包大小使其成為這些設備的理想選擇,因為它消耗的資源較少,即使在功能有限的情況下也能實現高效通訊。
- 可靠:物聯網網路可能會遇到高延遲或不穩定的連線。MQTT 支援不同的 QoS 等級、會話感知和持久連接,即使在具有挑戰性的條件下也能確保可靠的訊息傳遞,使其非常適合物聯網應用。
- 安全通訊:安全在物聯網網路中至關重要,因為它們經常傳輸敏感資料。MQTT 支援傳輸層安全性 (TLS) 和安全通訊端層 (SSL) 加密,確保傳輸過程中資料的機密性。此外,它還透過使用者名稱/密碼憑證或用戶端憑證提供身份驗證和授權機制,保護對網路及其資源的存取。
- 雙向性: MQTT 的發布-訂閱模型允許設備之間無縫雙向通訊。客戶端既可以向主題發布訊息,也可以訂閱接收特定主題的訊息,從而在不同的物聯網生態系統中實現有效的資料交換,而無需設備之間的直接耦合。該模型還簡化了新設備的集成,確保輕鬆擴展。
- 連續的、有狀態的會話: MQTT 允許客戶端與代理保持有狀態的會話,使系統即使在斷開連接後也能記住訂閱和未傳遞的訊息。用戶端還可以指定連線期間的保持活動間隔,這會提示代理定期檢查連線狀態。如果連線遺失,代理程式將儲存未傳遞的訊息(取決於 QoS 等級)並在用戶端重新連線時嘗試傳遞它們。此功能可確保可靠的通訊並降低因間歇性連線而導致資料遺失的風險。
- 大規模物聯網設備支援:物聯網系統通常涉及大量設備,需要能夠處理大規模部署的協定。MQTT 的輕量級特性、低頻寬消耗和資源的高效利用使其非常適合大規模物聯網應用。發布-訂閱模式允許 MQTT 有效擴展,因為它解耦了發送者和接收者,減少了網路流量和資源使用。此外,該協議支援不同的 QoS 級別,允許根據應用程式的需求自訂訊息傳遞,確保在各種場景下獲得最佳效能。
- 語言支援:物聯網系統通常包括使用各種程式語言開發的設備和應用程式。MQTT 廣泛的語言支援可輕鬆與多個平台和技術集成,從而促進不同物聯網生態系統中的無縫通訊和互通性。您可以造訪我們的MQTT 用戶端程式設計部落格系列,了解如何在 PHP、Node.js、Python、Golang、Node.js 和其他程式語言中使用 MQTT。
請閱讀我們的文章以了解更多資訊:什麼是 MQTT?為什麼它是物聯網的最佳協定?
MQTT 如何運作?
要了解 MQTT 的工作原理,首先需要掌握 MQTT Client、MQTT Broker、Publish-Subscribe 模式、Topic 和 QoS 的概念:
MQTT客戶端
任何執行MQTT 用戶端程式庫的應用程式或裝置都是 MQTT 用戶端。例如,使用MQTT的即時通訊應用程式是客戶端,各種使用MQTT上報資料的感測器是客戶端,各種MQTT測試工具也是客戶端。
MQTT 代理
MQTT Broker 處理用戶端連線、斷開連線、訂閱和取消訂閱請求以及路由訊息。強大的MQTT代理可以支援海量連接和百萬級訊息吞吐量,幫助物聯網服務供應商專注於業務,快速創建可靠的MQTT應用程式。
有關 MQTT 代理的更多詳細信息,請查看博客《2023 年 MQTT 代理比較終極指南》。
發布-訂閱模式
發布-訂閱模式與客戶端-伺服器模式的不同之處在於,它將發送訊息的用戶端(發布者)與接收訊息的用戶端(訂閱者)分開。發布者和訂閱者不需要建立直接連接,MQTT Broker 負責路由和分發所有訊息。
下圖顯示了 MQTT 發布/訂閱流程。溫度感測器作為客戶端連接MQTT伺服器,將溫度資料發佈到主題(例如Temperature
),伺服器接收訊息並將其轉發給訂閱該Temperature
主題的客戶端。
話題
MQTT 協定根據主題路由訊息。主題透過斜線來區分層次結構/
,類似於 URL 路徑,例如:
聊天/房間/ 1
感測器/10/溫度
感測器/+/溫度
MQTT 主題支援以下通配符:+
和#
。
+
: 表示單級通配符,例如a/+
匹配a/x
或a/y
。#
:表示多層通配符,如a/#
匹配a/x
,a/b/c/d
。
有關 MQTT 主題的更多詳細信息,請查看博客Understanding MQTT Topics & Wildcards by Case。
服務品質 (QoS)
MQTT提供三種服務質量,確保不同網路環境下訊息傳遞的可靠性。
- QoS 0:訊息最多傳遞一次。如果客戶端目前不可用,它將遺失此訊息。
- QoS 1:訊息至少傳遞一次。
- QoS 2:訊息僅傳遞一次。
有關 MQTT QoS 的更多詳細信息,請查看部落格MQTT QoS(服務品質)簡介。
MQTT 工作流程
現在我們了解了 MQTT 的基本組件,讓我們看看一般工作流程是如何運作的:
- 客戶端使用 TCP/IP 發起與代理的連接,並使用可選的 TLS/SSL 加密來實現安全通訊。用戶端提供身份驗證憑證並指定乾淨或持久性會話。
- 客戶端可以將訊息發佈到特定主題,也可以訂閱主題來接收訊息。發布客戶端向代理程式發送訊息,而訂閱客戶端表示有興趣接收有關特定主題的訊息。
- 代理商接收已發佈的訊息並將其轉發給訂閱相關主題的所有用戶端。它根據指定的服務品質 (QoS) 等級確保可靠的訊息傳遞,並根據會話類型管理已中斷連線的用戶端的訊息儲存。
MQTT 入門:快速教學
現在我們將透過一些簡單的演示向您展示如何開始使用 MQTT。在開始之前,您需要準備一個 MQTT Broker 和一個 MQTT Client。
準備 MQTT 代理
您可以透過私有部署或完全託管的雲端服務建立 MQTT 代理程式。或使用免費的公共經紀人進行測試。
私有部署
EMQX是適用於 IoT、 IIoT和連網車輛的最具可擴展性的開源 MQTT 代理。您可以執行以下 Docker 命令來安裝 EMQX。
docker run -d --name emqx -p 1883 : 1883 -p 8083 : 8083 -p 8084 : 8084 -p 8883 : 8883 -p 18083 : 18083 emqx/emem
完全託管的雲端服務
完全託管的雲端服務是啟動 MQTT 服務最簡單的方法。如下所示,EMQX Cloud在幾分鐘內啟動,並在 AWS、Google Cloud 和 Microsoft Azure 的 17 個區域運作。
免費公共 MQTT 代理
在本文中,我們將使用EMQ 提供的免費公共 MQTT 代理,該代理基於完全託管的MQTT 雲端服務 - EMQX Cloud創建。伺服器資訊如下。
- 經紀商地址:
broker.emqx.io
- TCP連接埠:
1883
- WebSocket連接埠:
8083
- 經紀商地址:
準備 MQTT 用戶端
在本篇文章中,我們將使用MQTTX提供的支援瀏覽器存取的 MQTT 用戶端工具:http://www.emqx.io/online-mqtt-client。MQTT X 也提供桌面用戶端和命令列工具。
MQTTX是一款優雅的跨平台 MQTT 5.0 桌面用戶端,可在 macOS、Linux 和 Windows 上運作。其用戶友好的聊天式介面使用戶能夠輕鬆創建多個 MQTT/MQTTS 連接並訂閱/發布 MQTT 訊息。
目前,所有程式語言都有成熟的開源 MQTT 用戶端程式庫。我們精選了多種程式語言的熱門MQTT客戶端程式庫和SDK,並提供了程式碼範例,幫助您快速了解MQTT客戶端的使用。
建立 MQTT 連接
在使用MQTT協定進行通訊之前,客戶端需要建立一個MQTT連線來連接到Broker。
使用瀏覽器造訪http://www.emqx.io/online-mqtt-client,點擊New Connection
頁面中間的按鈕,您將看到以下頁面。
我們進入Simple Demo
並Name
點擊Connect
右上角的按鈕來創建MQTT連接。出現如下則表示連線成功。
要了解有關 MQTT 連接參數的更多信息,請查看我們的部落格文章:建立 MQTT 連接時如何設定參數。
訂閱通配符主題
接下來,我們訂閱sensor/+/temperature
先前建立的 Simple Demo 連線中的通配符主題,該連線將接收所有感測器報告的溫度資料。
如下圖,點選按鈕,在彈出框的Topic欄位中New Subscription
輸入主題,保持預設的QoS為0。sensor/+/temperature
訂閱成功後,您將在訂閱清單中間看到一筆額外的記錄。
發布 MQTT 訊息
接下來,我們點擊+
左側選單上的按鈕建立兩個連接,Sensor 1
分別Sensor 2
模擬兩個溫度感測器。
連接建立後,您將看到三個連接,並且連接左側的線上狀態點將全部顯示為綠色。
選擇連接,在頁面左下角輸入Sensor 1
發布主題,在訊息框中輸入以下JSON格式訊息,然後點擊右下角的發布按鈕發送訊息。sensor/1/temperature
{
“味精” : “17.2”
}
訊息發送成功如下。
使用相同的步驟,將以下 JSON 訊息發佈到sensor/2/temperature
感測器 2 連接中的主題。
{
“味精” : “18.2”
}
您將看到簡單演示連接的兩個新訊息。
點擊簡單演示連接,您將看到兩個感測器發送的兩個訊息。
MQTT 特性演示
保留訊息
當MQTT客戶端向伺服器發布訊息時,可以設定Retained Message標誌。Retained Message駐留在訊息伺服器上,後續訂閱者訂閱該主題時仍可收到該訊息。
如下所示,我們正在向retained_message
感測器 1 連接中的主題發送兩個訊息,並Retain
選取該選項。
然後,我們訂閱retained_message
Simple Demo 連結中的主題。訂閱成功後,會收到Sensor 1發送的第二個保留訊息,這表示伺服器只會保留某個主題的最後一個保留訊息。
有關保留訊息的更多詳細信息,請查看部落格MQTT 保留訊息初學者指南。
清潔會議
一般情況下,MQTT客戶端只能在線上時接收其他客戶端發布的訊息。如果客戶端離線再上線,則離線期間不會收到訊息。
但是,如果客戶端在Clean Session 設定為false 的情況下連接,並使用相同的Client ID 再次上線,則訊息伺服器將為客戶端保留一定數量的離線訊息,並在客戶端再次上線時將其傳送給客戶端。
用於本示範的公共 MQTT 伺服器設定為保留離線訊息 5 分鐘,最大訊息數為 1000(無 QoS 0 訊息)。
接下來,我們建立一個 MQTT 3.1.1 連接並示範 QoS 1 的乾淨會話。
MQTT 5 使用 Clean Start 和 Session Expiry Interval 來改良 Clean Session。詳細資訊請參考部落格Clean Start and 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連接,點選連接按鈕連接伺服器,你會收到3個離線訊息。
有關 Clean Session 的更多詳細信息,請查看博客MQTT 持久會話和 Clean Session 解釋。
遺願
MQTT 用戶端向伺服器發出 CONNECT 請求時,可以設定是否要發送 Will Message 的標誌位,以及 Topic 和Payload。
當MQTT客戶端異常離線時(客戶端斷開連線前未向伺服器發送DISCONNECT訊息),MQTT伺服器會發布遺囑訊息。
如下所示,我們建立一個名為 的連線Last Will
。
- 為了快速看到效果,我們將Keep Alive設定為5秒。
- 將最後意願主題設定為
last_will
。 - 將 Last-Will QoS 設定為
1
。 - 將“最後將保留”設定為
true
。 - 將最後意願有效負載設定為
offline
。
連線成功後,我們斷開電腦網路5秒以上(模擬客戶端異常斷開),然後再次開啟網路。
然後啟動 Simple Demo 連接,並訂閱該last_will
主題。您將收到連接設定的遺囑訊息Last Will
。
有關 MQTT 遺囑消息的更多詳細信息,請查看博客MQTT 遺囑消息的使用。
了解有關 MQTT 的更多信息
至此,我們已經解釋和演示了 MQTT 的基本概念及其使用流程,讀者可以根據本文所學到的知識來嘗試使用 MQTT 協議。
接下來,您可以查看EMQ 提供的《MQTT 指南 2023:初級到高級》系列文章,以了解 MQTT 主題、通配符、保留訊息、Last-Will 等功能。探索 MQTT 的更高級應用程式並開始 MQTT 應用程式和服務開發。
沒有留言:
張貼留言