
# MQTT使用指导
#### 概述
MQTT（Message Queuing Telemetry Transport）是一个基于客户端-服务器的消息发布/订阅传输协议，主要应用于计算能力有限且工作在低带宽、不可靠的网络的远程传感器和控制设备，适合设备与云端保持长连接的场景，如智能路灯等。MQTT 客户端通过主题（Topic）发布或订阅消息，由MQTT Broker集中管理消息路由并根据预设的服务质量 (QoS) 确保端到端消息传递的可靠性。在此过程中，发送消息的客户端（发布者）和接收消息的客户端（订阅者）之间被解耦，发布者和订阅者之间无需建立直接连接。由于MQTT协议满足物联网对通信协议的轻量级、可靠、双向和大规模的需求，MQTT协议成为了物联网领域的最佳协议之一。更多关于MQTT协议语法及接口信息，请访问[这里](https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/)获取。
MQTTS是MQTT使用TLS加密的协议。采用MQTTS协议接入平台的设备，设备与物联网平台之间的通信过程，数据都是加密的，具有一定的安全性。
![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0269115067.png "点击放大")
#### 业务流程
采用MQTT协议接入物联网平台的设备，设备与物联网平台之间的通信过程，数据没有加密，建议使用MQTTS协议。
若选择MQTTS协议接入平台，建议通过[使用IoT Device SDK接入](https://support.huaweicloud.com/sdkreference-iothub/iot_10_1001.html)。
![](https://support.huaweicloud.com/devg-iothub/figure/zh-cn_image_0263925108.png "点击放大")
1. 设备接入前，需创建产品（可通过控制台创建或者使用应用侧API[创建产品](https://support.huaweicloud.com/api-iothub/iot_06_v5_0050.html)）。
2. 产品创建完毕后，需注册设备（可通过控制台[注册单个设备](https://support.huaweicloud.com/usermanual-iothub/iot_01_0031.html)或者使用应用侧API[注册设备](https://support.huaweicloud.com/api-iothub/iot_06_v5_0046.html)创建）。
3. 设备注册完毕后，可以按照图中流程实现消息/属性上报、接收命令/属性/消息、OTA升级、自定义Topic等功能。关于平台预置Topic可参考[Topic定义](https://support.huaweicloud.com/api-iothub/iot_06_v5_3004.html)
![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
您可以通过mqtt.fx进行原生协议接入调测，可以参考[快速体验mqtt接入](https://support.huaweicloud.com/bestpractice-iothub/iot_bp_00016.html)。
 #### 使用限制
| 描述                                                                                                                                                     | 限制                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|:---|:---|
| 单个MQTT直连设备在同一时间的连接数                                                                                                                                    | 1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| 单账户设备侧每秒最大建链请求数量                        | - 基础版100  - 标准版请参考[标准版规格](https://support.huaweicloud.com/productdesc-iothub/iot_04_0014.html#section2)  - 企业版请参考[企业版规格](https://support.huaweicloud.com/productdesc-iothub/iot_04_0014.html#section3)   |
| 单账号设备侧每秒最大上行的请求数量（单消息payload平均为512字节）   | - 基础版500  - 标准版请参考[标准版规格](https://support.huaweicloud.com/productdesc-iothub/iot_04_0014.html#section2)  - 企业版请参考[企业版规格](https://support.huaweicloud.com/productdesc-iothub/iot_04_0014.html#section3)              |
| 单个MQTT连接每秒最大上行消息数量                                                                                                                                     | 50/s                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| 单个MQTT连接最大带宽（上行消息）                                                                                                                                     | 1MB（默认）                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| MQTT单条发布消息最大长度。超过此大小的发布请求将被直接拒绝。                                                                                                                       | 1MB                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| MQTT协议规范                                                                                                                                               | MQTT v5.0、MQTT v3.1.1、MQTT v3.1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| 与标准MQTT协议的区别                                                                                                                                           | - 不支持QoS2  - 不支持will、retain msg                                                                                                                                                                                   |
| MQTT协议支持的安全等级                                                                                                                                          | 采用TCP通道基础 + TLS协议（TLSv1、 TLSv1.1、TLSv1.2和TLSv1.3版本）                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| MQTT连接心跳时间建议值                                                                                                                                          | 心跳时间限定为30至1200秒，推荐设置为120秒                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| MQTT协议消息发布与订阅                                                                                                                                          | 设备只能对自己的Topic进行消息发布与订阅                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 单个MQTT连接的最大订阅数量。                                                                                                                                       | 100个                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| MQTT自定义Topic支持的最大长度                                                                                                                                    | 128字节                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| MQTT自定义Topic支持每个产品添加的最大个数                                                                                                                              | 10个/产品                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 单账号支持上传设备侧CA证书个数                                                                                                                                       | 100个                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   
#### MQTT设备与物联网平台通信
设备使用MQTT协议接入平台时，平台和设备通过Topic进行通信。物联网平台预置了Topic，通过这些预置的Topic，平台和设备可以实现消息、属性、命令的交互。您还可以在设备接入控制台，自定义Topic，实现设备平台通信的个性化配置。
| 数据类型 | 消息类型     | 说明                                                                                      |
|:---|:---|:---|
| 数据上行 | 设备属性上报   | 用于设备按产品模型中定义的格式将属性数据上报给平台。                                                              |
| 数据上行 | 设备消息上报   | 设备无法按照产品模型中定义的属性格式进行数据上报时，将设备的自定义数据通过设备消息上报接口上报给平台，平台将设备上报的消息转发给应用服务器或华为云其他云服务上进行存储和处理。 |
| 数据上行 | 网关批量属性上报 | 用于网关设备将多个设备的属性数据一次性上报给平台。                                                               |
| 数据上行 | 设备事件上报   | 用于设备按产品模型中定义的格式将事件数据上报给平台。                                                              |
| 数据下行 | 平台消息下发   | 用于平台下发自定义格式的数据给设备。                                                                      |
| 数据下行 | 平台设置设备属性 | 设备的产品模型中定义了平台可向设备设置的属性，平台/应用服务器可通过属性设置的方式修改指定设备的属性值。                                    |
| 数据下行 | 平台查询设备属性 | 平台/应用服务器通过属性查询的方式，实时查询指定设备的属性数据。                                                        |
| 数据下行 | 平台命令下发   | 平台/应用服务器按产品模型中定义的命令格式下发控制命令给设备。                                                         |
| 数据下行 | 平台事件下发   | 平台/应用服务器按产品模型中定义的事件格式下发事件给设备。                                                           |
   
**Topic接口介绍**
物联网平台预置的Topic如下表所示：
| Topic分类     | 用途                                                                                            | Topic                                                                       | Publisher（发布者） | Subscriber（订阅者） |
|:---|:---|:---|:---|:---|
| 设备消息相关Topic | [设备消息上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_3016.html)                      | $oc/devices/{device_id}/sys/messages/up                                     | 设备             | 平台              |
| 设备消息相关Topic | [平台下发消息给设备](https://support.huaweicloud.com/api-iothub/iot_06_v5_3017.html)                   | $oc/devices/{device_id}/sys/messages/down                                   | 平台             | 设备              |
| 设备命令相关Topic | [平台下发命令给设备](https://support.huaweicloud.com/api-iothub/iot_06_v5_3014.html)                   | $oc/devices/{device_id}/sys/commands/request_id={request_id}                | 平台             | 设备              |
| 设备命令相关Topic | [设备返回命令响应](https://support.huaweicloud.com/api-iothub/iot_06_v5_3014.html)                    | $oc/devices/{device_id}/sys/commands/response/request_id={request_id}       | 设备             | 平台              |
| 设备属性相关Topic | [设备上报属性数据](https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html)                    | $oc/devices/{device_id}/sys/properties/report                               | 设备             | 平台              |
| 设备属性相关Topic | [网关批量上报属性数据](https://support.huaweicloud.com/api-iothub/iot_06_v5_3006.html)                  | $oc/devices/{device_id}/sys/gateway/sub_devices/properties/report           | 设备             | 平台              |
| 设备属性相关Topic | [平台设置设备属性](https://support.huaweicloud.com/api-iothub/iot_06_v5_3008.html)                    | $oc/devices/{device_id}/sys/properties/set/request_id={request_id}          | 平台             | 设备              |
| 设备属性相关Topic | [属性设置的响应结果](https://support.huaweicloud.com/api-iothub/iot_06_v5_3008.html)                   | $oc/devices/{device_id}/sys/properties/set/response/request_id={request_id} | 设备             | 平台              |
| 设备属性相关Topic | [平台查询设备属性](https://support.huaweicloud.com/api-iothub/iot_06_v5_3011.html)                    | $oc/devices/{device_id}/sys/properties/get/request_id={request_id}          | 平台             | 设备              |
| 设备属性相关Topic | [属性查询响应结果](https://support.huaweicloud.com/api-iothub/iot_06_v5_3011.html)，这个结果不会对设备属性和影子产生影响 | $oc/devices/{device_id}/sys/properties/get/response/request_id={request_id} | 设备             | 平台              |
| 设备属性相关Topic | [设备侧主动获取平台的设备影子数据](https://support.huaweicloud.com/api-iothub/iot_06_v5_3012.html)            | $oc/devices/{device_id}/sys/shadow/get/request_id={request_id}              | 设备             | 平台              |
| 设备属性相关Topic | [设备侧主动获取平台设备影子数据的响应](https://support.huaweicloud.com/api-iothub/iot_06_v5_3012.html)          | $oc/devices/{device_id}/sys/shadow/get/response/request_id={request_id}     | 平台             | 设备              |
| 设备事件相关Topic | [设备事件上报](https://support.huaweicloud.com/api-iothub/iot_06_v5_3029.html)                      | $oc/devices/{device_id}/sys/events/up                                       | 设备             | 平台              |
| 设备事件相关Topic | [平台事件下发](https://support.huaweicloud.com/api-iothub/iot_06_v5_3028.html)                      | $oc/devices/{device_id}/sys/events/down                                     | 平台             | 设备              |
   
另外，用户还可以通过在控制台上设置自定义Topic，上报用户个性化的数据。具体可参考[自定义Topic](https://support.huaweicloud.com/usermanual-iothub/iot_02_9992.html)。
#### MQTT的TLS支持
平台推荐使用TLS来保护设备和平台的传输安全。 平台目前支持TLS1.3、1.2 、1.1版本以及GMTLS。其中TLS 1.1 计划后续不再支持，建议使用 TLS 1.3作为首选 TLS 版本。GMTLS版本仅在国密算法的企业版才支持。
基础版，标准版以及支持通用加密算法的企业版使用TLS连接时，平台支持如下加密套件：
- TLS_AES_256_GCM_SHA384
- TLS_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
支持国密算法的企业版使用TLS连接时平台支持如下加密套件：
- ECC_SM4_GCM_SM3
- ECDHE_SM4_GCM_SM3
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
![](https://support.huaweicloud.com/devg-iothub/public_sys-resources/note_3.0-zh-cn.png)
带CBC的加密套件存在安全风险，请谨慎使用。
#### 相关FAQ
[MQTT接入相关问题](https://support.huaweicloud.com/iothub_faq/iot_faq_01006.html)
