基于MQTT通道的设备动态注册
Posted HaaS技术社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于MQTT通道的设备动态注册相关的知识,希望对你有一定的参考价值。
在物联网平台为产品开启动态注册功能后,直连设备可使用一型一密安全认证方式完成动态注册,通过MQTT通信协议连接物联网平台。设备先基于TLS建立与物联网平台的连接,获取MQTT连接所需的设备密钥,再断开连接,然后重新建立MQTT连接进行通信。本文介绍动态注册流程。
前提条件
已完成一型一密文档中的以下步骤:
注意 目前仅华东2(上海)地域支持设备进行一型一密免预注册认证。
- 创建产品。
- 开启动态注册。
- 添加设备。
- 产线烧录。
动态注册流程
- 设备发送CONNECT报文,报文中包含动态注册参数,请求建立连接。
说明 目前,动态注册只支持使用TLS建立连接,不支持TCP直连。动态注册时,物联网平台不会校验MQTT连接的Keep Alive(保活时间),因此可以不用设置Keep Alive时间。
- MQTT连接域名说明:公共实例和企业版实例中,MQTT的接入域名,请参见查看实例终端节点。
- CONNECT报文的动态注册参数:
- 当设备属于企业版实例,且使用一型一密免预注册认证方式时,动态注册参数如下:
mqttClientId: clientId+"|securemode=-2,authType=xxxx,random=xxxx,signmethod=xxxx,instanceId=xxxx|" mqttUserName: deviceName+"&"+productKey mqttPassword: sign_hmac(productSecret,content)
- 当设备属于公共实例,或使用一型一密预注册认证方式时,动态注册参数如下:
mqttClientId: clientId+"|securemode=2,authType=xxxx,random=xxxx,signmethod=xxxx|" mqttUserName: deviceName+"&"+productKey mqttPassword: sign_hmac(productSecret,content)
参数说明:
- mqttClientId
参数取值中包含的详细参数如下表所示。
参数 说明 clientId 客户端ID,可自定义,长度在64个字符内。建议使用设备的MAC地址或SN码,方便您识别区分不同的客户端。 securemode 安全模式。 authType 一型一密认证方式,不同类型将返回不同的认证参数: random 随机数。您自定义随机数。 signMethod 签名算法。目前支持hmacmd5、hmacsha1、hmacsha256。 instanceId 实例ID。请登录物联网平台控制台,在实例概览页面查看。 - mqttUserName
组成结构:
deviceName+"&"+productKey
示例:
device1&al123456789
- mqttPassword
计算方法:
sign_hmac(productSecret,content)
其中,content的值是提交给服务器的必需参数和值(deviceName、productKey、random)按照字母顺序排序、拼接(无拼接符号)的字符串。然后,将content的值通过mqttClientId中的signMethod指定的算法,使用产品的ProductSecret进行签名计算。
示例:
hmac_sha1(h1nQFYPZS0mW****, deviceNamedevice1productKeyal123456789random123)
- 当设备属于企业版实例,且使用一型一密免预注册认证方式时,动态注册参数如下:
- 物联网平台返回CONNECT ACK。
- 返回0,表示设备动态注册成功。
- 返回其他值,表示设备动态注册失败。请根据返回的错误码,确定错误原因。
设备发送连接请求后,物联网平台返回的结果状态码和说明如下表。
结果码 消息 说明 0 CONNECTION_ACCEPTED 动态注册成功。 2 IDENTIFIER_REJECTED 参数错误。原因可能是: - 必填参数缺失或格式错误。
- 您使用了TCP直连注册。动态注册只能使用TLS通道。
3 SERVER_UNAVAILABLE 云端错误。请稍后再试。 4 BAD_USERNAME_OR_PASSWORD 动态注册失败,鉴权未通过。 请检查传入的mqttUserName和mqttPassword取值是否正确。
- 建立连接后,物联网平台通过推送证书的Topic,根据CONNECT报文中的authType,返回不同的认证参数。
说明 设备无需订阅推送证书的Topic。
- 一型一密预注册认证方式:Topic为
/ext/register
,authType取值为register,返回DeviceSecret。物联网平台推送的消息Payload格式如下:
"productKey" : "***", "deviceName" : "***", "deviceSecret" : "***"
- 一型一密免预注册认证方式:Topic为
/ext/regnwl
,authType取值为regnwl,返回ClientID、DeviceToken。物联网平台推送的消息Payload格式如下:
"productKey" : "***", "deviceName" : "***", "clientId" : "***", "deviceToken" : "***"
- 一型一密预注册认证方式:Topic为
- 设备收到并保存DeviceSecret,或ClientID和DeviceToken的组合,断开当前MQTT连接。
设备可以通过发送DISCONNECT报文或直接断开TCP连接,断开当前连接。
如果设备未断开此连接,15秒之后,物联网平台会主动断开连接。
如果您使用Eclipse Paho MQTT客户端,需设置
MqttConnectOptions.setAutomaticReconnect(false)
关闭自动重连。否则,注册成功且TCP断连后,重连逻辑会发起新的动态注册请求。 - 设备使用DeviceSecret,或使用ClientID和DeviceToken的组合,再次发起MQTT连接请求,建立设备与物联网平台的连接,进行消息通信。具体操作,请参见MQTT-TCP连接通信。
操作样例
直连设备的动态注册示例,请参见一型一密动态注册(MQTT通道)。
以上是关于基于MQTT通道的设备动态注册的主要内容,如果未能解决你的问题,请参考以下文章
玩转OneNET物联网平台之MQTT服务④ —— 远程控制LED(设备自注册)+ Android App控制
电信运营商基于 MQTT 协议 构建千万级 IoT 设备管理平台
SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段