背 景
物联网场景中,设备产线烧录不同三元组成本很高,Android设备更是无法独立烧录三元组,IoT 存量设备迁移更是无法预置身份三元组,面对这种场景,IoT物联网平台提供了无需预注册三元组,在设备运行时通过MQTT动态注册,获取认证信息,再发起设备业务连接的方案。
流 程 图
设备动态注册三元组流程如下:
开发实战
1.创建产品
我们进入 IoT 物联网平台控制台,创建一个新产品:Android设备。
进入产品详情,获取 productKey 和 productSecret 。开启动态注册功能,如下图:
接下来,我们无需按常规流程,预先注册设备,而是直接开发设备端程序。
2.设备端开发
我们以 Node.js 代码演示设备动态注册完整过程。
2.1 动态注册
设备发送CONNECT报文,报文中包含动态注册参数,请求建立连接。
mqttClientId: clientId+"|securemode=2,authType=regnwl,random=xxxx,signmethod=xxx|"
mqttUserName: deviceName+"&"+productKey
mqttPassword: sign_hmac(productSecret,content)
免预注册认证方式,设备注册成功后,物联网平台使用Topic:/ext/regnwl,返回ClientID、DeviceToken。
IoT 物联网平台推送的设备身份消息Payload格式如下:
{"productKey" : "xxx","deviceName" : "xxx","clientId" : "xxx","deviceToken" : "xxx"
}
动态注册示例代码:
function doDeviceRegister() {// 1.产品信息const productInfo = {productKey: "产品 productKey",productSecret: "产品 productSecret",regionId: "cn-shanghai"}// 2.程序读取的设备唯一标识,比如 MAC,Serial Number 等productInfo.deviceName = Math.random().toString(36).substr(2)// 3.生成设备动态注册的参数var options = getRegisterOptions(productInfo, trustedCA);// 4.发起动态注册,获取设备连接 clientId 和 deviceTokenvar registerClient = mqtt.connect(options);registerClient.on('message', function(topic, message) {// 5. 解析注册结果if ('/ext/regnwl' == topic) {// 6.断开注册连接registerClient.end();// 7.发起设备 MQTT 连接//deviceOnline(JSON.parse(message),"cn-shanghai")}})}
生成设备动态注册的参数,示例代码和参考文档:
https://help.aliyun.com/document_detail/132111.html
function getRegisterOptions(productInfo, rootCA) {var random = Date.now();var content = {deviceName: productInfo.deviceName,productKey: productInfo.productKey,random: random}var options = {}options.clientId = Date.now() + "|securemode=2,authType=regnwl,random=" + random + ",signmethod=hmacsha1|"options.username = productInfo.deviceName + "&" + productInfo.productKeyoptions.password = signHmacSha1(content, productInfo.productSecret)options.port = 1883;options.host = `${productInfo.productKey}.iot-as-mqtt.${productInfo.regionId}.aliyuncs.com`;options.protocol = 'mqtts';options.ca = rootCAoptions.keepalive = 120return options;
}
动态注册成功后,产品下会设备数量会更新:
2.2 设备上线和上报数据
设备端收到并保存ClientID和DeviceToken的组合后,需要断开当前MQTT连接,重新发起设备直连IoT平台的请求的CONNECT参数如下:
mqttClientId: clientId+"|securemode=-2,authType=connwl|"
mqttUsername: deviceName+"&"+productKey
mqttPassword: deviceToken
• mqttClientId :设备动态注册时获得的ClientID拼接固定字符串。
• mqttUserName :组成结构为 deviceName+"&"+productKey
• mqttPassword :设备动态注册时获得的DeviceToken
设备建立MQTT连接和上报数据,示例代码:
function deviceOnline(opts,regionId) {// 设备 MQTT 连接参数var options = {}options.clientId = opts.clientId + "|securemode=-2,authType=connwl|"options.username = opts.deviceName + "&" + opts.productKeyoptions.password = opts.deviceTokenoptions.port = 1883options.host = `${opts.productKey}.iot-as-mqtt.${regionId}.aliyuncs.com`options.protocol = 'mqtt'options.keepalive = 120// 设备建立 MQTT 连接var deviceClient = mqtt.connect(options);// 上报业务数据deviceClient.publish(`/${opts.productKey}/${opts.deviceName}/user/update`, "sdk client " + Date.now(), { qos: 1 });}
启动设备端程序后,我们可以在控制台看到设备在线,并展示ClientID信息,如下:
【往期回顾】
1、39张传感器工作原理GIF图汇总
2、智能手持测温枪开发实践
3、JMeter压测MQTT服务性能实战
4、IoT物联网平台日志服务详解
5、自建MQTT集群迁移阿里云IoT实践
6、工业Modbus电力104规约接入IoT平台