本課程會深入淺出地介紹 MQTT 協議的各種特性,對每個協議特性都輔以具體代碼進行講解,並通過一個 IoT+AI 項目實戰來具體展現 MQTT 在移動端、Web 端的使用,MQTT Broker 的架設等場景。
內容如下:
1.MQTT協議簡介
2.MQTT的基礎概念
3.建議到MQTT Broker的鏈接(1)
4.建議到MQTT Broker的鏈接(2)
5.訂閱和發布模型
6.訂閱一個主題
7.QoS0和QoS1是什麼
8.QoS2和QoS的最佳實踐
9.Retained消息和LWT
10.Keep Alive和鏈接保活
11.實踐課IoT+AI之發布端
12.實踐課IoT+AI之Web訂閱端
13.搭建MQTT Broker和安全實踐
這一課我們來學習 MQTT 協議中的 Keep Alive 機制。本節課核心內容:
Keep Alive
代碼實踐
如何在移動端保持 MQTT 連接
Keep Alive
在上一課中,我們提到過 Broker 需要知道 Client 是否非正常地斷開了和它的連接,以發送遺願消息。實際上 Client 也需要能夠很快地檢測到它失去了和 Broker 的連接,以便重新連接。
MQTT 協議是基於 TCP 的一個應用層協議,理論上 TCP 協議在丟失連接時會通知上層應用,但是 TCP 有一個半打開連接的問題(half-open connection)。這裏我不打算深入分析 TCP 協議,需要記住的是,在這種狀態下,一端的 TCP 連接已經失效,但是另外一端並不知情,它認爲連接依然是打開的,它需要很長的時間才能感知到對端連接已經斷開了,這種情況在使用移動或者衛星網絡的時候尤爲常見。
僅僅依賴 TCP 層的連接狀態監測是不夠的,於是 MQTT 協議設計了一套 Keep Alive 機制。回憶一下,在建立連接的時候,我們可以傳遞一個 Keep Alive 參數,它的單位爲秒,MQTT 協議中約定:在 1.5*Keep Alive 的時間間隔內,如果 Broker 沒有收到來自 Client 的任何數據包,那麼 Broker 認爲它和 Client 之間的連接已經斷開;同樣地, 如果 Client 沒有收到來自 Broker 的任何數據包,那麼 Client 認爲它和 Broker 之間的連接已經斷開。
MQTT 還有一對 PINGREQ/PINGRESP 數據包,當 Broker 和 Client 之間沒有任何數據包傳輸的時候,可以通過 PINGREQ/PINGRESP 來滿足 Keep Alive 的約定和偵測連接狀態。
「PINGREQ」
PINGREQ 數據包沒有可變頭(Variable header)和消息體(Payload),當 Client 在一個 Keep Alive 時間間隔內沒有向 Broker 發送任何數據包,比如 PUBLISH 和 SUBSCRIBE 的時候,它應該向 Broker 發送 PINGREQ 數據包。
「PINGRESP」
PINGRESP 數據包沒有可變頭(Variable header)和消息體(Payload),當 Broker 收到來自 Client 的 PINGREQ 數據包,它應該回復 Client 一個 PINGRESP 數據包。
對於 Keep Alive 機制,我們還需要記住以下幾點:
如果在一個 Keep Alive 時間間隔內,Client 和 Broker 有過數據包傳輸,比如 PUBLISH,Client 就沒有必要再使用 PINGREQ 了,在網絡資源比較緊張的情況下這點很重要;
Keep Alive 值是由 Client 指定的,不同的 Client 可以指定不同的值;
Keep Alive 的最大值爲 18 小時 12 分 15 秒;
Keep Alive 值如果設爲 0 的話,代表不使用 Keep Alive 機制。
代碼實踐
我們首先來完成一個 Client 的代碼, 它會把發送和收到的 PINGREQ/PINGRESP 打印出來。