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

IoT Platform:サンプルコード

最終更新日:Apr 09, 2025

この記事では、Link SDK for CのAPI操作を呼び出して、デバイスファイルをMQTT経由でIoT Platformにアップロードする方法について説明します。 これにより、ハードウェアリソースのオーバーヘッドと開発コストが削減されます。この例では、。/demos/mqtt_upload_basic_demo.cサンプルコードファイルを使用します。

背景

  • ファイルのアップロード機能の詳細については、「概要」をご参照ください。

  • ファイルをアップロードするには、MQTTプロトコルを使用する必要があります。

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

  1. ヘッダーファイルを追加します。

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

    /* portfiles/aiot_portフォルダに格納されているシステム関連関数のコレクション。 * /
    extern aiot_sysdep_portfile_t g_aiot_sysdep_portfile;
    /* external/ali_ca_cert.cにあるサーバー証明書。 * /
    extern const char * ali_ca_cert;
    /* SDKのログを印刷するためのコールバック。 * /
    static int32_t demo_state_logcb(int32_t code, char * message)
    {
        printf("% s" 、メッセージ);
        0を返します。} 
  3. aiot_mqtt_upload_init操作を呼び出して、クライアントインスタンスを作成し、デフォルトパラメーターを初期化します。

    mqtt_handle = aiot_mqtt_upload_init();

ステップ2: 必要な機能の設定

aiot_mqtt_upload_setopt操作を呼び出して、次の項目を設定します。

  1. MQTT接続ハンドルに関連付けます。

    重要

    ファイルアップロード固有のパラメーターを設定する前に、デバイス認証情報が指定されていることを確認してください。

    MQTT接続を確立する必要があります。 次のサンプルコードを使用して、MQTT接続ハンドルに関連付けます。

    void * up_handle = aiot_mqtt_upload_init();
        aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_MQTT_HANDLE, mqtt_handle); 
  2. (オプション)

    ファイルのアップロード固有のパラメーターを設定します。

    • サンプルコード

      uint32_t rsp_timeout = 2000;
          aiot_mqtt_upload_setopt(up_handle、AIOT_MQTT_UPLOADOPT_RSP_TIMEOUT_MS、rsp_timeout);
          uint32_t rety_count = 5;
          aiot_mqtt_upload_setopt(up_handle、AIOT_MQTT_UPLOADOPT_RETRY_COUNT、&rety_count);
          uint32_t block_size = 1024;
          aiot_mqtt_upload_setopt(up_handle、AIOT_MQTT_UPLOADOPT_DEFAULT_BLOCK_SIZE、&block_size); 
    • パラメータ:

      パラメーター

      説明

      rsp_timeout

      各データパケットの再送信タイムアウト期間をミリ秒単位で指定します。

      このパラメーターを指定しないか、このパラメーターを0に設定した場合、タイムアウト時間は5秒です。

      この例では、値は2000に設定されています。

      AIOT_MQTT_UPLOADOPT_RSP_TIMEOUT_MS

      aiot_mqtt_upload_setopt操作を呼び出して、各データパケットの再送信タイムアウト期間を設定します。

      rety_count

      タイムアウトエラーが発生した場合のリトライ回数を指定します。

      デフォルト値は 10 です。

      この例では、値は5に設定されています。

      AIOT_MQTT_UPLOADOPT_RETRY_COUNT

      aiot_mqtt_upload_setopt操作を呼び出して、タイムアウトエラーが発生した場合の再試行回数を設定します。

      block_size

      各データパケットの最大サイズをバイト単位で指定します。

      有効な値: 256〜131072。 デフォルト値:2048。

      この例では、値は1024に設定されています。

      AIOT_MQTT_UPLOADOPT_DEFAULT_BLOCK_SIZE

      aiot_mqtt_upload_setopt操作を呼び出して、各データパケットの最大サイズを設定します。

(オプション) ステップ3: ファイルのCRC64チェックサムを計算する

ファイルをアップロードするとき、CRC16アルゴリズムを使用して、デフォルトでファイルチェックサムが計算されます。 ビジネスニーズに基づいてCRC64アルゴリズムを指定できます。 デフォルトでは、SDKはCRC64-specific Cライブラリを提供します。

この例では、CRC64アルゴリズムが使用されます。

uint64_t crc = mqtt_upload_get_file_crc64(MQTT_UPLOAD_FILE_NAME);

ステップ4: ファイルのアップロード要求を開始する

  1. aiot_mqtt_upload_open_stream操作を呼び出して、IoT Platformへのファイルアップロードリクエストを開始します。

    重要
    • 同じ名前のファイルをアップロードする場合は、aiot_mqtt_upload_open_stream操作を呼び出して複数のリクエストを開始しないでください。 アップロードが失敗した後、ファイルをアップロードするリクエストを再開できます。

    • 異なる名前のファイルをアップロードする場合は、aiot_mqtt_upload_open_stream操作を呼び出して複数のリクエストを開始できます。 複数のファイルをアップロードするリクエストを開始することもできます。

    • サンプルコード

      • ファイルサイズとファイル名を定義します。

        #define MQTT_UPLOAD_FILE_SIZE (2*1024)
        # define MQTT_UPLOAD_FILE_NAME ("mqttuploadfile001.txt")
        # define MQTT_UPLOAD_FILE_SIZE2 (1*1024 + 127)
        # define MQTT_UPLOAD_FILE_NAME2 ("mqttuploadfile002.txt") 
      • ファイルをアップロードするリクエストを開始します。

        uint32_t test_userdata = 100;
            aiot_mqtt_upload_open_stream(up_handle、MQTT_UPLOAD_FILE_NAME、MQTT_UPLOAD_FILE_SIZE、
                AIOT_MQTT_UPLOAD_FILE_MODE_OVERWRITE、&crc、mqtt_upload_read_data_handler、&test_userdata);
            mqtt_upload_create_upload_file(MQTT_UPLOAD_FILE_NAME2、MQTT_UPLOAD_FILE_SIZE2);
            aiot_mqtt_upload_open_stream(up_handle、MQTT_UPLOAD_FILE_NAME2、MQTT_UPLOAD_FILE_SIZE2、
                AIOT_MQTT_UPLOAD_FILE_MODE_OVERWRITE, NULL, mqtt_upload_read_data_handler, NULL); 
    • サンプルコードの説明

      • この例では、mqttuploadfile001.txtmqttuploadfile002.txtの2つのファイルをアップロードする操作が呼び出されます。

        重要
        • 次のファイルの命名規則に注意してください。

          • 各ファイル名には、数字、文字、アンダースコア (_) 、およびピリオド (.) を使用できます。

          • 各ファイル名は数字または文字で始まる必要があります。

          • 各ファイル名の長さは最大100バイトです。

        • 1つのファイルのサイズは最大16 MBです。

      • mqttuploadfile001.txtにはCRC64チェックサムがあり、userdataパラメーターが指定されています。

      • mqttuploadfile002.txtにはCRC64チェックサムがなく、userdataパラメーターが指定されていません。

      • この例では、処理ポリシーはoverwriteに設定されています。 次の表に、使用可能な処理ポリシーを示します。

        処理ポリシー (conflictStrategy)

        説明

        overwrite

        このポリシーはデフォルトで使用されます。 このポリシーを使用すると、IoT Platformは既存のファイルを削除し、新しくアップロードされたファイルのみを保持します。

        append

        デバイスがファイルアップロードリクエストを開始すると、IoT Platformは同じ名前の既存のファイルに関する情報を返します。 この場合、デバイスで次の操作を実行できます。

        • IoT Platformでのファイルのアップロードプロセスが完了していない場合は、引き続きオンプレミスのファイルをアップロードできます。

          説明

          IoT Platformは、完全にアップロードされていないファイルを24時間だけ保持します。

        • IoT Platformでのファイルのアップロードプロセスが完了したら、ポリシーを変更するか、オンプレミスファイルをranameすることができます。 次に、ファイルを再度アップロードします。

        拒否

        IoT Platformは、ファイルが既に存在することを示すエラーコードを返し、オンプレミスファイルのアップロード要求を拒否します。

  2. IoT Platformがリクエストを受信すると、IoT Platformはデバイスに応答を返します。 デバイスが応答メッセージを受信すると、ファイルを読み取るコールバックがトリガーされます。

    SDKは、ファイルまたはメモリデータをセグメントごとに読み取り、dataパラメーターを取得します。 次に、CRC16アルゴリズムを使用して、データパラメータによって示されるデータパケットのチェックサムを計算する。

    重要

    ファイルセグメントの送信中、各データパケットの最大サイズは、AIOT_MQTT_UPLOADOPT_ DEFAULT _BLOCK_SIZEパラメーターの値を超えることはできません。 各データパケットは、最後のデータパケットを除いて、少なくとも256バイトでなければならない。

    mqtt_upload_read_data_handlerコールバックは、次のサンプルコードで指定されています。

    int32_t mqtt_upload_read_data_handler(const aiot_mqtt_upload_recv_t * packet, uint8_t * data, uint32_t size, void * userdata) {
        int32_t read_len = 0;
        if (userdata != NULL) {
            uint32_t * test_userdata = (uint32_t *)userdata;
            printf("test_userdata:% d\r\n", * test_userdata);
        }
        if (packet == NULL) {
            return 0;
        }
        if (packet->desc.code == UPLOAD_FILE_OK) {
            if (data != NULL && size != 0) {
                uint32_t read_size=サイズ;
                ファイル * fp;
                char * file_name = packet->desc.file_name;
                fp = fopen(file_name, "r");
                uint32_t offset = packet->desc.file_offset;
                fseek(fp、オフセット、SEEK_SET);
                printf("Open % s read at: % d\r\n", file_name, offset);
                read_len = fread(data、sizeof(uint8_t) 、read_size、fp);
                printf("Read_len: % d\r\n", read_len);
                fclose(fp);
            }
        } else {
            printf("エラーコード: % d, message:% s\r\n", packet->desc.code, packet->desc.message);
        }
        read_lenを返します。} 
  3. (オプション)

    ファイルのアップロードをキャンセルする場合は、aiot_mqtt_upload_cancel_stream操作を呼び出します。

    詳細については、「aiot_mqtt_upload_cancel_stream」をご参照ください。

ステップ5: ファイルのアップロード状態を確認する

aiot_mqtt_upload_processを呼び出して、ファイルアップロードステータスを周期的に検出できます。 サンプルコード:

while(1) {
        aiot_mqtt_upload_result_t result = aiot_mqtt_upload_process(up_handle);
        if (result.code == STATE_MQTT_UPLOAD_FINISHED) {
            /* アップロードが成功しました。 */
            printf("MQTT Upload file(% s) success\r\n", result.file_name);
            uploaded_file ++;
            if (uploaded_file == 2) {
                break;
            }
        } else if (result.code == STATE_MQTT_UPLOAD_FAILED | |
                   result.code == STATE_MQTT_UPLOAD_FAILED_TIMEOUT | |
                   result.code == STATE_MQTT_UPLOAD_CANCEL_FAILED ) {
            /* アップロードに失敗します。 */
            printf("MQTT Upload file(% s) failed,res:-0x %.4X\r\n", result.file_name, -result.code);
            /* MQTT UPLOADインスタンスを破棄します。 */
        } else if (result.code == STATE_MQTT_UPLOAD_CANCEL_SUCCESS) {
            printf("MQTT Upload file(% s) cancel success,res:-0x %.4X\r\n", result.file_name, -result.code);
        } else if (result.code == STATE_MQTT_UPLOAD_FAILED_WHOLE_CHECK) {
            printf("MQTTファイルのアップロード (% s) ファイル全体md5に失敗しました。res:-0x %.4X\r\n", result.file_name, -result.code);
        }
        睡眠 (1);
    }

ステップ6: プログラムを終了する

aiot_mqtt_upload_deinit操作を呼び出して、クライアントインスタンスを破棄し、リソースをリリースします。

aiot_mqtt_upload_deinit(&up_handle);

次は何ですか

サンプルコードファイルを設定したら、ファイルをコンパイルして実行可能ファイルを生成します。 この例では、。/output/mqtt-upload-basic-demo実行ファイルが生成されます。

詳細については、「コンパイルと実行」をご参照ください。