Alink 一型一密动态注册
一个产品下的一个设备通常拥有(productKey, productSecret, deviceName, deviceSecret)这个四元组,而设备认证登录物联网平台需要(productKey, deviceName, deviceSecret)这三元素。
动态注册就是指在不知道 deviceSecret 的情况下,向物联网平台申请一个 deviceSecret 。
动态注册有免白名单和不免白名单两种方式,区别在于后者更安全,因为需要预先上传设备的 deviceName 作为白名单,如何上传设备的 deviceName 在后面有介绍。
不免白名单
第一步需要预先上传设备的 deviceName,这一步对于阿里云物联网平台来说就是创建一个设备,创建设备时需要输入一个 deviceName,这个就是我们预先上传的值。注意此时的设备是未激活状态。
当设备处于未激活状态时,我们可以调用接口 aiot_dynregmq_send_request 请求该设备的 deviceSecret。请求过程中,物联网平台会刷新该设备的 deviceSecret ,然后将其下发。设备收到 deviceSecret 后,需要进行持久化操作,将其存储在 Flash 或 SD 卡上。
为什么需要做持久化操作呢?这是因为当设备被激活(成功认证一次)后,无论设备处于在线还是离线状态,请求该设备 deviceSecret 的操作都会失败,并返回错误码 -0x0305
(STATE_MQTT_CONNACK_RCODE_NOT_AUTHORIZED
) 。
免白名单
免白名单方式可以不预先上传设备的 deviceName,直接向云平台动态注册设备,此时设备得到的是 MQTT 连接时使用的 username, password, clientID,同样的,这三者也需要在设备上做持久化操作。
API 说明
首先需要用 aiot_dynregmq_init 函数创建一个 dynregmq 实例并设置默认参数,然后需要调用 aiot_dynregmq_setopt 函数配置一些参数,例如连接服务器地址,连接服务器端口,productKey,productSecret,deviceName,安全凭据,绑定接收回调函数,是否使用免白名单功能等。更全面的配置信息可以参考dynregmq选项配置说明。之后就是调用 aiot_dynregmq_send_request 接口向 dynregmq 服务器发送请求了,发送请求成功后我们需要调用 aiot_dynregmq_recv 接口阻塞地从服务器接收应答,应答消息通过之前绑定的回调函数返回。不需要使用动态注册功能后,使用 aiot_dynregmq_deinit 释放 dynregmq 实例句柄的资源。