デバイスをリモートで設定するです。、。/demos/cota_basic_demo.cサンプルコードファイルを使用します。
背景情報
ステップ1: クライアントの初期化
ヘッダーファイルの追加
... …… # 「aiot_ota_api.h」を含む ……基になる依存関係を追加し、ログ出力機能を設定します。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);aiot_ota_init操作を呼び出してOTAを作成
ota_handle = aiot_ota_init(); if (NULL == ota_handle) { printf("aiot_ota_init failed\r\n"); aiot_mqtt_deinit(&mqtt_handle); リターン-2; }
ステップ2: 必要な機能の設定
aiot_ota_setopt操作を呼び出して、次の項目を設定します。
- MQTT接続ハンドルとの関連付け.重要 リモート設定固有のパラメーターを設定する前に、デバイス認証情報が指定されていることを確認してください。 詳細については、「例」をご参照ください。
aiot_ota_setopt(ota_handle, AIOT_OTAOPT_MQTT_HANDLE, mqtt_handle);パラメーター 例 説明 AIOT_OTAOPT_MQTT_HANDLE mqtt_handle MQTT接続を確立する必要があります。 このパラメータは、MQTT接続ハンドルに関連付けるために使用されます。
- リモート構成コマンドを処理するコールバックを指定します。
aiot_ota_setopt(ota_handle、AIOT_OTAOPT_RECV_HANDLER、demo_ota_recv_handler);パラメーター 例 説明 AIOT_OTAOPT_MQTT_HANDLE demo_ota_recv_handler このコールバックは、デバイスがIoT Platformからリモート設定コマンドを受信したときに呼び出されます。
ステップ3: 設定情報を要求する
IoT Platformからリモート設定コマンドが送信されたときにデバイスがオフラインの場合、デバイスがオンラインになった後にリモート設定コマンドを要求できます。
説明 IoT Platformでデバイスジョブが作成されていない場合、操作を呼び出すと、
revice task get detail reply, task_id:[$next],status:[9] のレスポンスが返されます。 - aiot_mqtt_pub操作を呼び出して、IoT Platformからリモート構成情報を取得します。
{ char * topic_string = "/sys/a18wP ******/LightSwitch/thing/config/get"; char * payload_string = "{\" id\":\" 123\",\" params\":{\" configScope\":\" product\",\" getType\":\" file\"}}"; res = aiot_mqtt_pub(mqtt_handle, topic_string, (uint8_t *)payload_string, strlen(payload_string), 0); if (res < STATE_SUCCESS) { printf("aiot_mqtt_pub failed: -0x % 04X\r\n" 、-res); /* MQTT接続の確立に失敗した場合、MQTTインスタンスのリソースを解放します。 */ goto出口; } }パラメーター 例 説明 topic_string /sys/a18wP ****** 5/LightSwitch/thing/config/get リモート設定情報を取得するために使用されるトピック。 詳細については、「トピック」をご参照ください。
a1oGs ******はデバイスのProductKeyです。LightSwitchは、デバイスのDeviceNameです。
詳細については、「デバイス検証情報の取得」をご参照ください。
payload_string {\"id\":\"123\",\"params\" :{\ "configScope\":\"product\",\"getType\":\"file\"}} 要求メッセージの内容。 メッセージの内容はJSON形式です。 コンテンツは、Alinkデータのparamsパラメーターの値です。 詳細については、「IoT Platformからのデバイス要求設定情報」をご参照ください。
- IoT Platformがリクエストを受信すると、IoT Platformは設定情報をデバイスに返します。
- aiot_mqtt_recv操作を呼び出して、リモート構成情報を受信します。
g_dl_handleポインターがnullの場合、クライアントはMQTTメッセージを取得するリクエストを定期的に送信します。g_dl_handleポインターがnull以外の場合、aiot_download_recv関数が呼び出されます。
while (1) { aiot_mqtt_process(mqtt_handle); res = aiot_mqtt_recv(mqtt_handle); if (res == STATE_SYS_DEPEND_NWK_CLOSED) { 睡眠 (1); } if (NULL != g_dl_handle) { /* リモート設定情報を受信する前に、MQTTメッセージの受信タイムアウト時間を100 msに設定して、2回のリモート設定のダウンロード間隔を短縮します。 */ int32_t ret = aiot_download_recv(g_dl_handle); timeout_ms = 100; if (STATE_DOWNLOAD_FINISHED == ret) { aiot_download_deinit(&g_dl_handle); /* リモート設定情報を受信した後、MQTTメッセージの受信タイムアウト時間をデフォルト値の5,000 msに設定します。 */ timeout_ms = 5000; } aiot_mqtt_setopt(mqtt_handle、AIOT_MQTTOPT_RECV_TIMEOUT_MS、(void *)&timeout_ms); } } - デバイスが構成情報を受信した後、
demo_ota_recv_handlerコールバックが呼び出されます。コールバックの処理ロジックを指定する場合は、次の項目に注意してください。- IoT Platformは、
/sys/ ${ProductKey} /${DeviceName} /thing/config/pushトピックを使用して設定情報を送信します。 - Link SDKは、設定情報を自動的に解析します。 aiot_ota_recv_tはデータ形式を示します。 リンクSDKは受信したを自動的に解析します
- AIOT_OTARECV_COTAはメッセージタイプを示します。
コールバックは、HTTPSリクエストを開始し、リモート設定ファイルをダウンロードするために使用されます。 コールバックの書き込み方法の詳細については、「手順5: リモート構成ファイルのダウンロード」をご参照ください。
- IoT Platformは、
ステップ4: リモート設定情報を受信する
デバイスがオンラインの場合、デバイスはIoT Platformから送信されたリモート設定情報を受信できます。 次に、demo_ota_recv_handlerコールバックが呼び出されます。
詳細は、「コールバックロジックの指定」をご参照ください。
ステップ5: リモート設定ファイルをダウンロードする
重要 デバイスがリモート設定情報を受信した後、デバイスは設定ファイルを自動的にダウンロードしません。 ファイルをダウンロードするには、Link SDKが提供するAPI操作を呼び出す必要があります。
- ダウンローダーを初期化します。 aiot_download_init操作を呼び出して、
ダウンロードuint32_t res = 0を作成します。 uint16_t port = 443; uint32_t max_buffer_len = 2048; aiot_sysdep_network_cred_t cred; void * dl_handle = aiot_download_init(); if (NULL == dl_handle | | NULL == ota_msg->task_desc) { return; } printf("configId: % s、configSize: % u Bytes\r\n" 、ota_msg->task_desc-> バージョン、 ota_msg->task_desc->size_total); memset(&cred, 0, sizeof(aiot_sysdep_network_cred_t)); cred.option = AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA; cred.max_tls_fragment = 16384; cred.x509_server_cert = ali_ca_cert; cred.x509_server_cert_len = strlen(ali_ca_cert); - パラメーターを設定します。 aiot_download_setopt操作を呼び出して、ダウンロードタスクに関連するパラメーターを設定します。
/* ダウンロード用のTLSプロトコルを設定します。 */ if ((STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_NETWORK_CRED, (void *)(&cred)))) | | | | /* アクセスするサーバのポート番号を設定します。 */ (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_NETWORK_PORT, (void *)(&port))) | | | /* タスク情報を設定します。 ota_msg入力パラメーターのtask_descフィールドから情報を取得できます。 この情報には、ダウンロードURL、リモート構成ファイルのサイズとバージョンが含まれます。 */ (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_TASK_DESC, (void *)(ota_msg->task_desc))) | | | /* ダウンロードしたコンテンツを受信したときに呼び出されるコールバックを設定します。 */ (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_RECV_HANDLER, (void *)(demo_download_recv_handler))) | | | /* 1回のダウンロードの最大バッファ長を設定します。 制限に達すると、ユーザーに通知されます。 */ (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_BODY_BUFFER_MAX_LEN, (void *)(&max_buffer_len))) | | | /* HTTP GETリクエストをHTTPサーバーに送信します。 */ (STATE_SUCCESS != aiot_download_send_request(dl_handle)) { if (res != STATE_SUCCESS) { aiot_download_deinit(&dl_handle); break; } } - ダウンロードリクエストを開始すると、IoT Platformは応答メッセージを返します。 次に、
demo_download_recv_handlerコールバックが呼び出され、リモート構成ファイルがダウンロードされます。コールバックの処理ロジックを指定する場合は、次の項目に注意してください。- aiot_download_recv_tはコールバックの入力パラメーターです。 このパラメーターは、データ形式を示します。
- AIOT_DLRECV_HTTPBODYは、メッセージタイプ (
packet->type) を示します。 - この例では、情報が印刷される。 設定ファイルは、ビジネスニーズに基づいて指定された場所にダウンロードできます。
void demo_download_recv_handler(void * handle, const aiot_download_recv_t * packet, void * userdata) { /* packet->typeはAIOT_DLRECV_HTTPBODYにのみ設定できます。 */ if (!packet | | AIOT_DLRECV_HTTPBODY != packet->type) { return; } int32_tパーセント=packet->data.percent; uint8_t * src_buffer = packet->data.buffer; uint32_t src_buffer_len = packet->data.len; /* パーセントの負の値は、データ受信中に例外が発生したか、ダイジェスト認証が失敗したことを示します。 */ if (パーセント <0) { /* データ受信中に例外が発生するか、ダイジェスト認証が失敗します。 */ printf("exception happend, percent is % d\r\n", percent); 戻る; } …… ... } - aiot_download_report_progress操作を呼び出して、ダウンロードの進行状況を送信します。
void demo_download_recv_handler(void * handle, const aiot_download_recv_t * packet, void * userdata) { /* packet->typeはAIOT_DLRECV_HTTPBODYにのみ設定できます。 */ if (!packet | | AIOT_DLRECV_HTTPBODY != packet->type) { 戻ります。... ... aiot_download_report_progress (ハンドル、パーセント); printf("config len is % d, config content is %.* s\r\n", src_buffer_len, src_buffer_len, (char *)src_buffer); } - ファイルをダウンロードした後、aiot_download_deinit操作を呼び出して、ハンドル (
g_dl_handle) をクリアします。while (1) { aiot_mqtt_process(mqtt_handle); res = aiot_mqtt_recv(mqtt_handle); if (res == STATE_SYS_DEPEND_NWK_CLOSED) { 睡眠 (1); } if (NULL != g_dl_handle) { /* リモート設定情報を受信する前に、MQTTメッセージの受信タイムアウト時間を100 msに設定して、2回のリモート設定のダウンロード間隔を短縮します。 */ int32_t ret = aiot_download_recv(g_dl_handle); timeout_ms = 100; if (STATE_DOWNLOAD_FINISHED == ret) { aiot_download_deinit(&g_dl_handle); /* リモート設定情報を受信した後、MQTTメッセージの受信タイムアウト時間をデフォルト値の5,000 msに設定します。 */ timeout_ms = 5000; } aiot_mqtt_setopt(mqtt_handle、AIOT_MQTTOPT_RECV_TIMEOUT_MS、(void *)&timeout_ms); } }
ステップ6: プログラムを終了する
aiot_ota_deinit操作を呼び出して、OTAを破棄します。
aiot_ota_deinit(&ota_handle);