2023年11月18日 星期六

建立MQTT連線時如何設定參數?

 建立MQTT連線時如何設定參數?

https://www.emqx.com/en/blog/how-to-set-parameters-when-establishing-an-mqtt-connection

EMQX團隊
2022 年 11 月 22 日
建立MQTT連線時如何設定參數?

建立MQTT連線是使用MQTT協定進行通訊的第一步。MQTT協定提供豐富的連接參數,使開發者能夠創建滿足不同業務需求的物聯網應用。

本文介紹了 MQTT 中各個連結參數的作用,幫助開發人員踏出使用 MQTT 的第一步。

MQTT 連接簡介

MQTT 連線是從客戶端發起到代理的。任何執行 MQTT 用戶端程式庫的應用程式或裝置都是MQTT 用戶端MQTT代理處理用戶端連線、斷開連線、訂閱(或取消訂閱)請求,並在接收發布請求時向上路由訊息。

與代理建立網路連線後,客戶端必須傳送的第一個訊息是資料包CONNECTBroker 必須CONNACK回覆客戶 a 作為回應,客戶端收到CONNACK資料包後 MQTT 連線成功建立。如果用戶端沒有CONNACK及時收到來自broker的封包(通常是用戶端可設定的逾時),它可能會主動關閉網路連線。

MQTT 協定規範不限制使用哪一種傳輸協定,MQTT 最常用的傳輸協定是 TCP/TLS 和 Websocket。EMQ 也透過 QUIC 實現了 MQTT

基於 TCP/TLS 的 MQTT

TCP/TLS 應用廣泛,是一種面向連線、可靠、基於位元組流的傳輸層通訊協定。它透過確認和重傳機制確保接收到的位元組與發送的位元組相同。

MQTT通常基於TCP/TLS,繼承了TCP/TLS的許多優點,可以在低頻寬、高延遲、資源受限的環境下穩定運作。

基於 WebSocket 的 MQTT

隨著Web技術的快速發展,越來越多的應用程式可以利用強大的UI渲染引擎在網頁瀏覽器中實現。WebSocket 是 Web 應用程式的本機通訊方法,也得到了廣泛的使用。

許多基於物聯網網路的應用程式(例如裝置監控系統)需要在瀏覽器中即時顯示設備資料。但瀏覽器基於HTTP協定傳輸數據,無法使用TCP上的MQTT。

MQTT 協定的創始人預見了 Web 應用的重要性,因此 MQTT 協定自創建以來就支持透過 MQTT over WebSocket 進行通訊。請查看博客,以了解有關如何透過 WebSocket 使用 MQTT 的更多資訊。

基於 QUIC 的 MQTT

QUIC (RFC 9000) 是下一代互聯網協議 HTTP/3 的底層傳輸協議,與 TCP/TLS 協議相比,它以更少的連接開銷和訊息延遲為現代行動互聯網提供連接。

基於 QUIC 非常適合 IoT 訊息傳遞場景的優勢,EMQX 5.0 在 QUIC 的基礎上引入了 MQTT。查看部落格以獲取更多資訊。

MQTT 連接參數的使用

連接位址

MQTT 的連接位址通常包括 Broker IP(或網域名稱)、Broker 連接埠和協定。對於叢集 MQTT 代理,通常會在前面放置一個負載平衡器,因此 IP 或網域實際上可能是負載平衡器。

基於 TCP 的 MQTT 連接

例如,mqtt://broker.emqx.io:1883是基於TCP的MQTT連線位址,mqtts://broker.emqx.io:1883是基於TLS/SSL的MQTT安全連線位址。

在某些客戶端程式庫中,基於 TCP 的連線是tcp://ip:1883

基於WebSocket的連接

使用WebSocket連線時,連線位址還需要包含Path。EMQX配置的預設路徑/mqtt

例如,ws://broker.emqx.io:8083/mqtt是基於WebSocket的MQTT連線位址,wss://broker.emqx.io:8083/mqtt是基於WebSocket的MQTT安全連線位址。

客戶ID

MQTT Broker 使用 Client ID 來識別客戶端,連接到 Broker 的每個客戶端都必須具有唯一的 Client ID。客戶端 ID 是 UTF-8 編碼的字串。如果用戶端使用零長度字串進行連接,則代理應為其指派一個唯一的字串。

根據代理的 MQTT 協定版本和實作細節,代理接受的有效字元集會有所不同。最保守的方案是使用字元[0-9a-zA-Z]並將長度限制為 23 個位元組。

由於客戶端 ID 的唯一性,如果兩個客戶端使用相同的客戶端 ID 連接到同一個代理,則較晚連接的客戶端將強制較早連接的客戶端下線。

使用者名稱密碼

MQTT 協定支援使用者名稱密碼驗證,但如果底層傳輸層未加密,使用者名稱和密碼將以明文形式傳輸,因此為了獲得最佳安全性,建議使用mqtts協定wss

大多數 MQTT 代理預設允許匿名登錄,這意味著無需提供使用者名稱或密碼(或設定空字串)。

連線逾時

接收broker資料包之前的等待時間CONNACK,如果CONNACK在這段時間內沒有收到,則連線被關閉。

活著

Keep Alive 是一個以秒為單位的時間間隔。當沒有訊息發送時,用戶端會根據Keep Alive的值定期向broker發送心跳訊息,以確保broker不會斷開連線。

