
# 使用前必读
#### 概述
MQTT是一种底层传输协议，一般用于网络通信，它提供有序的、可靠的、双向字节流传输，支持设备到云端和云端到设备之间的消息传递，是基于发布/订阅模式的"轻量级"通信协议。MQTT最大优点在于，可以以极少的代码和有限的带宽，为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议，使其在物联网、小型设备、移动应用等方面有较广泛的应用。
图1MQTT   
![](https://support.huaweicloud.com/api-iothub/figure/zh-cn_image_0000001847301434.png)
#### 数据包组成
MQTT消息由固定报头（Fixed header）、可变报头（Variable header）和有效载荷（Payload）三部分组成。在MQTT规范中有说明，建议使用[设备侧SDK](https://support.huaweicloud.com/sdkreference-iothub/iot_02_0178.html)进行接入。
其中固定报头（Fixed header）和可变报头（Variable header）格式的填写请参考[MQTT标准规范](https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/)。有效载荷（Payload）的格式由应用定义（须使用UTF-8编码格式），即设备和物联网平台之间的定义。
- 固定报头：每个 MQTT 控制报文都包含一个固定报头，用于决定控制报文类型、在PUBLISH中还用于决定最大服务质量（QoS），如：建链、订阅、发布。
- 可变报头：某些 MQTT 控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。包含可变报头的报文标识符（Packet Identifier），用于区分同一链路的不同数据包。
- 有效载荷：某些 MQTT 控制报文在报文的最后部分包含一个有效载荷，对于 PUBLISH 来说有效载荷就是应用消息（由用户自己定义）。
![](https://support.huaweicloud.com/api-iothub/public_sys-resources/note_3.0-zh-cn.png)
MQTT的语法和接口细节，请以[MQTT标准规范](https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/)为准。
#### 主要控制报文类型
常见MQTT消息类型主要有CONNECT、SUBSCRIBE、PUBLISH、PINGREQ。
- CONNECT：指客户端请求和服务端连接。有效载荷（Payload）的主要参数，参考[设备连接鉴权](https://support.huaweicloud.com/api-iothub/iot_06_v5_3009.html)填写。
- SUBSCRIBE：订阅包括主题筛选器（Topic Filter）和最大服务质量（QoS），一个会话可以进行多个订阅。向平台订阅可以参考：[Topic定义](https://support.huaweicloud.com/api-iothub/iot_06_v5_3004.html)。
- PUBLISH：是指从客户端向服务端或者服务端向客户端传输一个应用消息。
  - 可变报头（Variable header）中的主要参数"Topic name"，指服务端或客户端的发布主题。详细请参考[Topic定义](https://support.huaweicloud.com/api-iothub/iot_06_v5_3004.html)。
  
  - 有效载荷（Payload）中的主要参数为完整的数据上报和命令下发的消息内容，一般是一个JSON或字符串对象。
   
- PINGREQ：指客户端发给服务端的心跳请求。主要用于告知服务端客户端还活着、确认网络连接没有断开。约定的发送周期由协商的Keep Alive决定。
 
#### 使用限制
- 上行Topic是指设备向平台发送请求，或上报数据，或回复响应。
- 下行Topic是指平台向设备下发指令，或回复响应。
- 设备与平台建立连接后，需要订阅下行Topic(华为云平台中具有隐式订阅功能，若通信质量为Qos0，平台的[系统topic](https://support.huaweicloud.com/api-iothub/iot_06_v5_3004.html)无需订阅。)，否则无法收到平台下发的指令或回复的响应。应用侧接口的调用，需要设备侧的配合，例如应用侧下发命令，设备侧需要先订阅"平台命令下发"的下行Topic，否则设备无法收到平台命令，应用下发命令的接口也会报超时。
 
