title: protocol-app-mqtt-summary
date: 2020-02-09 23:16:51
categories:
tags:
- mqtt
- protocol
- manual
背景
經過幾天的學習與實操,對於MQTT(主要針對 v3.1.1版本)的學習告一段落,為了方便日后的查閱
章節整理
MQTT 協議學習:000-有關概念入門 : 學習新東西最重要的步驟,我覺得就是明確有關的概念。
MQTT 協議學習:001-搭建MQTT通信環境,並抓包測試 : 明確概念以后,實操一遍,對於學習可以有一個初步的了解。
MQTT 協議學習:002- 通信報文的構成 : 從本章開始,開始慢慢引入 構成 通信協議 的有關組成。
MQTT 協議學習:003-MQTT通信流程介紹 : 在圖表中,介紹了 通信的流程。
MQTT 協議學習:004-MQTT建立通信與 CONNECT 、CONNACK 報文: 通信流程中的第一個流程便是建立連接,在連接有關的報文中,擁有對應的設置。
MQTT 協議學習: QoS等級 與 會話:QoS 等級是 通信中流程 一個比較重要的設置,這個設置決定了 通信的一些流程。
MQTT 協議學習:Retained(保留消息) 與 LWT(最后遺囑): 保留消息 與 遺囑 在 應用中比較常一起使用。
MQTT 協議學習:005-發布消息 與 對應報文 (PUBLISH、PUBACK、PUBREC、PUBREL): 介紹了如何 發布消息,與其對應的就是 訂閱主題 以 接收 消息。
MQTT 協議學習:006-訂閱主題 與 對應報文(SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK): 介紹了如何訂閱一個主題。
MQTT 協議學習:007-Keep Alive 連接保活 與 對應報文(PINGREQ、PINGRESP) : 保活機制是如何實現的。
MQTT 協議學習:008-在STM32上移植MQTT : STM32 移植 MQTT 的難點在於 對於通信接口的初始化等處理,由於有關的開發板還沒到手,本人放棄了紙上談兵。
arm linux 移植 MQTT (paho、mosquitto) : arm linux移植 的文章在本人的博客中經常出現,講述了如何在 Linux 平台下 搭建 MQTT 通信。
MQTT v5 (MQTT 5.0) 新特性介紹: 作為新版本的有關介紹,此后暫無 有關的 報文介紹
速查表
這里整理了一些速查表,可以翻閱以快速定位在開發中出現的有關問題。
固定頭部
協議類型
Byte1的 Bit[7-4]: MQTT Control Packet type,協議類型。總共可以表示16種協議類型,其中0000和1111是保留字段。
| 報文類型 | Bit[7-4]值 | 數據方向 | 描述 |
|---|---|---|---|
| 保留 | 0000 | 禁用 | 保留 |
| CONNECT | 0001 | Client ---> Server | 客戶端連接到服務器 |
| CONNACK | 0010 | Server ---> Client | 連接確認 |
| PUBLISH | 0011 | Client <--> Server | 發布消息 |
| PUBACK | 0100 | Client <--> Server | 發不確認 |
| PUBREC | 0101 | Client <--> Server | 消息已接收(QoS2第一階段) |
| PUBREL | 0110 | Client <--> Server | 消息釋放(QoS2第二階段) |
| PUBCOMP | 0111 | Client <--> Server | 發布結束(QoS2第三階段) |
| SUBSCRIBE | 1000 | Client ---> Server | 客戶端訂閱請求 |
| SUBACK | 1001 | Server ---> Client | 服務端訂閱確認 |
| UNSUBACRIBE | 1010 | Client ---> Server | 客戶端取消訂閱 |
| UNSUBACK | 1011 | Server ---> Client | 服務端取消訂閱確認 |
| PINGREQ | 1100 | Client ---> Server | 客戶端發送心跳 |
| PINGRESP | 1101 | Server ---> Client | 服務端回復心跳 |
| DISCONNECT | 1110 | Client ---> Server | 客戶端斷開連接請求 |
| 保留 | 1111 | 禁用 | 保留 |
報文類型標志位
Byte1的 Bit[3-0]: Flags specific to each MQTT Control Packet type,字節位用作某些報文類型的標志位。
實際上只有少數報文類型有控制位,如下表。
| 報文類型 | 固定頭標記 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
|---|---|---|---|---|---|
| CONNECT | 保留 | 0 | 0 | 0 | 0 |
| CONNACK | 保留 | 0 | 0 | 0 | 0 |
| PUBLISH | Used in MQTT 3.1.1 | DUP | QoS | QoS | RETAIN |
| PUBACK | 保留 | 0 | 0 | 0 | 0 |
| PUBREC | 保留 | 0 | 0 | 0 | 0 |
| PUBREL | 保留 | 0 | 0 | 1 | 0 |
| PUBCOMP | 保留 | 0 | 0 | 0 | 0 |
| SUBSCRIBE | 保留 | 0 | 0 | 1 | 0 |
| SUBACK | 保留 | 0 | 0 | 0 | 0 |
| UNSUBACRIBE | 保留 | 0 | 0 | 1 | 0 |
| UNSUBACK | 保留 | 0 | 0 | 0 | 0 |
| PINGREQ | 保留 | 0 | 0 | 0 | 0 |
| PINGRESP | 保留 | 0 | 0 | 0 | 0 |
| DISCONNECT | 保留 | 0 | 0 | 0 | 0 |
可變頭
需要報文標識符的控制報文在 下表 - 包含報文標識符的控制報文 Control Packets that contain a Packet Identifier 中列出。
需要報文標識符的控制報文在 下表 - 包含報文標識符的控制報文 Control Packets that contain a Packet Identifier`中列出。
| 控制報文 | 報文標識符字段 |
|---|---|
| PUBLISH | YES(QoS > 0) |
| PUBACK | YES |
| PUBREC | YES |
| PUBREL | YES |
| PUBCOMP | YES |
| SUBSCRIBE | YES |
| SUBACK | YES |
| UNSUBSCRIBE | YES |
| UNSUBACK | YES |
Payload消息體
下表 - 包含有效載荷的控制報文 Control Packets that contain a Payload 列出了需要有效載荷的控制報文。
並非所有的報文類型需要包含Payload。
| 控制報文 | 是否包含Payload |
|---|---|
| CONNECT | 需要 |
| CONNACK | 不需要 |
| PUBLISH | 可選 |
| PUBACK | 不需要 |
| PUBREC | 不需要 |
| PUBREL | 不需要 |
| PUBCOMP | 不需要 |
| SUBSCRIBE | 需要 |
| SUBACK | 需要 |
| UNSUBSCRIBE | 需要 |
| UNSUBACK | 不需要 |
| PINGREQ | 不需要 |
| PINGRESP | 不需要 |
| DISCONNECT | 不需要 |
CONNACK 連接返回碼的值
| 值 | 返回碼響應 | 描述 |
|---|---|---|
| 0 | 0x00連接已接受 | 連接已被服務端接受 |
| 1 | 0x01連接已拒絕,不支持的協議版本 | 服務端不支持客戶端請求的MQTT協議級別 |
| 2 | 0x02連接已拒絕,不合格的客戶端標識符 | Client ID 編碼無誤,但服務端拒絕(有可能Client ID零長且清理會話標志為0) |
| 3 | 0x03連接已拒絕,服務端不可用 | 網絡連接已建立,但MQTT服務不可用 |
| 4 | 0x04連接已拒絕,無效的用戶名或密碼 | 用戶名或密碼的數據格式無效 |
| 5 | 0x05連接已拒絕,未授權 | 客戶端未被授權連接到此服務器 |
| 6-255 | 保留 |
