设备的身份认证分为一机一密以及一型一密两种:

  • 一机一密: 在设备上烧写设备的ProductKey、DeviceName、DeviceSecret,然后适配相应的HAL并调用SDK提供的连接云端的函数即可,这种方式要求对设备的产线工具进行一定的修改,需要对每个设备烧写不同的DeviceName和DeviceSecret;

  • 一型一密: 设备上烧写设备的ProductKey、ProductSecret,每个设备需要具备自己的唯一标识并将该标识预先上传到阿里云IoT物联网平台,然后调用SDK提供的函数连接云端。这种方式每个设备上烧写的信息是固定的ProductKey、ProductSecret

一机一密编程

设备厂商需要实现下面的三个HAL,用于让SDK获取设备三元组:

  • HAL_GetProductKey
  • HAL_GetDeviceName
  • HAL_GetDeviceSecret

代码示例:

int main(int argc, char *argv[])
{
    void                   *pclient = NULL;
    int                     res = 0;
    int                     loop_cnt = 0;
    iotx_mqtt_param_t       mqtt_params;

    memset(&mqtt_params, 0x0, sizeof(mqtt_params));
    mqtt_params.handle_event.h_fp = example_event_handle;

    pclient = IOT_MQTT_Construct(&mqtt_params);
    if (NULL == pclient) {
        EXAMPLE_TRACE("MQTT construct failed");
        return -1;
    }
    ...

}    
			

++注:IOT_MQTT_Construct()将会调用上面提到的HAL_GetProductKey()等三个HAL函数去获取设备的身份信息。++

一型一密编程

使用的流程示意

简写说明

  • PK: ProductKey, 设备品类标识字符串
  • PS: ProductSecret, 设备品类密钥
  • DN:DeviceName, 某台设备的标识字符串
  • DS: DeviceSecret, 某台设备的设备密钥
流程简述:
  1. 设备使用PK、PS和设备标识(DN)到阿里云物联网获取该设备对应的DS
  2. 阿里云物联网的动态注册Server将查找该设备的标识(DN)是否在该PK对应的设备列表,如果该设备在列表中则将该设备的DS返回
  3. 设备收到DS之后,将使用一机一密的方式计算MQTT连接参数以及签名
  4. 设备使用计算出来的MQTT连接参数连接阿里云物联网平台

注1: 用户必须将获取的DeviceSecret持久化到设备, 以备后续使用. 若获取的DeviceSecret丢失可能导致设备无法上线等严重后果, 云端服务器不会接受已激活设备重复的动态注册请求

注2: 使用一型一密功能, 用户必须对每个设备进行预注册, 即在阿里云物联网平台的控制台上传每个设备的DeviceName,并且在控制台上打开对应产品的动态注册功能

例子程序讲解

一型一密功能的例子程序在 src/dynamic_register/examples/dynreg_example.c, 以下对其逐段讲解

要使用一型一密功能, 要包含它的头文件 dynreg_api.h

#include <stdio.h>
#include <string.h>
#include "infra_types.h"
#include "infra_defs.h"
#include "dynreg_api.h"
			

准备输入参数 region 和出入参结构体 meta

iotx_http_region_types_t region = IOTX_HTTP_REGION_SHANGHAI;
HAL_Printf("dynreg example\n");

memset(&meta,0,sizeof(iotx_dev_meta_info_t));
HAL_GetProductKey(meta.product_key);
HAL_GetProductSecret(meta.product_secret);
HAL_GetDeviceName(meta.device_name);
			

以上例子程序用 IOTX_CLOUD_REGION_SHANGHAI 代表的华东二站点作为例子, 演示连接上海服务器时候的情况, 另一个入参 meta 其实就是填入设备的 PK/PS/DN

调用一型一密的API获取 DeviceSecret

res = IOT_Dynamic_Register(region, &meta);
if (res < 0) {
    HAL_Printf("IOT_Dynamic_Register failed\n");
    return -1;
}

HAL_Printf("\nDevice Secret: %s\n\n", meta.device_secret);
			

这个 IOT_Dynamic_Register() 接口就是一型一密功能点唯一提供的用户接口, 若执行成功, 在参数 meta 中将填上从服务器成功获取到的 DeviceSecret

其它

参考上面的图示

  • 第1步和第2步对应用户接口: IOT_Dynamic_Register()
  • 第3步对应用户接口: IOT_Sign_MQTT()
  • 第4步对应用户接口: IOT_MQTT_Construct()

注:

  • 因为当设备获取到DeviceSecret之后再次调用IOT_Dynamic_Register()将会返回失败,因此用户编程时获取到DeviceSecret之后需要将其保存到Flash中;
  • 用户的程序在调用IOT_Dynamic_Register()之前应该先调用HAL_GetDeviceSecret()查看设备是否已经获取到了DeviceSecret,如果已经获取到,则无需再次去调用IOT_Dynamic_Register()

功能API接口

原型

int32_t IOT_Dynamic_Register(iotx_http_region_types_t region, iotx_dev_meta_info_t *meta);
			

接口说明

根据输入参数中指定的站点区域, 以及productKeyproductSecret, 去云端为deviceName指定的设备去云端申请deviceSecret

参数说明

参数 数据类型 方向 说明
region iotx_http_region_types_t 输入 表示设备将要工作的区域, 例如美西/新加坡/日本/华东2站点等
meta iotx_dev_meta_info_t * 输入输出 输入的时候带入设备的 PK/PS/DN, 输出的时候返回从服务器取到的 DS