關於MQTT連接的屬性


 

  • 連接相關的屬性.

        這些屬性是MQTT的連接報文中連接標志字, 包含一些用於指定 MQTT 連接行為的參數.

        1.清理會話(Clean Session)

客戶端和服務端可以保存會話狀態,以支持跨網絡連接的可靠消息傳輸. 這個標志位用於控制會話狀態的生存時間.

值為0. 客戶端和服務器端基於會話狀態(用客戶端標識符識別)恢復與客戶端的通信.服務器端沒有該標識符, 則創建新的會話. 當連接斷開后, 客戶端和服務端必須保存會話信息. 同時, 服務器端必須保存客戶端訂閱過的QoS1和QoS2級別的消息為會話的一部分.

值為1. 客戶端和服務端必須丟棄之前的任何會話並開始一個新的會話.會話僅持續和網絡連接同樣長的時間. 與這個會話關聯的狀態數據不能被任何之后的會話重用.

客戶端的會話狀態包括:
 已經發送給服務端, 但是還沒有完成確認的 QoS 1 和 QoS 2 級別的消息.
 已從服務端接收, 但是還沒有完成確認的 QoS 2 級別的消息.
服務端的會話狀態包括:
 會話是否存在, 即使會話狀態的其它部分都是空.
 客戶端的訂閱信息.
 已經發送給客戶端, 但是還沒有完成確認的 QoS 1 和 QoS 2 級別的消息.
 即將傳輸給客戶端的 QoS 1 和 QoS 2 級別的消息.
 已從客戶端接收, 但是還沒有完成確認的 QoS 2 級別的消息.
 可選, 准備發送給客戶端的 QoS 0 級別的消息.

保留消息不是服務端會話狀態的一部分, 會話終止時不能刪除保留消息.

關鍵點:

1. 為了確保在發生故障時狀態的一致性, 客戶端應該使用會話狀態標志 1 重復請求連接, 直到連接成功.

2.一般來說, 客戶端連接時總是將清理會話標志設置為 0 或 1,並且不交替使用兩種值。 這個選擇取決於具體的應用.

清理會話標志設置為 1 的客戶端不會收到舊的應用消息, 而且在每次連接成功后都需要重新訂閱任何相關的主題.

清理會話標志設置為 0 的客戶端會收到所有在它連接斷開期間發布的 QoS 1 和 QoS 2 級別的消息.因此, 要確保不丟失連接斷開期間的消息, 需要使用 QoS 1 或QoS 2 級別,同時將清理會話標志設置為 0.

清理會話標志 0 的客戶端連接時, 服務端在連接斷開后會保留它的 MQTT 會話狀態. 如果打
算在之后的某個時間點重連到這個服務端, 客戶端連接應該只使用清理會話標志 0.

當客戶端決定之后不再使用這個會話時,應該將清理會話標志設置為 1 最后再連接一次,然后斷開連接.(釋放服務器資源).

清理會話規定了會話的時效性. 標志為0, 可以保障MQTT協議消息可靠遞出, 即便有延時; 標志為1, 可以節約服務器資源.

       2.遺囑標志(Will Flag)

遺囑標志(Will Flag) 被設置為 1,表示如果連接請求被接受了, 遺囑消息(Will Message) 必須被存儲在服務端並且與這個網絡連接關聯。當網絡連接關閉時,服務端必須發布這個遺囑消息, 除非服務端收到DISCONNECT 報文時刪除了這個遺囑消息

遺囑消息發布的條件, 包括但不限於:
 服務端檢測到了一個 I/O 錯誤或者網絡故障.
 客戶端在保持連接(Keep Alive)的時間內未能通訊.
 客戶端沒有先發送 DISCONNECT 報文直接關閉了網絡連接.
 由於協議錯誤服務端關閉了網絡連接.

如果遺囑標志被設置為 1,連接標志中的 Will QoS 和 Will Retain 字段會被服務端用到, 同時有效載荷中必須包含 Will Topic 和 Will Message 字段 .

一旦被發布或者服務端收到了客戶端發送的 DISCONNECT 報文, 遺囑消息就必須從存儲的會話狀態中移除 .

如果遺囑標志被設置為 0, 連接標志中的 Will QoS 和 Will Retain 字段必須設置為 0, 並且有效載荷中不能包含 Will Topic 和 Will Message 字段.

如果遺囑標志被設置為 0,網絡連接斷開時, 不能發送遺囑消息.

服務端應該迅速發布遺囑消息。在關機或故障的情況下, 服務端可以推遲遺囑消息的發布直到之后的重啟.如果發生了這種情況, 在服務器故障和遺囑消息被發布之間可能會有一個延遲.

遺囑標志確定了傳輸鏈路發生故障時MQTT協議的后手保障方案, 通過遺囑消息告訴訂閱者某個客戶端發生故障.

       3.遺囑消息質量(Will QoS)

遺囑消息質量用於指定發布遺囑消息時使用的服務質量等級. 只有使用了遺囑標志, 改項才能設置非0參數.