連線成功建立後,如果Broker在1.5次Keep Alive時間內沒有收到客戶端發送的任何資料包,就會認為與客戶端的連線出現問題,Broker會中斷與客戶端的連線。

請查看部落格以了解有關 Keep Alive 的更多詳細資訊。

清潔會議

設定為false表示建立持久會話。當客戶端斷開連線時,會話仍然存在並保存離線訊息,直到會話過期。設定true為建立一個新的臨時會話,該會話在客戶端斷開連線時自動銷毀。

持久會話使訂閱用戶端可以在離線時接收訊息。該功能在網路不穩定的物聯網場景中非常有用。

代理為持久會話保留的訊息數量取決於代理的設定。例如, EMQ 提供的公共 MQTT 伺服器設定離線訊息保留 5 分鐘,最大訊息數量為 1000 條(針對 QoS 1 和 QoS 2 訊息)。

注意:持久會話復原的前提是客戶端以固定的Client ID重新連線。如果用戶端 ID 是動態的,則將建立一個新的持久性會話。

查看部落格以了解有關 Clean Session 的更多詳細資訊。

遺願

當設定了遺囑訊息的 MQTT 用戶端異常下線時,MQTT 伺服器會發布該用戶端設定的遺囑訊息。

意外下線包括:由於網路故障,連線被伺服器關閉;設備突然斷電;設備嘗試執行不允許的操作,連線被伺服器關閉等。

Will Message 可以看作是簡化的 MQTT 訊息,其中還包含 Topic、Payload、QoS、Retain 等。

  • 當設備意外離線時,遺囑訊息將發送至Will Topic.

  • Will Payload要傳送的訊息的內容。

  • Will QoS與標準 MQTT 訊息的 QoS 相同查看部落格以了解有關 MQTT QoS 的更多資訊。

  • 設定Will Retaintrue表示遺囑訊息是保留訊息。收到設定了標誌的訊息後retain,MQTT 代理程式必須儲存該訊息發佈到的主題的訊息,並且必須僅儲存最新訊息。這樣,對該主題感興趣的訂閱者可以離線,並隨時重新連接以接收最新訊息,而不必在訂閱後等待發布者的下一則訊息。

    查看部落格以了解有關 MQTT Retained 的更多資訊。

協定

最常用的 MQTT 協定版本是 MQTT v3.1、MQTT v3.1.1 和 MQTT v5.0。目前,MQTT 5.0已成為大多數物聯網企業的首選協議,我們建議初次使用MQTT的開發人員直接使用該版本。

請查看EMQ 提供的MQTT 5.0部落格系列,了解如何使用 MQTT 5.0 新功能。

MQTT v5.0 中的新連接參數

乾淨啟動和會話到期間隔

MQTT 5.0 中刪除了 Clean Session,但新增了 Clean Start 和 Session Expiry Interval。

當「乾淨啟動」時,true它會丟棄任何現有會話並建立一個新會話。false表示伺服器必須使用與客戶端 ID 關聯的會話來恢復與客戶端的通訊(除非會話不存在)。

如果「會話到期間隔」設定為 0 或不存在,則會話將在網路連線關閉時結束。如果是0xFFFFFFFF(UINT_MAX),則會話不會過期。如果大於 0,則網路連線關閉後會話將保留的秒數。

查看部落格以了解有關乾淨啟動和會話到期間隔的更多資訊。

連線屬性

MQTT 5.0也增加了新的連線屬性以增強協定的可擴充性。查看部落格以了解有關 Connect Properties 的更多資訊。

如何建立安全的MQTT連線?

儘管MQTT協定提供了使用者名稱密碼、客戶端ID等身份驗證機制,但這對於物聯網安全來說還不夠。基於TCP的明文傳輸通信,資料安全難以保證。

TLS(傳輸層安全性),或在某些情況下,新棄用的名稱 SSL,主要目的是在兩個或多個通訊電腦應用程式之間提供隱私和資料完整性。MQTT 在 TLS 之上運行,可以充分利用其安全功能來確保資料完整性和用戶端可信度。

啟用 SSL/TLS 的步驟因 MQTT 代理而異。EMQX 內建對 TLS/SSL 的支持,包括支援單向/雙向身份驗證、X.509 憑證、負載平衡 SSL 和許多其他安全認證。

單向身份驗證是一種僅透過驗證伺服器憑證來建立安全通訊的方法。它確保通訊是加密的,但無法驗證客戶端的真實性。它通常需要與使用者名稱密碼和客戶端 ID 等身份驗證機制結合。查看博客,了解如何建立安全的單向身份驗證 MQTT 連接。

雙向認證是指伺服器和用戶端在進行通訊認證時都必須提供證書,雙方都需要進行認證以確保對方是可信的。一些安全性要求較高的應用場景需要啟用雙向認證。查看博客,了解如何建立安全的雙向身份驗證 MQTT 連接。

注意:如果您在瀏覽器上使用 MQTT over WebSocket,則尚不支援雙向驗證通訊。

如何在瀏覽器中使用TLS/SSL雙向驗證連線?· 問題 #1515 · mqttjs/MQTT.js

概括

至此,您應該已經很好地了解了 MQTT 連接是如何建立的以及各個連接參數的作用。

接下來,您可以查看EMQ 提供的《MQTT 協議通俗指南》系列文章,以了解 MQTT Topics、通配符、保留訊息、Last-Will 等特性。探索 MQTT 的更高級應用程式並開始 MQTT 應用程式和服務開發。

沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...