配布デバイス。、。/demos/bootstrap_posix_demo.cサンプルコードファイルが使用されています。
背景情報
ステップ1: クライアントの初期化
- ヘッダーファイルを追加
を含む... ... # 「aiot_bootstrap_api.h」 基になる依存関係を追加し、ログ出力機能を設定します。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);- aiot_bootstrap_init操作を呼び出して、
ブートストラップを作成します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、およびDeviceSecretに置き換えます。 */ 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接続を確立するときにサポートされるサーバー名インジケーター。 */ cred.x509_server_cert = ali_ca_cert; /* MQTTブローカーの検証に使用されるRSAルート証明書。 */ cred.x509_server_cert_len = strlen(ali_ca_crt); /* 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 ****** 取得したエンドポイントとポート番号を使用してMQTT接続を確立する場合は、device_secretパラメーターが必要です。
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; ケース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: リクエストを送信する
aiot_bootstrap_send_request操作を呼び出して、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: 応答を受け取る
- 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 IoT Platformによって返される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) { ケース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: デバイス配布メッセージを指定された場所に保存し、メモリスペースを解放します。 */ memcpy(demo_info->host、packet->data.connection_info.host、strlen(packet->data.connection_info.host)); demo_info->port = packet->data.connection_info.port; } } break; ケースAIOT_BOOTSTRAPRECV_NOTIFY: { printf("AIOT_BOOTSTRAPRECV_NOTIFY, cmd: % d\n", packet->data.notify.cmd); } default: { } break; } }
(オプション) ステップ5: MQTT接続を確立する
必要なエンドポイントとポート番号を取得したら、デバイスをMQTT経由でIoT Platformに接続します。 MQTT接続の詳細については、「概要」をご参照ください。
MQTT接続が確立されたら、次の手順を実行してデバイスを配布します。
- MQTT接続ハンドルとの関連付け aiot_bootstrap_setopt操作を呼び出します。
-
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_MQTT_HANDLE, (void *)mqtt_handle); パラメーター 例 説明 AIOT_BOOTSTRAPOPT_MQTT_HANDLE mqtt_handle デバイスがIoT Platformによって送信された配布メッセージを受信すると、このコールバックが呼び出されます。
-
- IoT Platformコンソールにログインし、デバイスを配布します。
- デバイスがメッセージを受信すると、デバイスはオフラインになります。 再実行 ステップ1からステップ4へ エンドポイントを取得し、デバイスをIoT Platformに再接続します。
ステップ6:
aiot_bootstrap_deinit操作を呼び出して、ブートストラップを破棄します。
res = aiot_bootstrap_deinit(&bootstrap_handle);
if (res < 0) {
printf("demo_start_stop failed\n");
return -1;
}