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一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
29天前
|
消息中间件 网络协议 物联网
MQTT常见问题之物联网设备端申请动态注册时MQTT服务不可用如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
4月前
|
传感器 物联网 网络架构
ENS、IoT设备、X86、ARM
ENS(Enterprise Name Service)是企业名称服务,是一种为物联网设备提供命名和寻址服务的技术。ENS通过为物联网设备分配唯一的名称和地址,使得物联网设备可以被网络中的其他设备和服务所识别和访问。 IoT设备(Internet of Things device)是连接到互联网的物理设备,可以收集和共享数据,用于监测、控制和优化各种业务流程和操作。IoT设备包括各种传感器、执行器、网关和路由器等。
40 2
|
7月前
|
消息中间件 Java Linux
rocketmq linux注册服务开机启动配置
rocketmq linux注册服务开机启动配置
259 1
|
2月前
|
网络协议 物联网 5G
K3S 系列文章 -5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout' 分析与解决
K3S 系列文章 -5G IoT 网关设备 POD 访问报错 DNS 'i/o timeout' 分析与解决
|
27天前
|
消息中间件 存储 Kafka
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
【深入浅出 RocketMQ原理及实战】「底层源码挖掘系列」透彻剖析贯穿一下RocketMQ和Kafka索引设计原理和方案
48 1
|
1月前
|
监控 网络性能优化 网络安全
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
【MODBUS】Modbus主站为边缘设备通过MQTT协议上云
34 1
|
7月前
|
传感器 监控 数据可视化
手把手教你用IoT设备监控家庭环境数据
本实验带您体验如何通过六合一传感器(温度、湿度、二氧化碳、PM2.5、PM10、甲醛)实现家庭环境数据实时采集,并搭建可视化大屏实时监控。
304 0
|
5月前
|
传感器 JavaScript 物联网
MQTT 保持活动计时器:让您的设备保持连接
MQTT 保持活动计时器:让您的设备保持连接
96 0
|
5月前
|
XML 消息中间件 传感器
HTTP 与 MQTT:为您的 IoT 项目选择最佳协议
HTTP 与 MQTT:为您的 IoT 项目选择最佳协议
243 2
|
7月前
|
算法 安全 物联网
使用Paho-MQTT集成ID²,实现数据安全上云
IoT设备身份认证(IoT Device ID,ID²)是物联网设备接入到系统时的设备身份标识和设备认证系统,通过可信计算和密码技术为物联网系统提供设备认证、传输通道加密、业务数据加密等端到端的可信接入能力。 MQTT是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。Eclipse Paho提供许多不同版本的MQTT Client以供不同平台使用,其中Paho Embedded-C是为嵌入式平台提供的MQTT开源实现。
316 0