[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訊息格式,敬請關注和期待,謝謝.