このトピックでは、./demos/dynreg_basic_demo.c という C Link SDK のデモファイルを例として、Link SDK API を呼び出して IoT Platform に HTTPS リクエストを送信し、デバイスを動的に登録し、デバイスのアクティベーションに必要な認証情報を取得する方法を説明します。
背景情報
HTTPS 動的な登録の詳細については、「HTTPS 動的な登録の概要」をご参照ください。
ステップ1: 初期化
ヘッダーファイルを追加します。
#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; }
ステップ 2: 機能の設定
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 に変更することで、お使いのデバイスのエンドポイントを取得できます。IoT Platform コンソールの左上隅で、サービスがデプロイされているリージョンを確認できます。リージョン ID の詳細については、「サポートされているリージョン」をご参照ください。
この例では、China (Shanghai) リージョンのパブリックインスタンスを使用します。
説明China (Beijing) および China (Shenzhen) リージョンはサポートされていません。
product_key
a18wP******
IoT Platform コンソールでプロダクトを作成したときに取得される ProductKey と ProductSecret です。詳細については、「プロダクトの作成」をご参照ください。
product_secret
CpIlPVCXI7******
device_name
LightSwitch
デバイスの名前。このパラメーターの値は、IoT プラットフォームでデバイスを製品に追加したときに指定した
DeviceNameと同じである必要があります。IoT Platform は、デバイスアクティベーション中に DeviceName を検証します。DeviceName には、MAC アドレス、国際移動体装置識別番号 (IMEI)、シリアル番号 (SN) など、デバイスから直接読み取れる ID を使用することを推奨します。
重要名前は、IoT Platform でデバイスを作成するときに指定したものと同じである必要があります。
メッセージコールバックを設定します。
メッセージコールバック関数を設定します。
サンプルコード:
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_dynreg_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: コールバックでは、パケットが指す領域のコンテンツを保存する必要があります。コールバックが戻ると、この領域は解放されます。 */ 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; } }
手順3:リクエストの送信
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;
}手順4:応答の受信
登録リクエストメッセージが送信されると、IoT Platform は応答を返します。その後、デバイスは aiot_dynreg_recv を呼び出して応答を受信し、メッセージコールバック関数に基づいて対応するアクションを実行します。
res = aiot_dynreg_recv(dynreg_handle);
if (res < STATE_SUCCESS) {
printf("aiot_dynreg_recv failed: -0x%04X\n", -res);
return -1;
} サンプルプログラムは、出力処理を行うだけです。しかし、本番環境では、返されたデバイス ID 認証情報をローカルファイルに保存する必要もあります。この情報は、デバイスがログインするたびに IoT Platform に接続するために使用されます。
if (demo_info.device_secret != NULL) {
printf("device secret: %s\n", demo_info.device_secret);
free(demo_info.device_secret);
}手順 5: プログラムを終了する
aiot_dynreg_deinit を呼び出して、dynreg の クライアントインスタンスを破棄し、リソースを解放します。
res = aiot_dynreg_deinit(&dynreg_handle);