MQTT使用指导
概述
MQTT(Message Queuing Telemetry Transport)是一个基于客户端-服务器的消息发布/订阅传输协议,主要应用于计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备,适合长连接的场景,如智能路灯等。更多关于MQTT协议语法及接口信息,请访问这里获取。
MQTTS是MQTT使用TLS加密的协议。采用MQTTS协议接入平台的设备,设备与物联网平台之间的通信过程,数据都是加密的,具有一定的安全性。
业务流程
采用MQTT协议接入物联网平台的设备,设备与物联网平台之间的通信过程,数据没有加密,建议使用MQTTS协议。
若选择MQTTS协议接入平台,建议通过使用IoT Device SDK接入。
- 设备接入前,需创建产品(可通过控制台创建或者使用应用侧API创建产品)。
- 产品创建完毕后,需注册设备(可通过控制台注册单个设备或者使用应用侧API注册设备创建)。
- 设备注册完毕后,可以按照图中流程实现消息/属性上报、接收命令/属性/消息、OTA升级、自定义Topic等功能。关于平台预置Topic可参考Topic定义
您可以通过mqtt.fx进行原生协议接入调测,可以参考快速体验mqtt接入。
使用限制
描述 |
限制 |
---|---|
单个MQTT直连设备在同一时间的连接数 |
1 |
单账户设备侧每秒最大建链请求数量 |
|
单账号设备侧每秒最大上行的请求数量(单消息payload平均为512字节) |
|
单个MQTT连接每秒最大上行消息数量 |
50/s |
单个MQTT连接最大带宽(上行消息) |
1MB(默认) |
MQTT单条发布消息最大长度。超过此大小的发布请求将被直接拒绝。 |
1MB |
MQTT协议规范 |
MQTT v5.0、MQTT v3.1.1、MQTT v3.1 |
与标准MQTT协议的区别 |
|
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 |
Public(发布者) |
Subscriber(订阅者) |
---|---|---|---|---|
设备消息相关Topic |
$oc/devices/{device_id}/sys/messages/up |
设备 |
平台 |
|
$oc/devices/{device_id}/sys/messages/down |
平台 |
设备 |
||
设备命令相关Topic |
$oc/devices/{device_id}/sys/commands/request_id={request_id} |
平台 |
设备 |
|
$oc/devices/{device_id}/sys/commands/response/request_id={request_id} |
设备 |
平台 |
||
设备属性相关Topic |
$oc/devices/{device_id}/sys/properties/report |
设备 |
平台 |
|
$oc/devices/{device_id}/sys/gateway/sub_devices/properties/report |
设备 |
平台 |
||
$oc/devices/{device_id}/sys/properties/set/request_id={request_id} |
平台 |
设备 |
||
$oc/devices/{device_id}/sys/properties/set/response/request_id={request_id} |
设备 |
平台 |
||
$oc/devices/{device_id}/sys/properties/get/request_id={request_id} |
平台 |
设备 |
||
属性查询响应结果,这个结果不会对设备属性和影子产生影响 |
$oc/devices/{device_id}/sys/properties/get/response/request_id={request_id} |
设备 |
平台 |
|
$oc/devices/{device_id}/sys/shadow/get/request_id={request_id} |
设备 |
平台 |
||
$oc/devices/{device_id}/sys/shadow/get/response/request_id={request_id} |
平台 |
设备 |
||
设备事件相关Topic |
$oc/devices/{device_id}/sys/events/up |
设备 |
平台 |
|
$oc/devices/{device_id}/sys/events/down |
平台 |
设备 |
另外,用户还可以通过在控制台上设置自定义Topic,上报用户个性化的数据。具体可参考自定义Topic。
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
- ECC_SM4_CBC_SM3
- ECDHE_SM4_GCM_SM3
- ECDHE_SM4_CBC_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
带CBC的加密套件存在安全风险,请谨慎使用。