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

IoT设备免烧录三元组,基于MQTT动态注册身份,快速上云方案

iot,设备,免,烧,录,三元,组,基于,mqtt,动态,注册,身份

背景

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

安全提示

对于一型一密免预注册方式,请在设备端使用4.X版C SDK。该SDK包含DAS(设备取证服务),可以对设备可能产生的安全事件进行风控。物联网平台不承担因设备端没有使用该SDK而导致的安全风险。

流程图

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

image.png

开发实战

创建产品

我们接入 IoT 物联网平台,注册一个新产品:Android设备。
进入产品详情,获取productKey和productSecret开启动态注册功能,如下图:
image.png

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

设备端开发

我们以Node.js代码演示设备动态注册原理。

动态注册

设备发送CONNECT报文,报文中包含动态注册参数,请求建立连接。
• MQTT连接域名:公共实例的连接域名为${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:1883。
MQTT动态注册的CONNECT报文参数和取值结构如下:

mqttClientId: clientId+"|securemode=2,authType=regnwl,random=xxxx,signmethod=xxx|" mqttUserName: deviceName+"&"+productKey mqttPassword: sign_hmac(productSecret,content)

• mqttClientId组成结构:clientId+"|securemode=2,authType=regnwl,random=xxxx,signmethod=xxx|"
参数取值中包含的详细参数如下表。
image.png

• mqttUserName组成结构:deviceName+"&"+productKey示例:device1&al123456789。
• mqttPassword计算方法:sign_hmac(productSecret,content)其中,content的值是拼接串("deviceName"+device1+"productKey"+al123456789+"random"+123456)
hmac_sha1(h1nQFYPZS0mW2352, deviceNamedevice1productKeyal123456789random123)

免预注册认证方式,设备注册成功后,物联网平台使用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 和 deviceToken var 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.productKey options.password = signHmacSha1(content, productInfo.productSecret) options.port = 1883; options.host = `${productInfo.productKey}.iot-as-mqtt.${productInfo.regionId}.aliyuncs.com`; options.protocol = 'mqtts'; options.ca = rootCA options.keepalive = 120 return options; }

动态注册成功后,产品下会设备数量会更新:
image.png

设备在线和上报数据

设备收到并保存ClientID和DeviceToken的组合,断开当前MQTT连接,发起设备直连IoT平台的请求的CONNECT参数如下:

mqttClientId: clientId+"|securemode=-2,authType=connwl|" mqttUsername: deviceName+"&"+productKey mqttPassword: deviceToken

• mqttClientId:设备动态注册时获得的ClientID拼接固定字符串。
• mqttUserName:组成结构:deviceName+"&"+productKey示例:device1&al123456789。
• mqttPassword:设备动态注册时获得的DeviceToken
实例代码:

function deviceOnline(opts,regionId) { // 设备 MQTT 连接参数 var optiOns= {} options.clientId = opts.clientId + "|securemode=-2,authType=connwl|" options.username = opts.deviceName + "&" + opts.productKey options.password = opts.deviceToken options.port = 1883 options.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信息,如下:
image.png

image.png

【往期回顾】

1、39张IoT传感器工作原理GIF图汇总
2、IoT 设备发送 MQTT 请求的曲折经历
3、20元体 Arduino 环境监测仪开发
4、智能手持测温枪开发实践
5、JMeter 压测 MQTT 服务性能实战


推荐阅读
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 基于Springboot实现Mqtt
    转载:基于Springboot实现MqttJava端开发:pom.xml: ... [详细]
  • 阿里云官方提供的 DEMO里面没有Python接入 阿里云物联网平台(原物联网套件) 的例子,不便于我们在电脑端做虚拟终端的相关测试,本文介绍一种基于使用Python3、MQTT-TCP连接通信 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 设计模式——模板方法模式的应用和优缺点
    本文介绍了设计模式中的模板方法模式,包括其定义、应用、优点、缺点和使用场景。模板方法模式是一种基于继承的代码复用技术,通过将复杂流程的实现步骤封装在基本方法中,并在抽象父类中定义模板方法的执行次序,子类可以覆盖某些步骤,实现相同的算法框架的不同功能。该模式在软件开发中具有广泛的应用价值。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
author-avatar
林舒婷880
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有