本文以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);