MQTT協議之連線

2021-09-11 08:44:00 字數 4453 閱讀 2977

客戶端和服務端建立連線之後,傳送的第乙個報文必須是connect。客戶端只能傳送一次connect報文,如果服務端收到了第二個connect報文,必須將其視為錯誤,並且斷開連線。

協議格式

固定報頭

可變報頭

可變報頭分為四個部分,分別是協議名稱(protocol name),協議級別(protocol level),連線標誌(connect flags),保持連線(keep alive)。

協議名稱

協議名是mqtt的utf-8編碼的字串。mqtt規範的後續版本不會改變這個字串的偏移和長度。

如果協議不正確服務端斷開連線。(mqtt 3.1.1)其他規範中可以有其他規範。

資料報檢測工具,可以使用協議名來識別mqtt流量。

協議級別

使用8位來表示協議的修訂版本級別。mqtt3.1.1的協議級別為4。這個也是mqtt5的由來,mqtt5的協議級別為5,故稱為mqtt5。

服務端收到乙個自己不支援的協議級別的時候,必須返回乙個returncode為0x01的connack的報文給客戶端,隨後服務端斷開相應的連線。

連線標誌

服務端必須校驗連線標誌中的預留字段是否為0,如果不為0,必須斷開該連線。

清理會話標誌

a. 清理會話標誌的表現

a.清理會話標誌為0(false)

i.如果已存在相同clientid的會話,則必須恢復相應的會話。

ii.不存在相同clientid的會話,則重新建立乙個新的會話。

iii.客戶端和服務端斷開連線後,服務端必須儲存相應的會話資訊。

iv.連線斷開後,服務端必須保留該session所有的訂閱topic的qos1和qos2的訊息。服務端也可以保留qos0的訊息,此為可選項。

b.清理會話標誌1(true) 客戶端和服務端都必須丟棄之前的會話並且重新建立乙個會話。會話資訊是和連線繫結的,該會話相關的資料,不能被後續的會話使用

b. 狀態資訊

a. 客戶端

i.qos和qos2已經傳送到服務端,但是還沒有完全結束的訊息。

ii.qos2已經收到的訊息,但是還沒有最終完成的訊息。

b. 服務端

i.會話存在的資訊,即時會話的其他內容都是空的。

ii.客戶端的訂閱資訊。

iii.qos1和qos2已經傳送到客戶端但是沒有完全結束的訊息。

iv.qos2已經收到的,但是還沒有最終結束的訊息。

v.等待傳送給客戶端的qos1和qos2訊息。

vi.可選的等待傳送給客戶端的qos0的訊息。

c. 注意事項

a. 保留訊息不是服務端會話狀態的一部分,會話中止時不能刪除。

b. 清理會話設定為1時,客戶端和服務端的狀態刪除不需要是原子操作。

c. 如果希望保證在異常時的狀態一致性,可以通過清理會話標誌始終設定為1直到成功連線上服務。

遺囑標誌 遺囑標誌設定了(1或者true)之後,連線建立成功之後,遺囑訊息會被儲存在服務端並且和這個網路連線繫結,當該網路連線異常關閉時,服務端必須發布這個遺囑訊息,除非客戶端傳送了disconnect訊息後,服務端刪除了該訊息。

a. 遺囑訊息發布的條件,包括但不限於

a. 服務端檢測到io錯誤或者網路故障。

b. 客戶端在保持連線的時間內未能通訊。

c. 客戶端沒有先傳送disconnect報文而直接關閉了連線。

d. 由於協議錯誤服務端關閉了網路連線。

a. 遺囑標誌設定後,will qos和will retain會被用到,有效載荷必需包含will topic和will message。

b. 被發布或收到客戶端的disconnect報文之後,遺囑訊息必須從儲存中刪除。

c. 遺囑標誌設定為0時,will qos和will retain欄位必須設定為0,並且有效載荷中不能包含will topic和will message.

d. 服務端應該迅速發布遺囑訊息。在關機或者故障的情況下,服務端可以推遲發布訊息到服務恢復。

遺囑訊息qos 遺囑訊息的qos。

遺囑預留訊息 遺囑訊息的保留標誌。

使用者名稱標誌 表示是否又使用者名稱在有效載荷中。

密碼標誌 表示是否又密碼在有效載荷中,如果使用者名稱標誌為0,該字段也必須為0。

保持連線

保持連線單位為秒(s),兩個byte 16位表示,所以最長的keepalive的時間為18小時12分15秒。

表示的是客戶端從傳送完乙個報文到傳送下乙個報文,兩者之間允許的最大時間間隔。客戶端負責保證控制報文傳送的時間間隔不超過保持連線的值,如果沒有其他的報文可以傳送,客戶端必須傳送pingreq報文。

客戶端可以隨時傳送pingreq報文,並且根絕pingresp的報文判斷和服務端的活動狀態。

