この例では、サンプルコードファイル ./demos/bootstrap_posix_demo.c を使用し、Link SDK for C の API を呼び出してデバイスを配布します。
背景情報
ステップ1: クライアントの初期化
-
ヘッダーファイルを追加します。
…… …… #include "aiot_bootstrap_api.h" 基になる依存関係を追加し、ログ出力機能を設定します。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);-
aiot_bootstrap_init を呼び出して
Bootstrapを作成しますbootstrap_handle = aiot_bootstrap_init(); if (bootstrap_handle == NULL) { printf("aiot_bootstrap_init failed\n"); return -1; }
ステップ2: 機能の設定
aiot_bootstrap_setopt を呼び出して、次の機能を設定します。
-
重要
トランスポート層セキュリティ (TLS) レイヤーでは、接続に証明書ベースのセキュリティタイプ (AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA) を使用する必要があります。
-
int32_t res = STATE_SUCCESS; void *bootstrap_handle = NULL, *mqtt_handle = NULL; aiot_sysdep_network_cred_t cred; demo_info_t demo_info; /* TODO: ご使用のデバイスの ProductKey と DeviceName に置き換えてください。 */ char *product_key = "a18wP******"; char *device_name = "LightSwitch"; char *device_secret = "uwMTmVAMnGGHaAkqmeDY6cHxxB******"; …… …… memset(&cred, 0, sizeof(aiot_sysdep_network_cred_t)); cred.option = AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA; /* RSA 証明書を使用して MQTT サーバーを認証します。 */ cred.max_tls_fragment = 16384; /* 最大フラグメント長は 16 KB です。その他の有効な値は 4 KB、2 KB、1 KB、0.5 KB です。 */ cred.sni_enabled = 1; /* TLS 接続確立時に Server Name Indicator (SNI) をサポートします。 */ cred.x509_server_cert = ali_ca_cert; /* MQTT サーバーの認証に使用する RSA ルート証明書です。 */ cred.x509_server_cert_len = strlen(ali_ca_cert); /* MQTT サーバーの認証に使用する RSA ルート証明書の長さです。 */ …… …… aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_HOST, (void *)host); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_PORT, (void *)&port); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_PRODUCT_KEY, (void *)product_key); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_DEVICE_NAME, (void *)device_name); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_NETWORK_CRED, (void *)&cred); …… …… -
パラメーター
例
説明
product_key
a18wP******
デバイス認証情報です。詳細については、「デバイス検証情報の取得」をご参照ください。
この例では、デバイスごとの一意の証明書認証方式を使用しています。
device_secret パラメーターは、デバイスが接続先ドメイン名とポート番号を取得した後に MQTT 接続を確立する際に使用されます。
device_name
LightSwitch
device_secret
uwMTmVAMnGGHaAkqmeDY6cHxxB******
-
-
メッセージコールバックを設定します。
-
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_RECV_HANDLER, (void *)demo_bootstrap_recv_handler); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_USERDATA, (void *)&demo_info); -
設定項目
値の例
説明
AIOT_BOOTSTRAPOPT_RECV_HANDLER
demo_bootstrap_recv_handler
デバイス配布メッセージを受信したときに呼び出される関数です。
AIOT_BOOTSTRAPOPT_USERDATA
demo_info
ユーザーコンテキストを設定します。
demo_bootstrap_recv_handlerがトリガーされると、userdataが返されます。使用する前に、返されたデータを適切な型にキャストしてください。
-
-
状態監視を設定します。
-
状態を監視するコールバックを定義します。
void demo_bootstrap_event_handler(void *handle, const aiot_bootstrap_event_t *event, void *userdata) { switch (event->type) { case AIOT_BOOTSTRAPEVT_INVALID_RESPONSE: { printf("AIOT_BOOTSTRAPEVT_INVALID_RESPONSE\n"); } break; case AIOT_BOOTSTRAPEVT_INVALID_CMD: { printf("AIOT_BOOTSTRAPEVT_INVALID_CMD\n"); } break; default: { } break; } } -
状態を監視するコールバックを指定します。
-
サンプルコード:
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_EVENT_HANDLER, (void *)demo_bootstrap_event_handler); -
パラメーター:
設定項目
値の例
説明
AIOT_BOOTSTRAPOPT_EVENT_HANDLER
demo_bootstrap_event_handler
デバイス接続のステータスが変更されると、コールバックが呼び出されて必要な操作が実行されます。
-
-
ステップ 3: リクエストの送信
デバイス配布リクエストを送信する前に、IoT Platform コンソールでデバイス配布操作が設定されていることを確認してください。設定されていない場合、返されるドメイン名とポートは、デバイスの現在の接続先のものになります。
aiot_bootstrap_send_request を呼び出して、前のステップで設定したパラメーターに基づいて HTTPS デバイス配布リクエストをサーバーに送信します。
HTTPS リクエストの詳細については、「デバイス配布のリクエストデータ形式」をご参照ください。
res = aiot_bootstrap_send_request(bootstrap_handle);
if (res < STATE_SUCCESS) {
printf("aiot_bootstrap_send_request failed, res: -0x%04X\n", -res);
return -1;
}
ステップ 4: 応答の受信
-
メッセージ送信後、IoT Platform から応答が返されます。デバイスは aiot_bootstrap_recv を呼び出して応答データを受信し、メッセージコールバックを通じて処理します。
res = aiot_bootstrap_recv(bootstrap_handle); if (res < STATE_SUCCESS) { printf("aiot_bootstrap_recv failed, res: -0x%04X\n", -res); return -1; } -
コールバック関数のロジックを記述します。
次の情報に基づいて、コールバック関数のロジックを記述します。
メッセージタイプ
説明
AIOT_BOOTSTRAPRECV_STATUS_CODE
サーバーから返される HTTP ステータスコードです。詳細については、「HTTP ステータスコード」をご参照ください。
サンプルコードでは、受信したステータスコードを処理していません。必要に応じて独自の処理ロジックを追加してください。
AIOT_BOOTSTRAPRECV_CONNECTION_INFO
デバイス配布が開始された後に IoT Platform から返される応答メッセージです。
受信するメッセージは aiot_bootstrap_recv_t 型です。デバイス接続用のドメイン名とポート番号である host と port の値を、ローカルデバイスに保存してください。
サンプルコードでは、受信したデバイス配布メッセージを出力するだけです。
AIOT_BOOTSTRAPRECV_NOTIFY
IoT Platform からプッシュされるデバイス配布通知メッセージです。
IoT Platform でデバイス配布操作を実行すると、デバイスにデバイス配布メッセージがプッシュされます。詳細については、「IoT Platform でのデバイス配布」をご参照ください。
サンプルコードでは、メッセージを出力するだけです。デバイスを切断し、新しいデバイス配布リクエストを送信してから接続を再確立するロジックを追加してください。
void demo_bootstrap_recv_handler(void *handle, const aiot_bootstrap_recv_t *packet, void *userdata) { demo_info_t *demo_info = (demo_info_t *)userdata; switch (packet->type) { case AIOT_BOOTSTRAPRECV_STATUS_CODE: { demo_info->code = packet->data.status_code.code; } break; case AIOT_BOOTSTRAPRECV_CONNECTION_INFO: { demo_info->host = malloc(strlen(packet->data.connection_info.host) + 1); if (demo_info->host != NULL) { memset(demo_info->host, 0, strlen(packet->data.connection_info.host) + 1); /* TODO: コールバック内で、デバイス配布メッセージの内容を指定された場所に保存します。この領域は後で SDK によって解放されます。 */ memcpy(demo_info->host, packet->data.connection_info.host, strlen(packet->data.connection_info.host)); demo_info->port = packet->data.connection_info.port; } } break; case AIOT_BOOTSTRAPRECV_NOTIFY: { printf("AIOT_BOOTSTRAPRECV_NOTIFY, cmd: %d\n", packet->data.notify.cmd); } default: { } break; } }
(オプション) ステップ 5: MQTT 接続の確立
デバイスの接続に必要なドメイン名とポートを取得した後、デバイスと IoT Platform 間で MQTT 接続を確立します。MQTT 接続の詳細については、「MQTT 接続」をご参照ください。
MQTT 接続が確立された後、次の手順を実行して再度デバイス配布を開始します。
-
aiot_bootstrap_setopt を呼び出して、MQTT 接続ハンドルを関連付けます。
-
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_MQTT_HANDLE, (void *)mqtt_handle); -
設定項目
例
説明
AIOT_BOOTSTRAPOPT_MQTT_HANDLE
mqtt_handle
IoT Platform からプッシュされるデバイス配布通知を受信するために、MQTT 接続ハンドルを設定します。
-
-
IoT Platform コンソールにログインし、デバイス配布操作を実行してください。
詳細については、「IoT Platform でのデバイス配布」をご参照ください。
-
デバイスがプッシュされたデバイス配布メッセージを受信すると、オフラインになります。その後、ステップ 1 からステップ 4 を繰り返し、新しいデバイス接続ドメイン名を取得して、デバイスを IoT Platform に再接続してください。
ステップ 6: プログラムの終了
aiot_bootstrap_deinit を呼び出して、bootstrap クライアントインスタンスを破棄し、リソースを解放します。
res = aiot_bootstrap_deinit(&bootstrap_handle);
if (res < 0) {
printf("demo_start_stop failed\n");
return -1;
}