MQTT 动态注册
介绍说明
除 HTTP 通道外,设备也可以通过 MQTT 通道完成动态注册,能力与 HTTP 动态注册 等价:平台校验产品密钥签名后,按设备唯一编码注册设备并下发设备密钥。区别仅在于注册请求与后续通信复用同一条 MQTT 连接入口,适用于设备侧仅具备 MQTT 能力、不便发起 HTTP 请求的场景。
设备以一次普通的 MQTT 连接发起注册,请求承载于 CONNECT 报文本身,全程无需订阅或发布任何 Topic。
clientId 中携带 authtype=register,平台据此将注册请求与一机一密的设备密钥认证区分开。
平台校验通过后经固定 Topic
/ext/register主动下发注册结果,设备在消息回调中接收,无需订阅。设备唯一编码 uniqueNo 与签名口径均与 HTTP 动态注册保持一致。
1. 注册流程:
设备此时尚未持有设备密钥、无法通过常规连接鉴权,因此注册凭据以产品密钥签名的形式承载于 CONNECT 报文,由平台在鉴权阶段一并完成校验与注册。整个过程是一次普通的 MQTT 连接,设备无需为其订阅或发布任何 Topic:
设备向 MQTT 接入地址发起 CONNECT,在 clientId 中携带
authtype=register,并以产品密钥对参数签名(clientId、username、password 的构造见下)。平台在连接鉴权阶段识别出该请求为动态注册,校验产品密钥签名,随后按设备唯一编码 uniqueNo 幂等注册设备(deviceName 由设备在 username 中指定,需在产品下唯一)并生成设备密钥。
连接建立后,平台通过 Topic
/ext/register将注册结果定向下发至本连接,设备在消息回调中接收并保存。设备断开当前连接,改用一机一密方式(见 MQTT 连接认证)以设备密钥重新连接,进入正常通信。
2. 注册连接参数如下:
{
"clientId": "U1mo8BokA|authtype=register,signmethod=hmacmd5,random=qaCXMpHE|",
"username": "27OY2cgYUsW&JkerjK97oub",
"password": "6ff700b87a5dd1a22a5827d2e2e179c3",
"host": "192.168.0.1",
"port": 1883
}3. 连接参数说明:
| 参数 | 说明 |
|---|---|
| clientId | 设备唯一编码(如 sn、mac),即 HTTP 动态注册中的 uniqueNo;参数段中需携带 authtype=register 标识注册请求 |
| authtype | 认证类型,register 表示动态注册请求 |
| signmethod | 签名算法类型。支持 hmacmd5(默认值),hmacsha1 和 hmacsha256 |
| random | 动态注册时指定的随机数 |
| username | 格式为 deviceName&productKey;deviceName 为设备指定的设备名(需产品下唯一,无偏好时可用 uniqueNo 填充),不参与签名 |
| password | 产品密钥签名,生成逻辑见下 |
4. 加密参数生成逻辑:
mqttClientId=U1mo8BokA|authtype=register,signmethod=hmacmd5,random=qaCXMpHE|
mqttUsername=27OY2cgYUsW&JkerjK97oub
mqttPassword=hmacmd5("0yg2zfAgmGgaY8pS","uniqueNoU1mo8BokAproductKeyJkerjK97oubrandomqaCXMpHE")// 签名原文与 HTTP 动态注册一致,从 uniqueNo->productKey->random 依次拼接而成
String plainText = "uniqueNo" + uniqueNo + "productKey" + productKey + "random" + random;
String mqttPassword = hmacmd5(productSecret, plainText);5. 注册结果下发:
平台校验通过后,通过 Topic /ext/register 向设备下发注册结果。设备已连接至平台,故下发内容不含接入地址。
{
"productKey": "JkerjK97oub",
"deviceName": "27OY2cgYUsW",
"deviceSecret": "0cb56d6a63c8ffdb"
}关于接收方式
/ext/register 是平台内建 Topic,注册结果在鉴权通过后由平台主动下发,设备无需对其执行订阅(SUBSCRIBE)。订阅用于声明设备希望常态接收哪些主题的消息,注册结果则是平台面向当前连接的一次性定向下发;设备端只需在 MQTT 客户端的消息回调中处理该报文,即可接收并保存设备密钥。
6. 下发参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| productKey | String | 产品唯一标识 |
| deviceName | String | 设备名,用于设备 mqtt 认证参数 |
| deviceSecret | String | 设备密钥,用于设备 mqtt 认证密码签名 |