0. 最多發送一次.  (發送一次完事)                                                                                                                                     

1. 最少發送一次.  (可能發送多次,必須接到應答)                                                                      

2. 可靠發送一次.  (只發送一次, 並保證送達)

遺囑消息質量規定了遺囑消息發布的可靠性等級.

        4.遺囑保留(Will Retain)

只有使用了遺囑標志, 改項才能設置非0參數.

遺囑保留為 0, 服務端必須將遺囑消息當作非保留消息發布 .                                                 

遺囑保留為 1, 服務端必須將遺囑消息當作保留消息發布 .

遺囑保留規定了遺囑消息發布后的留存問題.

        5.用戶名標志(User Name Flag)

設置為 0, 有效載荷中不能包含用戶名字段.
設置為 1, 有效載荷中必須包含用戶名字段.

用戶名標志表示MQTT協議允許匿名登錄.具體和服務端的實現相關.

         6. 密碼標志(Password Flag)

設置為 0, 有效載荷中不能包含密碼字段.
設置為 1, 有效載荷中必須包含密碼字段.
如果用戶名標志被設置為 0, 密碼標志也必須設置為 0.

密碼標志表示匿名登錄不能有密碼, 非匿名登錄可以只用用戶名,也可以用戶名+密碼.

  • 發布相關的屬性.

       1.重發標志(DUP)

如果 DUP 標志被設置為 0, 表示這是客戶端或服務端第一次請求發送這個 PUBLISH 報文。 如果 DUP 標志被設置為 1,表示這可能是一個早前報文請求的重發。

客戶端或服務端請求重發一個 PUBLISH 報文時, 必須將 DUP 標志設置為 1.

對於 QoS0 的消息, DUP 標志必須設置為 0.

服務端發送 PUBLISH 報文給訂閱者時, 收到(入站) 的 PUBLISH 報文的 DUP 標志的值不會被傳播。 發送(出站) 的 PUBLISH 報文與收到(入站) 的 PUBLISH 報文中的 DUP 標志是獨立設置的, 它的值必須單獨的根據發送(出站) 的 PUBLISH 報文是否是一個重發來確定 .

關鍵點:

1.接收者收到一個 DUP 標志為 1 的控制報文時, 不能假設它看到了一個這個報文之前的一個副本.

2.需要特別指出的是, DUP 標志關注的是控制報文本身, 與它包含的應用消息無關.

當使用 QoS 1時, 客戶端可能會收到一個 DUP 標志為 0 的 PUBLISH 報文, 這個報文包含一個它之前收到過的應用消息的副本, 但是用的是不同的報文標識符。

發標志和使用MQTT的用戶無關, 和MQTT服務端和客戶端實現相關.

        2.服務質量等級(QoS)

這個字段表示應用消息分發的服務質量等級保證。

0. 最多發送一次.  (發送一次完事)                                                                                             

1. 最少發送一次.  (可能發送多次,必須接到應答)                                                                     

2. 可靠發送一次.  (只發送一次, 並保證送達)

        3.保留標志(Retain)

如果客戶端發給服務端的 PUBLISH 報文的保留(RETAIN) 標志被設置為 1, 服務端必須存儲這個應用消息和它的服務質量等級(QoS) ,以便它可以被分發給未來的主題名匹配的訂閱者 .

一個新的訂閱建立時,對每個匹配的主題名,如果存在最近保留的消息, 它必須被發送給這個訂閱者 .

如果服務端收到一條保留(RETAIN) 標志為 1 的 QoS 0 消息, 它必須丟棄之前為那個主題保留的任何消息. 它應該將這個新的 QoS 0 消息當作那個主題的新保留消息,但是任何時候都可以選擇丟棄它. 如果這種情況發生了, 那個主題將沒有保留消息 .

服務端發送 PUBLISH 報文給客戶端時,如果消息是作為客戶端一個新訂閱的結果發送, 它必須將報文的保留標志設為 1.

當一個 PUBLISH 報文發送給客戶端是因為匹配一個已建立的訂閱時,服務端必須將保留標志設為 0, 不管它收到的這個消息中保留標志的值是多少.

保留標志為 1 且有效載荷為零字節的 PUBLISH 報文會被服務端當作正常消息處理,它會被發送給訂閱主題匹配的客戶端。此外,同一個主題下任何現存的保留消息必須被移除,因此這個主題之后的任何訂閱者都不會收到一個保留消息 . 服務端不能存儲零字節的保留消息.

如果客戶端發給服務端的 PUBLISH 報文的保留標志位 0, 服務端不能存儲這個消息也不能移除或替換任何現存的保留消息.

保留消息標志標示着這條消息比較重要, 新的訂閱者需要收到. 新的保留消息會覆蓋舊的保留消息, 空的保留消息會清空以往的保留消息.

  • 訂閱主題相關的屬性

      1. Requested QoS

這個屬性是訂閱報文有效載荷的一部分, 用於表示訂閱的服務質量要求.

 

以上參考了《MQTT-3.1.1-CN》. 如發現錯誤, 敬請留言!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM