热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IoT设备免烧录三元组,首次开机即时注册解决方案

背景物联网场景中,设备产线烧录不同三元组成本很高,Android设备更是无法独立烧录三元组,IoT存量设备迁移更是无法预置身份三元组&#x

背 景

物联网场景中,设备产线烧录不同三元组成本很高,Android设备更是无法独立烧录三元组,IoT 存量设备迁移更是无法预置身份三元组,面对这种场景,IoT物联网平台提供了无需预注册三元组,在设备运行时通过MQTT动态注册,获取认证信息,再发起设备业务连接的方案。

流 程 图

设备动态注册三元组流程如下:

开发实战

1.创建产品

我们进入 IoT 物联网平台控制台,创建一个新产品:Android设备。


进入产品详情,获取 productKey 和 productSecret 。开启动态注册功能,如下图:

接下来,我们无需按常规流程,预先注册设备,而是直接开发设备端程序。

2.设备端开发

我们以 Node.js 代码演示设备动态注册完整过程。

2.1 动态注册

设备发送CONNECT报文,报文中包含动态注册参数,请求建立连接。

  • MQTT连接域名:公共实例的连接域名为${productKey}.iot-as-mqtt.${regionId}.aliyuncs.com:1883

  • MQTT动态注册的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平台


推荐阅读
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文介绍了一种使用 JavaScript 计算两个日期之间时间差的方法。该方法支持多种时间格式,并能返回秒、分钟、小时和天数等不同精度的时间差。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • 微信平台通过盛派SDK(sdk.weixin.senparc.com)允许服务号和订阅号使用appId和token读取关注用户的个人信息。然而,这一过程需严格遵守隐私保护和数据安全的相关规定,确保用户数据的安全性和隐私性。 ... [详细]
author-avatar
范婷柏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有