本文以C Link SDK中的Demo文件./demos/dynreg_basic_demo.c为例,介绍如何调用Link SDK的API,向物联网平台发起HTTPS协议的请求,动态注册设备,获取激活设备所需的认证信息

背景信息

HTTPS动态注册的更多信息,请参见概述

步骤一:初始化

  1. 添加头文件。
    #include "aiot_state_api.h"
    #include "aiot_sysdep_api.h"
    #include "aiot_dynreg_api.h"
  2. 配置底层依赖和日志输出。
        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. 调用aiot_dynreg_init,创建dynreg客户端实例,并初始化默认参数。
        dynreg_handle = aiot_dynreg_init();
        if (dynreg_handle == NULL) {
            printf("aiot_dynreg_init failed\n");
            return -1;
        }

步骤二:配置功能

调用aiot_dynreg_init,配置以下功能。

  1. 配置连接参数
  2. 配置消息回调
  3. 更多功能的配置项,请参见HTTPS动态注册配置项
  1. 配置连接参数
    • 示例代码:
          char       *url = "iot-auth.cn-shanghai.aliyuncs.com"; 
      
          ……
      
          char *product_key       = "a18wP******";
          char *product_secret    = "CpIlPVCXI7******";
          char *device_name       = "LightSwitch";
          ……
          ……
      
          /* 配置连接的服务器地址。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_HOST, (void *)host);
          /* 配置连接的服务器端口。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_PORT, (void *)&port);
          /* 配置设备ProductKey。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_PRODUCT_KEY, (void *)product_key);
          /* 配置设备ProductSecret。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_PRODUCT_SECRET, (void *)product_secret);
          /* 配置设备DeviceName。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_DEVICE_NAME, (void *)device_name);
          /* 配置网络连接的安全凭据。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_NETWORK_CRED, (void *)&cred);
          ……
          ……
    • 相关参数:
      参数 示例 说明
      url iot-auth.cn-shanghai.aliyuncs.com HTTPS动态注册的服务器域名。

      您可将示例值中的cn-shanghai更改为您服务所在的地域ID,可获得您设备的接入域名。

      请在物联网平台控制台左上角,查看您服务所在的地域。地域ID的取值,请参见地域和可用区

      本示例使用上海地域的公共实例。

      product_key a18wP******

      在物联网平台创建产品时,保存的产品的ProductKeyProductSecret。更多信息,请参见创建产品

      product_secret CpIlPVCXI7******
      device_name LightSwitch

      设备的名称。在物联网平台为产品添加设备时,设置的DeviceName需与此参数保持一致。

      因设备激活时会校验DeviceName,建议您采用可以直接从设备中读取到的ID,如设备的MAC地址、IMEI或SN码等,作为DeviceName使用。

      注意 需与物联网平台创建设备时设置的名称保持一致。
  2. 配置消息回调
    1. 配置消息回调函数。
      • 示例代码:
         int main(int argc, char *argv[])
        {
            …… 
            ……
            aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_RECV_HANDLER, (void *)demo_dynreg_recv_handler);
            aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_USERDATA, (void *)&demo_info);
            …… 
            ……
        }
      • 相关参数:
        配置项 示例值 说明
        AIOT_DYNREGOPT_RECV_HANDLER demo_dynreg_recv_handler 设置消息回调。当接收消息时,根据该回调函数的设置,执行对应的处理。
        AIOT_DYNREGOPT_USERDATA &demo_info 设置上下文。当demo_dynregmq_recv_handler被调用时,该值会被传回。
    2. 定义消息回调函数。
      void demo_dynreg_recv_handler(void *handle, const aiot_dynreg_recv_t *packet, void *userdata)
      {
          demo_info_t *demo_info = (demo_info_t *)userdata;
          switch (packet->type) {
              case AIOT_DYNREGRECV_STATUS_CODE: {
                  demo_info->code = packet->data.status_code.code;
              }
              break;
              /* TODO: 回调中需保存packet指向的空间内容,回调返回后, 这些空间会被释放。 */
              case AIOT_DYNREGRECV_DEVICE_INFO: {
                  demo_info->device_secret = malloc(strlen(packet->data.device_info.device_secret) + 1);
                  if (demo_info->device_secret != NULL) {
                      memset(demo_info->device_secret, 0, strlen(packet->data.device_info.device_secret) + 1);
                      memcpy(demo_info->device_secret, packet->data.device_info.device_secret,
                             strlen(packet->data.device_info.device_secret));
                  }
              }
              break;
              default: {
              }
              break;
          }
      }

步骤三:发送请求

调用aiot_dynreg_send_request,根据配置连接的参数,向服务器发起动态注册请求。

/* 发送动态注册请求 */
    res = aiot_dynreg_send_request(dynreg_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_dynreg_send_request failed: -0x%04X\n", -res);
        return -1;
    }

步骤四:接收应答

注册请求消息发送后,物联网平台返回应答报文。设备端调用aiot_dynreg_recv,接收应答消息,根据消息回调函数,执行对应处理。

    res = aiot_dynreg_recv(dynreg_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_dynreg_recv failed: -0x%04X\n", -res);
        return -1;
    }  

例程仅做打印操作,但在实际业务环境中,您还需编写代码,将返回的设备身份认证信息,保存至本地。每当设备登录时,通过该认证信息建立与物联网平台的连接。

    if (demo_info.device_secret != NULL) {
        printf("device secret: %s\n", demo_info.device_secret);
        free(demo_info.device_secret);
    }

步骤五:退出程序

调用aiot_dynreg_deinit,销毁dynreg客户端实例,释放资源。

    res = aiot_dynregmq_deinit(&dynregmq_handle);
            

后续步骤

  • 例程文件配置完成后,需进行编译,生成可执行文件./output/dynreg-basic-demo

    更多信息,请参见编译与运行

  • 关于运行结果的详细说明,请参见运行日志