この記事では、Link SDK for CのAPI操作を呼び出して、デバイスファイルをMQTT経由でIoT Platformにアップロードする方法について説明します。 これにより、ハードウェアリソースのオーバーヘッドと開発コストが削減されます。この例では、。/demos/mqtt_upload_basic_demo.cサンプルコードファイルを使用します。
背景
ファイルのアップロード機能の詳細については、「概要」をご参照ください。
ファイルをアップロードするには、MQTTプロトコルを使用する必要があります。
ステップ1: クライアントの初期化
ヘッダーファイルを追加します。
…… …… # 「aiot_mqtt_api.h」を含む # 「aiot_mqtt_upload_api.h」を含む # 「core_crc64.h」を含める ……基になる依存関係を追加し、ログ出力機能を設定します。
/* 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を返します。}aiot_mqtt_upload_init操作を呼び出して、クライアントインスタンスを作成し、デフォルトパラメーターを初期化します。
mqtt_handle = aiot_mqtt_upload_init();
ステップ2: 必要な機能の設定
aiot_mqtt_upload_setopt操作を呼び出して、次の項目を設定します。
MQTT接続ハンドルに関連付けます。
重要ファイルアップロード固有のパラメーターを設定する前に、デバイス認証情報が指定されていることを確認してください。
MQTT接続を確立する必要があります。 次のサンプルコードを使用して、MQTT接続ハンドルに関連付けます。
void * up_handle = aiot_mqtt_upload_init(); aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_MQTT_HANDLE, mqtt_handle);(オプション)
ファイルのアップロード固有のパラメーターを設定します。
サンプルコード
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: ファイルのアップロード要求を開始する
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.txtとmqttuploadfile002.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は、ファイルが既に存在することを示すエラーコードを返し、オンプレミスファイルのアップロード要求を拒否します。
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を返します。}(オプション)
ファイルのアップロードをキャンセルする場合は、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実行ファイルが生成されます。
詳細については、「コンパイルと実行」をご参照ください。