基于开放API实现IoT平台设备动态注册方案
0.背景(设备无需烧录IoT三元组)
IoT场景需要每个设备有唯一身份标识,但设备产线一般不具备针对设备烧录三元组能力。
运行时动态注册方案允许设备固件可以无差别烧录,在设备售卖给消费者手上后,第一次使用时动态注册三元组,然后再与IoT平台建立网络连接。
涉及到系统交互如下
1. 应用服务器API设计
[](#7h3wuy)1.1 厂商批量初始化自己设备库
IotDeviceDynamicRegistration/IotDeviceRegist
入参:
字段 | 描述 | |
---|---|---|
deviceId | 由mac地址根据规则生成的字符串 | |
productKey | 三元组productKey |
业务逻辑:
- 根据deviceId查询OTS表,如果查到,返回异常,设备已存在
- 如果查不到设备,添加设备并初始化registerTime设备注册时间,
[](#rt2usy)1.2 激活并获取三元组API
IotDeviceDynamicRegistration/IotDeviceActivate
入参:
字段 | 描述 | |
---|---|---|
deviceId | 由mac地址根据规则生成的字符串 |
返回数据:
字段列 | 描述 | |
---|---|---|
productKey | 三元组productKey | |
deviceName | 三元组deviceName | |
deviceSecret | 三元组deviceSecret | |
业务逻辑:
- 根据deviceId查询OTS表,如果查不到设备,返回设备非法
- 如果有设备,有三元组,直接返回三元组
- 如果有设备,无三元组,去IoT动态注册设备,存储三元组,并返回三元组
[](#5fs1zc)2. 表格存储OTS库设计
华东2 实例:IoTDevicesTable
公网endpoint https://IoTDevicesTable.cn-shanghai.ots.aliyuncs.com
数据表名称:device_table
数据生命周期:-1
最大数据版本:1
数据有效版本偏差:86400
主键: deviceId (STRING) (分片键)
字段列 | 描述 | |
---|---|---|
deviceId | 由mac地址根据规则生成的字符串 | 主键 |
registerTime | 设备注册时间 | |
activateTime | 设备激活时间 | |
productKey | 三元组productKey(设备所属产品) | |
deviceName | 三元组deviceName | |
deviceSecret | 三元组deviceSecret | |
IotId | IoT平台为该设备颁发的设备ID |
[](#q990to)3. IoT设备动态注册POP API
RegisterDevice API文档 https://help.aliyun.com/document_detail/69470.html
Java调用阿里云POP API示例 https://yuque.com/wongxming/iot-tech/upqoog
请求参数
名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Action | String | 是 | 要执行的操作,取值:RegisterDevice。 |
ProductKey | String | 是 | 指定要为其注册设备的产品的Key。 |
DeviceName | String | 否 | 为要注册的设备命名。设备名称应包含4-32个字符 |
返回参数
名称 | 类型 | 描述 |
---|---|---|
RequestId | String | 阿里云为该请求生成的唯一标识符。 |
Success | Boolean | 是否调用成功。ture表示调用成功,false表示调用失败。 |
ErrorMessage | String | 调用失败时,返回的出错信息。 |
Data | DeviceInfo | 调用成功时,返回注册的设备信息。详情参见DeviceInfo。 |
DeviceInfo 名称 | 类型 | 描述 |
---|---|---|
ProductKey | String | 设备隶属的产品Key。 |
DeviceName | String | 设备名称。 |
DeviceSecret | String | 设备密钥。 |
IotId | String | IoT平台为该设备颁发的设备ID,作为该设备的唯一标识符。 |
{
"RequestId":"57b144cf-09fc-4916-a272-a62902d5b207",
"Success": true,
"Data": {
"DeviceName": "CqXL5h5ysRTA4NxjABjj",
"ProductKey": "a1ysRTA4N0",
"DeviceSecret": "tXHf4ezGEHcwdyMwoCDHGBmk9a",
"IotId": "CqXL5h5ysRTA4NxjABjj0010fa"
}
}
这样我们设备激活时,先访问企业服务器业务API,获取IoT平台的三元组身份后,发起MQTT的长连接建立,最终实现设备上云的目的。