2023年11月18日 星期六

MQTT Keep Alive 參數的作用是什麼?

 MQTT Keep Alive 參數的作用是什麼?

https://www.emqx.com/en/blog/mqtt-keep-alive

EMQX團隊
2022 年 8 月 12 日
MQTT Keep Alive 參數的作用是什麼?

為什麼我們需要保持活力

MQTT 協定託管在 TCP 協定之上,該協定是面向連接的,並在兩個連接方之間提供穩定且有序的位元組流。然而,在某些情況下,TCP 可能會出現半連接問題。半連接是指一側的連接已斷開或未建立,而另一側的連接仍保持著。在這種情況下,半連接的一方可能會不斷地發送數據,而這些數據顯然永遠不會到達另一方。為了避免半連接造成的通訊黑洞,MQTT協定提供了Keep Alive機制,讓客戶端和MQTT伺服器判斷是否有半連線問題,並關閉對應的連線。

MQTT Keep Alive 機制及使用

連接時

MQTT 用戶端建立與MQTT 伺服器的連線時,透過將連線請求協定封包中的 Keep Alive 變數頭字段設為非零值,可以在通訊雙方之間啟用 Keep Alive 機制。Keep Alive 是 0 到 65535 之間的整數,表示客戶端發送的 MQTT 協定封包之間允許經過的最長時間(以秒為單位)。

當代理程式收到來自客戶端的連線請求時,它會檢查變數標頭中的 Keep Alive 欄位的值。當有值時,代理程式將啟用 Keep Alive 機制。

MQTT 5.0 伺服器保持活動狀態

MQTT 5.0標準中,還引入了Server Keep Alive的概念,允許代理根據其實現和其他因素選擇接受客戶端請求中攜帶的Keep Alive值,或覆蓋它。如果broker選擇覆蓋這個值,它需要在連接確認包(CONNACK)的Server Keep Alive字段中設定新的值,並且客戶端在讀取時需要使用這個值來覆蓋自己之前的Keep Alive值它在康納克。

保持活動過程

客戶端進程

連線建立後,客戶端需要確保任兩個發送的MQTT協定封包之間的時間間隔不超過Keep Alive值。如果用戶端空閒且沒有封包要傳送,則可以傳送 PINGREQ 協定封包。

當客戶端傳送 PINGREQ 封包時,代理程式必須傳回 PINGRESP 封包。如果用戶端在可靠時間內沒有收到伺服器傳送的 PINGRESP 封包,則表示存在半連線、broker 離線或網路故障,用戶端應關閉連線。

經紀流程

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

如果broker收到客戶端發送的PINGREQ協定封包,則需要回覆PINGRESP協定封包進行確認。

客戶接管機制

當broker內部存在半連接,且對應的客戶端啟動重連或新連接時,broker會啟動客戶端接管機制:關閉舊的半連接,並與客戶端建立新的連接。

這種機制保證了客戶端不會因為半連線問題而無法重新連線。

保持活力並遺囑消息

Keep Alive 通常與 Will Message 結合使用,讓裝置在發生意外離線事件時及時通知其他用戶端。

如圖所示,當該客戶端連接時,Keep Alive 設定為 5 秒,並設定 will 訊息。如果伺服器在 7.5 秒(Keep Alive 的 1.5 倍)內沒有收到客戶端的任何資料包,則會向「last_will」主題發送一條負載為「offline」的 will 訊息。

MQTT 訊息

有關 MQTT 遺囑消息的更多詳細信息,請查看博客MQTT 遺囑消息的使用

如何在 EMQX 使用 Keep Alive

EMQX中,您可以透過設定檔自訂 Server Keep Alive 機制的行為。相關欄位如下:

zone.external.server_keepalive

類型預設
整數-

如果未設定此值,則保持活動時間將由用戶端在建立連線時決定。

如果設定此值,代理程式將強制為該區域中的所有連線啟用伺服器保持活動機制,並將使用該值覆寫用戶端連線請求中的值。

zone.external.keepalive_backoff

類型可選值預設
漂浮> 0.50.75

MQTT 協定要求 Broker 在 1.5 倍的 Keep Alive 時間內沒有收到客戶端發送的任何協定資料包時,就認為客戶端已斷開連線。

在 EMQX 中,我們引入了 keepalive 退避因子,並透過設定檔暴露該因子,以便使用者更靈活地控制 Broker 端的 Keep Alive 行為。

引入退避因子後,EMQX 使用下列公式計算最大逾時:

保活*退避* 2

退避的預設值為 0.75。因此,當使用者不修改此配置時,EMQX 的行為將完全符合 MQTT 標準。

有關更多信息,請參閱EMQX 配置文件。

注意:為 WebSocket 連線設定 Keep Alive

EMQX 支援客戶端透過 WebSocket 進行存取。當客戶端使用WebSockets發起連線時,只需在客戶端連線參數中設定Keep Alive值即可。請參閱透過 WebSocket 使用 MQTT 快速入門指南

概括

本文介紹 MQTT 協定中的 Keep Alive 機制以及如何在 EMQX 中使用它。您可以使用此功能來確保MQTT 連接的穩定性並建立更強大的 IoT 應用程式。

接下來,您可以查看EMQ 提供的《MQTT 協定淺顯指南》系列文章,了解 MQTT 協定特性,探索 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...