Appearance
设备MQTT连接认证
直连设备与设备管理平台通过MQTT协议连接通信,在进行通信前,设备必须与MQTT服务端进行认证,认证通过后,设备才能发布和订阅消息,本文主要对MQTT CONNECT协议规范进行说明。
在进行MQTT CONNECT协议设置时,需注意:
如果同一个设备证书(三元组ProductKey、DeviceName和DeviceSecret)同时用于多个物理设备连接,可能会导致客户端频繁上下线。因为新设备连接认证时,原设备会被迫下线,而设备被下线后,又会自动尝试重新连接。
(可选)为保障通信安全,推荐使用TLS加密的连接方式MQTTS。
认证协议规范
建议直接使用设备管理平台提供的南向设备端SDK接入平台,如果需要自行开发接入,连接参数如下。
1、参数:接入域名。根据具体的平台部署情况,选择合适的地址接入
2、参数:可变报头(variable header):Keep Alive。 CONNECT指令中需包含Keep Alive(保活时间)。保活心跳时间取值范围为30秒~1200秒,建议取值300秒以上。若网络不稳定,请将心跳时间设置长一些。如果心跳时间不在保活时间内,平台会拒绝连接。
3、参数:MQTT的CONNECT报文。
一机一密设备认证方式:使用设备证书(三元组ProductKey、DeviceName和DeviceSecret)连接。
一型一密预注册设备,需要先从平台获取设备证书后(三元组ProductKey、DeviceName和DeviceSecret),完成获取设备证书后, 认证方式同一机一密设备认证。
所以,一机一密设备认证,一型一密预注册设备认证最终的MQTT连接认证方式相同。
总之, 设备使用MQTT协议连接平台必须先要获取三元组。
连接参数如下:
mqttClientid: clientId+"|clienttype=0,signmethod=hmacmd5,timestamp=132323232|"
mqttUsername: deviceName+"&"+productKey
mqttPassword: sign_hmac(deviceSecret,content)
参数说明如下:
- mqttClientId:MQTT连接的客户端ID。格式中 | 内为扩展参数。
- clientId:必传。表示客户端ID,可自定义,长度不可超过64个字符。强烈建议使用设备的SN码或MAC地址,方便识别区分不同的客户端。
- clienttype:可选。标识客户端类型,clienttype=0:直连设备(默认,可不传);clienttype=1:appuser,app端用户认证(app也可作为一个通用设备接入mqtt组件中); clienttype=2:web模拟器模拟设备连接认证(需要校验时间)。如果不传则默认为:clienttype=0。
- signmethod:可选。表示签名算法类型。支持hmacmd5,hmacsha1和hmacsha256,不传默认为:hmacmd5。
- timestamp:可选。表示当前时间毫秒值的时间戳,会校验时效性。
- mqttUsername:MQTT连接的用户名。使用 & 分隔扩展。
- deviceName:必传。表示具体的deviceName。
- productKey:必传。表示具体的productKey。
- mqttPassword:MQTT连接的密码。sign签名需把提交给服务器的参数按字典排序后,根据signmethod加签。签名计算示例下文有说明。 content的值为提交给服务器的参数(productKey、deviceName、clientId、timestamp),按照参数名称首字母字典排序, 然后将参数值依次拼接。
示例: 假设 clientId = 12345,deviceName = device1, productKey = pk, timestamp = 789,signmethod=hmacmd5,deviceSecret=secret123,那么使用TCP方式提交给MQTT的参数如下:
mqttclientId=12345|signmethod=hmacmd5,timestamp=789|
mqttUsername=device1&pk
mqttPassword=hmacmd5("secret123","clientId12345deviceNamedevice1productKeypktimestamp789");
加密后的Password的值示例为:mqttPassword=566BCDA5123424CE529006AFD27BBF7B