HTTPS动态注册使用示例
本文以C Link SDK中的Demo文件./demos/dynreg_basic_demo.c
为例,介绍如何调用Link SDK的API,向物联网平台发起HTTPS协议的请求,动态注册设备,获取激活设备所需的认证信息。
背景信息
HTTPS动态注册的更多信息,请参见HTTPS动态注册概述。
步骤一:初始化
添加头文件。
#include "aiot_state_api.h" #include "aiot_sysdep_api.h" #include "aiot_dynreg_api.h"
配置底层依赖和日志输出。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);
调用aiot_dynreg_init,创建
dynreg
客户端实例,并初始化默认参数。dynreg_handle = aiot_dynreg_init(); if (dynreg_handle == NULL) { printf("aiot_dynreg_init failed\n"); return -1; }
步骤二:配置功能
调用aiot_dynreg_init,配置以下功能。
更多功能的配置项,请参见HTTPS动态注册配置项。
配置连接参数。
示例代码:
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的取值,请参见支持的地域。
本示例使用上海地域的公共实例。
说明不支持华北2(北京)、华南1(深圳)地域。
product_key
a18wP******
在物联网平台创建产品时,保存的产品的ProductKey和ProductSecret。更多信息,请参见创建产品。
product_secret
CpIlPVCXI7******
device_name
LightSwitch
设备的名称。在物联网平台为产品添加设备时,设置的DeviceName需与此参数保持一致。
因设备激活时会校验DeviceName,建议您采用可以直接从设备中读取到的ID,如设备的MAC地址、IMEI或SN码等,作为DeviceName使用。
重要需与物联网平台创建设备时设置的名称保持一致。
配置消息回调。
配置消息回调函数。
示例代码:
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
被调用时,该值会被传回。
定义消息回调函数。
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);