MQTT建立Broker的連接

Client連接到Broker

Client 連接到 Broker 的流程:

  • Client發送CONNECT數據包
  • Broker響應CONNACK數據包
    在這裏插入圖片描述

CONNECT數據包

連接的建立由 Client 端發起,Client 端首先向 Broker 發送一個 CONNECT 數據包,內容如下:

可變頭

  • 協議名稱(Protocol Name):值固定爲字符 “MQTT”。
  • 協議版本(Protocol Level):對 MQTT 3.1.1 來說,值爲 4。
  • 用戶名標識(User Name Flag):消息體中是否有用戶名字段,1bit,0 或者 1。
  • 密碼標識(Password Flag):消息體中是否有密碼字段,1bit,0 或者 1。
  • 遺願消息 Retain 標識(Will Retain):標識遺願消息是否是 Retain 消息,1bit,0 或者 1。
  • 遺願消息 QOS 標識(Will QOS):標識遺願消息的 QOS,2bit,0、1 或者 2。
  • 遺願標識(Will Flag):標識是否使用遺願消息,1bit,0 或者 1。
  • 會話清除標識(Clean Session):標識 Client 是否建立一個持久化的會話,1bit,0 或者 1,當 Clean Session 的標識設爲 0 時,代表 Client 希望建立一個持久會話的連接,Broker 將存儲該 Client 訂閱的主題和未接受的消息,否則 Broker 不會存儲這些數據,同時在建立連接時清除這個 Client 之前存在的持久化會話所保存的數據。
  • 連接保活(Keep Alive): 設置一個單位爲秒的時間間隔,Client 和 Broker 之間在這個時間間隔之內需要至少有一次消息交互,否則 Client 和 Broker 會認爲它們之間的連接已經斷開。

消息體

  • 客戶端標識符(Client Identifier):Client Identifier 是用來標識 Client 身份的字段,在 MQTT 3.1.1 的版本中,這個字段的長度是 1 到 23 個字節,而且只能包含數字和 26 個字母(包括大小寫),Broker 通過這個字段來區分不同的 Client。所以在連接的時候,Client 應該保證它的 Identifier 是唯一的,通常我們可以使用比如 UUID,唯一的設備硬件標識,或者 Android 設備的 DEVICE_ID 等作爲 Client Identifier 的取值來源。
  • MQTT 協議中要求 Client 連接時必須帶上 Client Identifier,但是也允許 Broker 在實現時 Client Identifier 爲空,這時 Broker 會爲 Client 分配一個內部唯一的 Identifier。如果你需要使用持久化會話,那就必須自己爲 Client 設定一個唯一的 Identifier。
  • 用戶名(Username):如果可變頭中的用戶名標識設爲 1,那麼消息體中將包含用戶名字段,Broker 可以使用用戶名和密碼來對接入的 Client 進行驗證,只允許已授權的 Client 接入。注意不同的 Client 需要使用不同的 Client Identifier,但它們可以使用同樣的用戶名和密碼進行連接。
  • 密碼(Password):如果可變頭中的密碼標識設爲 1,那麼消息體中將包含密碼字段。
  • 遺願主題(Will Topic):如果可變頭中的遺願標識設爲 1,那麼消息體中將包含遺願主題,當 Client 非正常地中斷連接的時候,Broker 將向指定的遺願主題中發佈遺願消息。
  • 遺願消息(Will Message):如果可變頭中的遺願標識設爲 1,那麼消息體中將包含遺願消息,當 Client 非正常地中斷連接的時候,Broker 將向指定的遺願主題中發佈由該字段指定的內容。

CONNACK

可變頭

  • 會話存在標識(Session Present Flag):用於標識在 Broker 上,是否已存在該 Client(用 Client Identifier 區分)的持久性會話,1bit,0 或者 1。當 Client 在連接時設置 Clean Session=1,則 CONNACK 中的 Session Present Flag 始終爲 0;當 Client 在連接時設置 Clean Session=0,那麼就有兩種情況——如果 Broker 上面保存了這個 Client 之前留下的持久性會話,那麼 CONNACK 中的 Session Present Flag 值爲 1;如果 Broker 沒有保存該 Client 的任何會話數據,那麼 CONNACK 中的 Session Present Flag 值爲 0。
  • 連接返回碼(Connect Return code):用於標識 Client 是 Broker 的連接是否建立成功,連接返回碼有以下一些值:
Return Code 連接狀態
0 連接已建立
1 連接被拒絕,不允許的協議版本
2 連接被拒絕,Client Identifier 被拒絕
3 連接被拒絕,服務器不可用
4 連接被拒絕,錯誤的用戶名或密碼
5 連接被拒絕,未授權

Client主動關閉連接

Client 主動關閉連接的流程非常簡單,只需要向 Broker 發送一個 DISCONNECT 數據包就可以了。DISCONNECT 數據包沒有可變頭(Variable header)和消息體(Payload)。在 Client 發送完 DISCONNECT 之後,就可以關閉底層的 TCP 連接了,不需要等待 Broker 的回覆(Broker 也不會對 DISCONNECT 數據包回覆)。
注:當 Broker 收到 Client 的 DISCONNECT 數據包的時候,它認爲 Client 是正常地斷開連接,那麼它會丟棄當前連接指定的遺願消息(Will Message)。如果 Broker 檢測到 Client 連接丟失,但又沒有收到 DISCONNECT 消息包,它會認爲 Client 是非正常斷開連接,就會向在連接的時候指定的遺願主題(Will Topic)發佈遺願消息(Will Message)。

Broker主動關閉連接

MQTT 協議規定 Broker 在沒有收到 Client 的 DISCONNECT 數據包之前都應該保持和 Client 連接,只有 Broker 在 Keep Alive 的時間間隔裏,沒有收到 Client 的任何 MQTT 數據包的時候會主動關閉連接。Broker 主動關閉連接之前不會向 Client 發送任何 MQTT 數據包,Broker會直接關閉底層的 TCP 連接。

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