全部产品
云市场

设备认证

更新时间:2019-03-15 17:20:17

设备身份认证

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

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

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

一机一密编程

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

  • HAL_GetProductKey
  • HAL_GetDeviceName
  • HAL_GetDeviceSecret

代码示例:

  1. int main(int argc, char *argv[])
  2. {
  3. void *pclient = NULL;
  4. int res = 0;
  5. int loop_cnt = 0;
  6. iotx_mqtt_param_t mqtt_params;
  7. memset(&mqtt_params, 0x0, sizeof(mqtt_params));
  8. mqtt_params.handle_event.h_fp = example_event_handle;
  9. pclient = IOT_MQTT_Construct(&mqtt_params);
  10. if (NULL == pclient) {
  11. EXAMPLE_TRACE("MQTT construct failed");
  12. return -1;
  13. }
  14. ...

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

一型一密编程

使用的流程示意

image | left | 685x89

它工作时, IoT设备端和外界发生网络通信的交互过程是

简写说明

  • PK: ProductKey, 设备品类标识字符串
  • PS: ProductSecret, 设备品类密钥
  • DN: DeviceName, 某台设备的标识字符串
  • DS: DeviceSecret, 某台设备的设备密钥

image | left | 489x372

流程简述:

  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

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "infra_types.h"
  4. #include "infra_defs.h"
  5. #include "dynreg_api.h"

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

  1. iotx_http_region_types_t region = IOTX_HTTP_REGION_SHANGHAI;
  2. HAL_Printf("dynreg example\n");
  3. memset(&meta,0,sizeof(iotx_dev_meta_info_t));
  4. HAL_GetProductKey(meta.product_key);
  5. HAL_GetProductSecret(meta.product_secret);
  6. HAL_GetDeviceName(meta.device_name);

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

调用一型一密的API获取 DeviceSecret

  1. res = IOT_Dynamic_Register(region, &meta);
  2. if (res < 0) {
  3. HAL_Printf("IOT_Dynamic_Register failed\n");
  4. return -1;
  5. }
  6. 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接口

原型

  1. 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