热门标签 | 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平台


推荐阅读
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文详细探讨了在Android 8.0设备上使用ChinaCock的TCCBarcodeScanner进行扫码时出现的应用闪退问题,并提供了解决方案。通过调整配置文件,可以有效避免这一问题。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
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社区 版权所有