1. 程式人生 > >[7] MQTT,mosquitto,Eclipse Paho---MQTT訊息格式之CONNACK訊息分析

[7] MQTT,mosquitto,Eclipse Paho---MQTT訊息格式之CONNACK訊息分析

在上節中( [6] MQTT,mosquitto,Eclipse Paho---MQTT訊息格式之CONNECT訊息格式分析)我們分析了CONNECT訊息格式,我們知道CONNECT訊息是客戶端傳送出去的,作為對客戶端的連線請求,伺服器端同樣會有一個訊息的返回,這個訊息就是CONNACK的訊息。我們在發出去CONNECT訊息後,如果WireShark抓包工具依然開啟的話,將會抓到類似於下面的TCP訊息,其16進製為:20 02 00 00,那麼其代表什麼意思呢?


首先我們來看CONNACK的訊息格式。CONNACK訊息沒有訊息負載(Payload),只有訊息頭:2個位元組的固定訊息頭和2兩個位元組的可變訊息頭。總共4個位元組

1. 固定訊息頭(Fixed Header): 16進位制資料為:20 02

具體的協議格式,請見下面的表1

表1 – 固定訊息頭(Fixed Header)的格式

Bit

7

6

5

4

3

2

1

0

byte 1

MQTT Control Packet Type (2)

Reserved

0

0

1

0

0

0

0

0

byte 2

Remaining Length (2)

0

0

0

0

0

0

1

0

20表示是其當前的訊息型別是:CONNACK
02 表示後面將跟著2個位元組.

2.可變訊息頭(Variable Header): 16進位制資料為:00 00

具體的協議格式,請見下面的表2

表2 – 可變訊息頭(Variable Header)的格式

描述

7

6

5

4

3

2

1

0

連線應答標誌位

保留(沒有使用)

SP1

byte 1

0

0

0

0

0

0

0

X

連線結果返回

byte 2

X

X

X

X

X

X

X

X

下面我們來分析其可變頭的2個位元組: 00 00

其中第一個00,目前沒有什麼特別的含義,是MQTT協議的保留欄位,也許在將來的協議版本中會用到。

第二個位元組的00 表示連線成功。MQTT協議對於返回的結果總共定義了6種類型(請見下面的表3): 連線接受,連線拒絕(不可接受的版本),連線拒絕(Client ID伺服器不允許),連線拒絕(伺服器不可達),連線拒絕(錯誤的使用者名稱和密碼),連線拒絕(客戶端沒有通過授權認證)。

表3 – 連線應答返回碼值的含義

返回的連線碼

描述

0

0x00 連線接受

連線接受

1

0x01 連線拒絕(不可接受的版本)

服務端不支援所連線的MQTT的協議

2

0x02 連線拒絕(Client ID伺服器不允許)

Client ID符合UTF-8的標準,但是伺服器不允許這個Client ID

3

0x03 連線拒絕(伺服器不可達)

MQTT 伺服器不可達

4

0x04 連線拒絕(錯誤的使用者名稱和密碼)

錯誤的使用者名稱和密碼

5

0x05 連線拒絕(客戶端沒有通過授權認證)

客戶端沒有通過授權認證

6-255

未來保留欄位


這個訊息格式簡單吧,嘿嘿恭喜你在學習MQTT訊息格式的旅途中又往前快速前進了一步,下章節,筆者將會繼續講解SUBSCRIBE訊息格式,敬請關注和期待,謝謝.