IoT 设备免烧录三元组,无需预注册,基于MQTT即时注册三元组,快速上云方案

简介: 适用于:1.设备出厂免烧录,2.存量设备迁移场景,3.Android系统设备上云

背景

物联网场景中,设备产线烧录不同三元组成本很高,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 服务性能实战

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
11月前
|
消息中间件 搜索推荐 调度
RocketMQ实战—8.营销系统业务和方案介绍
本文详细介绍了电商营销系统的业务流程、技术架构及挑战解决方案。涵盖核心交易与支付后履约流程,优惠券和促销活动的发券、领券、用券、销券机制,以及会员与推送的数据库设计。技术架构基于Nacos服务注册中心、Dubbo RPC框架、RocketMQ消息中间件和XXLJob分布式调度工具,实现系统间高效通信与任务管理。针对千万级用户量下的推送和发券场景,提出异步化、分片处理与惰性发券等优化方案,解决高并发压力。同时,通过RocketMQ实现系统解耦,提升扩展性,并利用XXLJob完成爆款商品推荐的分布式调度推送。整体设计确保系统在大规模用户场景下的性能与稳定性。
RocketMQ实战—8.营销系统业务和方案介绍
|
6月前
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
2420 1
|
10月前
|
物联网
(手把手)在华为云、阿里云搭建自己的物联网MQTT消息服务器,免费IOT平台
本文介绍如何在阿里云搭建自己的物联网MQTT消息服务器,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
3227 42
|
11月前
|
消息中间件 存储 Kafka
RocketMQ实战—4.消息零丢失的方案
本文分析了用户支付完成后未收到红包的问题,深入探讨了RocketMQ事务消息机制的实现原理及其在确保消息零丢失中的作用。首先,通过全链路分析发现消息可能在推送、存储或消费环节丢失。接着,介绍了RocketMQ事务消息机制如何通过half消息、本地事务执行及回调确认来保证消息发送成功,并详细解析了其底层原理,如half消息对消费者不可见、rollback与commit操作等。同时,对比了同步重试方案,指出其在复杂场景下的局限性。
RocketMQ实战—4.消息零丢失的方案
|
消息中间件 存储 运维
2024最全RabbitMQ集群方案汇总
本文梳理了RabbitMQ集群的几种方案,主要包括普通集群、镜像集群(高可用)、Quorum队列(仲裁队列)、Streams集群模式(高可用+负载均衡)和插件方式。重点介绍了每种方案的特点、优缺点及适用场景。搭建步骤包括安装Erlang和RabbitMQ、配置集群节点、修改hosts文件、配置Erlang Cookie、启动独立节点并创建集群,以及配置镜像队列以提高可用性和容错性。推荐使用Quorum队列与Streams模式,其中Quorum队列适合高可用集群,Streams模式则同时支持高可用和负载均衡。此外,还有Shovel和Federation插件可用于特定场景下的集群搭建。
3256 2
|
消息中间件 存储 弹性计算
云消息队列 RabbitMQ 版方案评测
本文评估了阿里云《高弹性,低成本,云消息队列 RabbitMQ 实践》方案,从实践原理理解、部署体验、方案优势展现及业务场景匹配四个方面进行了深入分析。文中指出,该方案在解决消息积压、提高系统稳定性、支持弹性伸缩等方面表现优异,但也提出了在组件功能解释、实战案例提供等方面的改进建议,以期帮助用户更好地理解和应用该技术解决方案。
503 2
|
消息中间件 RocketMQ
2024最全RocketMQ集群方案汇总
在研究RocketMQ集群方案时,发现网上存在诸多不一致之处,如组件包含NameServer、Broker、Proxy等。通过查阅官方文档,了解到v4.x和v5.x版本的差异。v4.x部署模式包括单主、多主、多主多从(异步复制、同步双写),而v5.x新增Local与Cluster模式,主要区别在于Broker和Proxy是否同进程部署。Local模式适合平滑升级,Cluster模式适合高可用需求。不同模式下,集群部署方案大致相同,涵盖单主、多主、多主多从等模式,以满足不同的高可用性和性能需求。
1881 0
|
存储 监控 安全
使用IoT设备优化家庭生活的技术探索
【8月更文挑战第4天】IoT设备以其智能化、便捷性和高效性,正逐步成为现代家庭不可或缺的一部分。从智能照明到智能安防,从智能恒温器到智能厨房,再到智能语音助手,这些设备不仅优化了我们的家庭生活,还提升了我们的生活质量和幸福感。随着技术的不断进步和应用场景的不断拓展,我们有理由相信,未来的智能家居将会更加智能、更加人性化,为我们的生活带来更多惊喜和便利。
|
人工智能 安全 物联网
|
机器学习/深度学习 人工智能 算法
物联网(IoT)就像是一个大型派对,无数的设备都在欢快地交流着信息
【9月更文挑战第4天】在这个万物互联的时代,物联网(IoT)犹如一场盛大的派对,各类设备欢聚一堂。然而,如何让这些设备互相理解并协同工作呢?这就需要机器学习与人工智能的助力。例如,智能空调通过学习你的使用习惯来调节温度,使你更加舒适;智能安防系统则能识别异常行为并及时报警,保障家庭安全。此外,智能农业、交通等领域也因机器学习和人工智能的应用变得更加高效。下面通过一个简单的温度预测代码示例,展示机器学习在物联网中的实际应用,让我们一起感受其强大潜力。
288 0