如果服務端在1.5倍的保持連線(非0)時間內沒有收到任何的報文,服務端必須斷開相應的連線。

客戶端傳送pingreq之後,在規定的時間沒有收到服務端的pingresp報文的回應,客戶端應該斷開該連線。

保持連線設定為0表示關閉保持連線的功能。服務端不需要因為客戶端的不活躍而斷開連線。

服務端主要認為客戶端是不活躍或者無響應的,都可以斷開客戶端連線。

有效載荷

有效載荷中的字段包含乙個或者多個是根據可變報頭中的標誌來決定有無的。如果存在的話,必須按照如下的順序,clientid, will topic, will message, user name, password。

clientid

a. 每個客戶端連線服務端必須有乙個唯一的clientid標誌。該標誌是客戶端和服務端用來區分會話的唯一標誌。

b. 必須提供並且必須是connect報文有效負載的第乙個字段。

c. 必須[1-23]的utf-8編碼,包含的內容必須是[0-9][a-z][a-z]。服務端也可以支援更長的以及其他的utf-8字元。

d. 如果clientid是0位元組的,服務端必須為其賦予乙個唯一的標誌,然後進行後續的處理。clientid為0位元組時有如下的限制,

a. 清理會話標誌必須設定為1,否則服務端返回returncode=0x02的connack,並且關閉該網路連線。

e. 服務端如果拒絕該clientid,服務端必須返回returncode=0x02的connack,並且關閉該網路連線。

will topic 遺囑訊息的topic,必須是utf-8編碼的字串。

will message 遺囑訊息的內容。

user name 使用者名稱,必須是utf-8的字串。

passowrd

由兩個byte表示的二進位制資料標識。最長可以為65535bytes的二進位制。

響應

檢驗
網路建立後,服務端在指定時間內沒有收到客戶端的connect訊息,服務端應該關閉連線。

服務端必須按照以上規範來驗證connect報文,如果不符合規範,服務端必須關閉連線,而且不需要傳送connack。

服務端可以檢查connect的內容,如果任何乙個檢查沒有通過,應該返回乙個指定的connack的報文,並且必須關閉該連線。

服務端檢驗通過後的處理

如果又相同clientid的連線,服務端必須關閉已有的連線。

服務端需要處理和清理會話相關的內容。

返回客戶端connack。

開始訊息投遞和保活監控。 備註:客戶端可以不等待connack的返回,直接傳送其他的控制報文,如果服務端拒絕了相應的連線,服務端必須不處理connect報文之後的任何協議。

connack

服務端返回給客戶端的第乙個協議必須是connack報文。

協議格式

固定報頭

固定報頭中只有報文型別為2。

可變報頭

可變報頭包含連線確認標誌和連線返回碼。

連線確認標誌

保留位必須為0

當前會話sp

a. 服務端如果沒有之前的會話時,該值為0。

b. 如果returncode=0(連線被接收),服務端存在之前的會話,該值為1。

c. 該標誌能夠是客戶端和服務端是否又已存在會話保持一致,如果兩者不一致,客戶端可以選擇斷開連線或者繼續連線。客戶端可以通過斷開連線,清理會話設定為1,再次連線,然後再次斷開連線的方式來丟棄客戶端和服務端的會話狀態。

d. 如果返回碼非0,會話狀態必須為0。

連線返回碼

有效載荷

connack報文沒有有效載荷字段。

總結連線報文是mqtt連線建立之後的第乙個報文,如果不是將會斷開連線,並且連線報文也只能傳送一次。

清理會話的設定也是通過連線報文進行設定,可以通過重新連線,設定清理會話的標誌來保持客戶端和服務端的會話資訊。

遺言是跟連線繫結的,在使用者非正常disconnect的情況下將觸發遺言的發布。

MQTT協議 MQTT協議簡介

mqtt messagequeuing telemetry transport,訊息佇列遙測傳輸 是ibm開發的乙個即時通訊協議。mqtt是面向m2m和物聯網的連線協議,採用輕量級發布和訂閱訊息傳輸機制。它的設計思想是輕巧 開放 簡單 規範,因此易於實現。這些特點使得它對很多場景來說都是很好的選擇,...

MQTT協議 MQTT協議解析

協議就是通訊雙方的乙個約定,即,表示第1位傳輸的什麼 第2位傳輸的什麼 在mqtt協議中,乙個mqtt資料報由 固定頭 fixed header 可變頭 variable header 訊息體 payload 三部分構成。mqtt 資料報結構 固定頭存在於所有mqtt資料報中,其結構如下 bit76...

物聯網協議之 MQTT協議

mqtt協議 message queuing telemetry transport 遙信訊息佇列傳輸,是ibm公司於1999年提出的,現在最新版本是3.1.1。mqtt是乙個基於tcp的發布訂閱協議,設計的初始目的是為了極有限的記憶體裝置和網路頻寬很低的網路不可靠的通訊,非常適合物聯網通訊。如上圖...