物聯網之MQTT3.1.1和MQTT5協議 (15) DISCONNECT報文

前言

該報文爲控制報文,MQTT5將該報文的傳遞方向由單向變成雙向。

DISCONNECT – 斷開連接/斷開通知

MQTT3.1.1爲斷開連接,MQTT5爲斷開通知

【MQTT 3.1.1】

DISCONNECT報文是客戶端發給服務端的最後一個控制報文。表示客戶端正常斷開連接。

【MQTT 5】

DISCONNECT數據報文是從客戶端或服務器發送的最終MQTT控制數據報文。

它指示了網絡連接被關閉的原因。 客戶端或服務器可以在關閉網絡連接之前發送一個DISCONNECT數據報文。 如果網絡連接被關閉,而客戶端沒有首先發送原因碼爲0x00(正常斷開連接)的DISCONNECT數據報文,並且該連接有一個Will消息,則將發佈Will消息。

服務器在發送原因代碼小於0x80的CONNACK之前,不得發送DISCONNECT 報文。

固定報頭

在這裏插入圖片描述

服務端必須驗證所有的保留位都被設置爲0,如果它們不爲0,在MQTT3.1.1中則必須斷開連接,在MQTT5中,需要發送包含原因碼爲0x81(無效報文)的DISCONNECT報文。

剩餘長度字段
等於可變報頭的長度,編碼爲變長字節整數

DISCONNECT可變報頭(MQTT 5)

MQTT3.1.1 DISCONNECT報文沒有可變報頭

DISCONNECT報文的可變報頭按順序包含以下字段:斷開原因碼,屬性(Properties)。

斷開原因碼

可變報頭的第1個字節是斷開原因碼。如果剩餘長度小於1,則表示使用原因碼0x00(正常斷開)。

單字節無符號斷開原因碼字段如下所示。

斷開原因碼

在這裏插入圖片描述

客戶端或服務端發送DISCONNECT報文時必須使用一種DISCONNECT原因碼。如果原因碼爲0x00(正常斷開)且沒有屬性,原因碼和屬性長度可以被省略。這種情況下DISCONNECT報文剩餘長度爲0。

DISCONNECT報文用於指示斷開的原因,例如沒有確認報文(比如QoS等級0的發佈消息)或當客戶端或服務端不能繼續處理連接。

客戶端可以使用這些信息來決定是否重新連接,以及在重新嘗試之前應該等待多長時間。

DISCONNECT屬性(MQTT5)

屬性長度

DISCONNECT報文可變報頭中的屬性(Properties)的長度被編碼爲變長字節整數。如果剩餘長度小於2,屬性長度使用0。

會話過期間隔

17 (0x11)Byte,會話過期間隔(Session Expiry Interval)標識符。
跟隨其後的是用四字節整數表示的以秒爲單位的會話過期間隔(Session Expiry Interval)。包含多個會話2224 過期間隔將造成協議錯誤(Protocol Error)。

如果沒有設置會話過期間隔,則使用CONNECT報文中的會話過期間隔。

會話過期間隔不能由服務端的DISCONNECT報文發送。

如果CONNECT報文中的會話過期間隔爲0,則客戶端在DISCONNECT報文中設置非0會話過期間隔將造成協議錯誤(Protocol Error)。如果服務端收到這種非0會話過期間隔,則不會將其視爲有效的DISCONNECT報文。服務端使用包含原因碼爲0x82(協議錯誤)的DISCONNECT報文。

原因字符串

31 (0x1F)Byte,原因字符串(Reason String)標識符。
跟隨其後的是UTF-8編碼字符串表示斷開原因。此原因字符串是爲診斷而設計的可讀字符串,不應該被接收端所解析。

如果此屬性使得DISCONNECT報文的長度超出了接收端指定的最大報文長度,則發送端不能發送此屬性 。包含多個原因字符串將造成協議錯誤(Protocol Error)。

用戶屬性

38 (0x26)Byte,用戶屬性(User Property)標識符。

跟隨其後的是UTF-8字符串鍵值對。

此屬性可用於向客戶端提供包括診斷信息在內的附加信息。如果加上用戶屬性之後的DISCONNECT報文長度超出了接收端指定的最大報文長度,則發送端不能發送此屬性 。用戶屬性允許出現多次,以表示多個名字/值對,且相同的名字可以多次出現。

服務端參考

28 (0x1C)Byte,服務端參考列表(Server Reference)標識符。

跟隨其後的是一個UTF-8編碼字符串,客戶端可以使用它來識別其他要使用的服務端。包含多個服務端參考將造成協議錯誤(Protocol Error)。

服務端發送包含一個服務端參考和原因碼0x9C(使用其他服務端)或0x9D(服務端已移動)的DISCONNECT報文。

DISCONNECT報文可變報頭非規範示例

在這裏插入圖片描述

有效載荷

DISCONNECT報文沒有有效載荷。

DISCONNECT行爲

客戶端發送DISCONNECT報文之後:

  • 必須關閉網絡連接 。
  • 不能通過那個網絡連接再發送任何控制報文。

服務端在收到DISCONNECT報文時:

MQTT5則爲當服務端接收到包含原因碼爲0x00(成功)的DISCONNECT時,才:

  • 必須丟棄任何與當前連接關聯的未發佈的遺囑消息,而不發佈它

  • 【MQTT3.1.1】如果客戶端尚未關閉網絡連接,則應關閉網絡連接。

  • 【MQTT5】接收到DISCONNECT報文時,接收端應該關閉網絡連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章