すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:例:

最終更新日:Apr 09, 2025

デバイスをリモートで設定するです。。/demos/cota_basic_demo.cサンプルコードファイルを使用します。

背景情報

  • リモート設定の詳細については、「概要」をご参照ください。
  • 概要

ステップ1: クライアントの初期化

  1. ヘッダーファイルの追加

    ...
    ……
    # 「aiot_ota_api.h」を含む
    …… 
  2. 基になる依存関係を追加し、ログ出力機能を設定します。

    aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb); 
  3. 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操作を呼び出して、次の項目を設定します。

  1. MQTT接続ハンドルとの関連付け.
    重要 リモート設定固有のパラメーターを設定する前に、デバイス認証情報が指定されていることを確認してください。 詳細については、「」をご参照ください。
    • aiot_ota_setopt(ota_handle, AIOT_OTAOPT_MQTT_HANDLE, mqtt_handle);
    • パラメーター説明
      AIOT_OTAOPT_MQTT_HANDLEmqtt_handleMQTT接続を確立する必要があります。 このパラメータは、MQTT接続ハンドルに関連付けるために使用されます。

  2. リモート構成コマンドを処理するコールバックを指定します。
    • aiot_ota_setopt(ota_handle、AIOT_OTAOPT_RECV_HANDLER、demo_ota_recv_handler);
    • パラメーター説明
      AIOT_OTAOPT_MQTT_HANDLEdemo_ota_recv_handlerこのコールバックは、デバイスがIoT Platformからリモート設定コマンドを受信したときに呼び出されます。

ステップ3: 設定情報を要求する

IoT Platformからリモート設定コマンドが送信されたときにデバイスがオフラインの場合、デバイスがオンラインになった後にリモート設定コマンドを要求できます。

説明 IoT Platformでデバイスジョブが作成されていない場合、操作を呼び出すと、revice task get detail reply, task_id:[$next],status:[9] のレスポンスが返されます。
  1. 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からのデバイス要求設定情報」をご参照ください。

  2. IoT Platformがリクエストを受信すると、IoT Platformは設定情報をデバイスに返します。
    説明 リモート設定情報の最大サイズは64 KBです。
    IoT Platformコンソールで、リモート設定機能を有効にし、設定情報を編集します。 詳細は、「リモート設定」をご参照ください。
  3. 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);
            }
        }
  4. デバイスが構成情報を受信した後、demo_ota_recv_handlerコールバックが呼び出されます。
    コールバックの処理ロジックを指定する場合は、次の項目に注意してください。
    • IoT Platformは、/sys/ ${ProductKey} /${DeviceName} /thing/config/pushトピックを使用して設定情報を送信します。
    • Link SDKは、設定情報を自動的に解析します。 aiot_ota_recv_tはデータ形式を示します。 リンクSDKは受信したを自動的に解析します
    • AIOT_OTARECV_COTAはメッセージタイプを示します。
    • コールバックは、HTTPSリクエストを開始し、リモート設定ファイルをダウンロードするために使用されます。 コールバックの書き込み方法の詳細については、「手順5: リモート構成ファイルのダウンロード」をご参照ください。

ステップ4: リモート設定情報を受信する

デバイスがオンラインの場合、デバイスはIoT Platformから送信されたリモート設定情報を受信できます。 次に、demo_ota_recv_handlerコールバックが呼び出されます。

詳細は、「コールバックロジックの指定」をご参照ください。

ステップ5: リモート設定ファイルをダウンロードする

重要 デバイスがリモート設定情報を受信した後、デバイスは設定ファイルを自動的にダウンロードしません。 ファイルをダウンロードするには、Link SDKが提供するAPI操作を呼び出す必要があります。
  1. ダウンローダーを初期化します。
    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); 

  2. パラメーターを設定します。
    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;
                    }
                }

  3. ダウンロードリクエストを開始すると、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);
            戻る;
        }
    ……
    ...
    }
  4. 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);
    } 
  5. ファイルをダウンロードした後、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);

次のステップ

  • この例では、。/output // cota-basic-demo実行ファイルが生成されます。

    詳細については、「環境の準備」をご参照ください。

  • [ログの表示]します。