全部產品
Search
文件中心

:樣本一:MQTT多檔案上傳

更新時間:Jun 30, 2024

本文以C Link SDK中的Demo檔案./demos/mqtt_upload_basic_demo.c為例,介紹如何調用Link SDK的API,協助裝置基於MQTT協議的串連,將檔案上傳至物聯網平台,以減少硬體資源的開銷,並降低開發成本。

背景資訊

  • 檔案上傳功能的更多資訊,請參見檔案上傳概述

  • 檔案上傳功能基於MQTT接入,開發過程中涉及MQTT接入的代碼說明,請參見MQTT接入

步驟一:初始設定檔案上傳功能

  1. 添加標頭檔。

    ……
    ……
    #include "aiot_mqtt_api.h"
    #include "aiot_mqtt_upload_api.h"
    #include "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", message);
        return 0;
    }
  3. 調用aiot_mqtt_upload_init,建立檔案上傳功能的用戶端執行個體,並初始化預設參數。

        mqtt_handle = aiot_mqtt_upload_init();

步驟二:設定檔上傳功能

調用aiot_mqtt_upload_setopt,配置以下功能。

  1. 關聯MQTT串連的控制代碼。

    重要

    設定檔上傳功能參數前,請確保已配置裝置認證資訊等相關參數。具體操作,請參見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,設定上傳檔案時每包資料發送的最大值。

(可選)步驟三:計算完整檔案的CRC64

上傳檔案時,協議內預設對分區資料進行CRC16計算。您可以根據業務需要,選擇CRC64計算,SDK預設提供CRC64計算C版庫。

以下範例程式碼為計算完整檔案的CRC64。

    uint64_t crc = mqtt_upload_get_file_crc64(MQTT_UPLOAD_FILE_NAME);

步驟四:請求上傳檔案

  1. 調用aiot_mqtt_upload_open_stream,向物聯網平台發起上傳檔案請求。

    重要
    • 同名檔案上傳過程中,請勿調用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

        重要
        • 上傳檔案的名稱限制如下:

          • 支援數字、英文字母、底線(_)和英文句點(.)。

          • 首字元僅支援數字和英文字母。

          • 長度不超過100位元組。

        • 單個檔案不超過16 MB。

      • mqttuploadfile001.txt有CRC64校正,有userdata傳參。

      • mqttuploadfile002.txt無CRC64校正,無userdata傳參。

      • 範例程式碼使用的上傳檔案的處理策略為overwrite。處理策略的詳細說明如下:

        處理策略(conflictStrategy)

        說明

        覆蓋模式(overwrite)

        預設模式,刪除已存在的同名檔案,僅保留最新上傳的檔案。

        檔案追加模式(append)

        發起上傳檔案請求後,物聯網平台返回已存在的同名檔案資訊,裝置端可根據業務需要,選擇以下操作:

        • 如果已存在的同名檔案為未完成上傳的檔案,則裝置繼續執行上傳任務。

          說明

          物聯網平台僅在24小時內保留未完成上傳的檔案。

        • 如果已存在的同名檔案為已完成上傳的檔案,則裝置選擇覆蓋模式或重新命名檔案後,重新上傳檔案。

        拒絕模式(reject)

        物聯網平台返迴文件已存在的錯誤碼,並拒絕再次上傳該檔案。

  2. 物聯網平台接收檔案上傳的請求後,向裝置返回應答訊息。裝置接收訊息後,觸發回呼函數。

    在回呼函數中,SDK分區讀取檔案內容或您的記憶體資料,擷取到data資料後,對單包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 = size;
                FILE *fp;
                char* file_name = packet->desc.file_name;
                fp = fopen(file_name, "r");
                uint32_t offset = packet->desc.file_offset;
                fseek(fp, offset, 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("Error code:%d, message:%s\r\n", packet->desc.code, packet->desc.message);
        }
        return read_len;
    }
  3. (可選)

    上傳檔案過程中,如果需要取消上傳,您可以調用aiot_mqtt_upload_cancel_stream。

    取消上傳介面的詳細說明,請參見aiot_mqtt_upload_cancel_stream

步驟五:處理檔案上傳狀態

檔案上傳過程中,調用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 Upload file(%s) whole file md5 failed,res:-0x%.4X\r\n", result.file_name, -result.code);
        }
        sleep(1);
    }

步驟六:退出檔案上傳程式

調用aiot_mqtt_upload_deinit,銷毀檔案上傳功能的用戶端執行個體,釋放資源。

aiot_mqtt_upload_deinit(&up_handle);

裝置端日誌

您可以在裝置端查看運行結果。

  • 串連日誌:

    出現如下日誌,表示裝置與物聯網平台串連成功。

    [1637138922.457][LK-0313] MQTT user calls aiot_mqtt_connect api, connect
    [1637138922.457][LK-032A] mqtt host: iot-******.iot-as-mqtt.unify.aliyuncs.com
    [1637138922.457][LK-0317] user name: LightSwitch&a18wP******
    [1637138922.457][LK-0318] password: 2AE57DEEAADE002064F87DEC55EE2EDD2A1996E44BA8F5622507D1EFD6******
    success to establish tcp, fd=5
    local port: 57139
    [1637138922.488][LK-1000] establish mbedtls connection with server(host='iot-******.iot-as-mqtt.unify.aliyuncs.com', port=[1883])
    [1637138922.507][LK-1000] success to establish mbedtls connection, (cost 45247 bytes in total, max used 47983 bytes)
    [1637138922.654][LK-0313] MQTT connect success in 197 ms
    AIOT_MQTTEVT_CONNECT
                        
  • 訂閱檔案上傳功能相關Topic:

    [1637138922.654][LK-2013] aiot_mqtt_upload_init init
    [1637138922.654][LK-0309] sub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/init_reply
    [1637138922.654][LK-0309] sub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/send_reply
    [1637138922.654][LK-0309] sub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/cancel_reply
  • 上傳檔案的請求日誌:

    裝置向物聯網平台發起上傳請求,請求上傳兩個檔案,分別為:

    檔案名稱

    大小(位元組)

    是否進行CRC64校正

    mqttuploadfile001.txt

    2048

    mqttuploadfile002.txt

    1151

    [1637138922.655][LK-0309] pub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/init
    [LK-030A] > 7B 22 69 64 22 3A 22 31  22 2C 22 70 61 72 61 6D | {"id":"1","params"
    [LK-030A] > 73 22 3A 7B 22 66 69 6C  65 4E 61 6D 65 22 3A 22 | :{"fileName":"
    [LK-030A] > 6D 71 74 74 75 70 6C 6F  61 64 66 69 6C 65 30 30 | mqttuploadfile001.txt"
    [LK-030A] > 31 2E 74 78 74 22 2C 22  66 69 6C 65 53 69 7A 65 | ,"fileSize
    [LK-030A] > 22 3A 32 30 34 38 2C 22  63 6F 6E 66 6C 69 63 74 | ":2048,"conflictStrategy"
    [LK-030A] > 53 74 72 61 74 65 67 79  22 3A 22 6F 76 65 72 77 | :"overwrite"
    [LK-030A] > 72 69 74 65 22 2C 22 66  69 63 4D 6F 64 65 22 3A | ,"ficMode":
    [LK-030A] > 22 63 72 63 36 34 22 2C  22 66 69 63 56 61 6C 75 | "crc64","ficValue"
    [LK-030A] > 65 22 3A 22 66 34 38 66  34 33 37 64 35 35 64 34 | :"f48f437d55**
    [LK-030A] > 37 31 34 63 22 7D 7D                             | ****"}}
    [1637138922.655][LK-0309] pub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/init
    [LK-030A] > 7B 22 69 64 22 3A 22 32  22 2C 22 70 61 72 61 6D | {"id":"2","params"
    [LK-030A] > 73 22 3A 7B 22 66 69 6C  65 4E 61 6D 65 22 3A 22 | :{"fileName":"
    [LK-030A] > 6D 71 74 74 75 70 6C 6F  61 64 66 69 6C 65 30 30 | mqttuploadfile002.txt"
    [LK-030A] > 32 2E 74 78 74 22 2C 22  66 69 6C 65 53 69 7A 65 | ,"fileSize
    [LK-030A] > 22 3A 31 31 35 31 2C 22  63 6F 6E 66 6C 69 63 74 | ":1151,"conflictStrategy"
    [LK-030A] > 53 74 72 61 74 65 67 79  22 3A 22 6F 76 65 72 77 | :"overwrite"
    [LK-030A] > 72 69 74 65 22 7D 7D                             | }}
  • 請求上傳檔案的應答日誌:

    根據不同名的兩個檔案,範例程式碼發起兩次請求後,返回的應答日誌分別為:

    • mqttuploadfile001.txt

      [1637138923.214][LK-0309] pub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/init_reply
      [LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"data"
      [LK-030A] < 61 22 3A 7B 22 66 69 6C  65 4E 61 6D 65 22 3A 22 | :{"fileName":"
      [LK-030A] < 6D 71 74 74 75 70 6C 6F  61 64 66 69 6C 65 30 30 | mqttuploadfile001.txt"
      [LK-030A] < 31 2E 74 78 74 22 2C 22  75 70 6C 6F 61 64 49 64 | ,"uploadId
      [LK-030A] < 22 3A 22 6B 54 48 76 63  47 45 31 78 58 56 48 33 | ":"kTHvcGE1xXVH3
      [LK-030A] < 46 79 44 4C 34 4C 55 30  31 30 32 30 30 22 2C 22 | FyDL4LU******","
      [LK-030A] < 6F 66 66 73 65 74 22 3A  30 2C 22 66 69 6C 65 53 | offset":0,"fileSize"
      [LK-030A] < 69 7A 65 22 3A 32 30 34  38 2C 22 63 6F 6E 66 6C | :2048,"conflictStrategy"
      [LK-030A] < 69 63 74 53 74 72 61 74  65 67 79 22 3A 22 6F 76 | :"overwrite"}
      [LK-030A] < 65 72 77 72 69 74 65 22  7D 2C 22 69 64 22 3A 22 | ,"id":"1"
      [LK-030A] < 31 22 2C 22 6D 65 73 73  61 67 65 22 3A 22 73 75 | ,"message":
      [LK-030A] < 63 63 65 73 73 22 7D                             | "success"}
      test_userdata:100
      Open mqttuploadfile001.txt read at: 0
    • mqttuploadfile002.txt

      [LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"data"
      [LK-030A] < 61 22 3A 7B 22 66 69 6C  65 4E 61 6D 65 22 3A 22 | :{"fileName":"
      [LK-030A] < 6D 71 74 74 75 70 6C 6F  61 64 66 69 6C 65 30 30 | mqttuploadfile002.txt"
      [LK-030A] < 32 2E 74 78 74 22 2C 22  75 70 6C 6F 61 64 49 64 | ,"uploadId
      [LK-030A] < 22 3A 22 6B 6F 48 54 45  4B 46 34 59 58 31 6E 61 | ":"koHTEKF4YX1na
      [LK-030A] < 46 30 74 49 33 43 35 30  31 30 32 30 30 22 2C 22 | F0tI3C5******","
      [LK-030A] < 6F 66 66 73 65 74 22 3A  30 2C 22 66 69 6C 65 53 | offset":0,"fileSize"
      [LK-030A] < 69 7A 65 22 3A 31 31 35  31 2C 22 63 6F 6E 66 6C | :1151,
      [LK-030A] < 69 63 74 53 74 72 61 74  65 67 79 22 3A 22 6F 76 | "conflictStrategy":
      [LK-030A] < 65 72 77 72 69 74 65 22  7D 2C 22 69 64 22 3A 22 | "overwrite"},"id":"
      [LK-030A] < 32 22 2C 22 6D 65 73 73  61 67 65 22 3A 22 73 75 | 2","message":
      [LK-030A] < 63 63 65 73 73 22 7D                             | "success"}
  • 讀取檔案的日誌:

    物聯網平台返回的應答訊息觸發回呼函數後,讀取兩個檔案的日誌分別為:

    • mqttuploadfile001.txt

      Open mqttuploadfile001.txt read at: 0
      Read_len: 1024
      [1637138923.215][LK-2014] Read data_len:1024[1637138923.215][LK-0309] pub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/send
      [LK-030A] > 00 55 7B 22 69 64 22 3A  22 34 22 2C 22 70 61 72 | .U{"id":"4","params"
      [LK-030A] > 61 6D 73 22 3A 7B 22 75  70 6C 6F 61 64 49 64 22 | :{"uploadId"
      [LK-030A] > 3A 22 6B 54 48 76 63 47  45 31 78 58 56 48 33 46 | :"kTHvcGE1xXVH3F
      [LK-030A] > 79 44 4C 34 4C 55 30 31  30 32 30 30 22 2C 22 6F | yDL4LU******",
      [LK-030A] > 66 66 73 65 74 22 3A 30  2C 22 62 53 69 7A 65 22 | "offset":0,"bSize"
      [LK-030A] > 3A 31 30 32 34 7D 7D 55  4E 41 56 41 4F 4F 56 4C | :1024}}UNAVAOOVL
      [LK-030A] > 53 43 58 4C 57 59 43 54  5A 58 45 4C 47 43 4E 57 | SCXLWYCTZXELGCNW
      [LK-030A] > 58 55 55 41 46 54 47 46  46 42 4D 46 48 48 54 59 | XUUAFTGFFBMFHHTY
      [LK-030A] > 52 59 46 58 44 49 57 45  4A 4E 50 47 46 4A 49 45 | RYFXDIWEJNPGFJIE
      [LK-030A] > 4E 43 55 43 50 4B 54 57  54 50 4F 4F 49 45 4B 4C | NCUCPKTWTPOOIEKL
      [LK-030A] > 4F 5A 54 55 55 42 4C 4B  58 5A 48 59 4D 4A 49 43 | OZTUUBLKXZHYMJIC
      [LK-030A] > 46 41 4E 54 49 41 59 41  46 4E 4B 4D 52 4F 43 51 | FANTIAYAFNKMROCQ
      [LK-030A] > 48 4F 43 56 44 59 54 51  59 57 52 4D 48 4E 42 50 | HOCVDYTQY******
      ......
      ......
      ......
    • mqttuploadfile002.txt

      Open mqttuploadfile002.txt read at: 0
      Read_len: 1024
      [1637138923.216][LK-2014] Read data_len:1024[1637138923.216][LK-0309] pub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/send
      [LK-030A] > 00 55 7B 22 69 64 22 3A  22 33 22 2C 22 70 61 72 | .U{"id":"3","params"
      [LK-030A] > 61 6D 73 22 3A 7B 22 75  70 6C 6F 61 64 49 64 22 | :{"uploadId"
      [LK-030A] > 3A 22 6B 6F 48 54 45 4B  46 34 59 58 31 6E 61 46 | :"koHTEKF4YX1naF
      [LK-030A] > 30 74 49 33 43 35 30 31  30 32 30 30 22 2C 22 6F | 0tI3C5******",
      [LK-030A] > 66 66 73 65 74 22 3A 30  2C 22 62 53 69 7A 65 22 | "offset":0,"bSize"
      [LK-030A] > 3A 31 30 32 34 7D 7D 55  4E 41 56 41 4F 4F 56 4C | :1024}}UNAVAOOVL
      [LK-030A] > 53 43 58 4C 57 59 43 54  5A 58 45 4C 47 43 4E 57 | SCXLWYCTZXELGCNW
      [LK-030A] > 58 55 55 41 46 54 47 46  46 42 4D 46 48 48 54 59 | XUUAFTGFFBMFHHTY
      [LK-030A] > 52 59 46 58 44 49 57 45  4A 4E 50 47 46 4A 49 45 | RYFXDIWEJNPGFJIE
      [LK-030A] > 4E 43 55 43 50 4B 54 57  54 50 4F 4F 49 45 4B 4C | NCUCPKTWTPOOIEKL
      [LK-030A] > 4F 5A 54 55 55 42 4C 4B  58 5A 48 59 4D 4A 49 43 | OZTUUBLKXZHYMJIC
      [LK-030A] > 46 41 4E 54 49 41 59 41  46 4E 4B 4D 52 4F 43 51 | FANTIAYAFNKMROCQ
      [LK-030A] > 48 4F 43 56 44 59 54 51  59 57 52 4D 48 4E 42 50 | HOCVDYTQYW******
      ......
      ......
      ......
  • 監控檔案上傳狀態的日誌:

    完成檔案上傳後,物聯網平台返迴文件上傳狀態資訊,兩個檔案的相關日誌分別為:

    • mqttuploadfile001.txt

      說明

      由於該檔案進行了CRC64完整性校正,因此日誌中包含校正後的CRC64。

      [1637138924.099][LK-0309] pub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/send_reply
      [LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"data"
      [LK-030A] < 61 22 3A 7B 22 66 69 63  56 61 6C 75 65 43 6C 69 | :{"ficValueCli
      [LK-030A] < 65 6E 74 22 3A 22 66 34  38 66 34 33 37 64 35 35 | ent":"f48f437d55
      [LK-030A] < 64 34 37 31 34 63 22 2C  22 66 69 63 4D 6F 64 65 | ******","ficMode
      [LK-030A] < 22 3A 22 63 72 63 36 34  22 2C 22 75 70 6C 6F 61 | ":"crc64","uploadId"
      [LK-030A] < 64 49 64 22 3A 22 6B 54  48 76 63 47 45 31 78 58 | :"kTHvcGE1xX
      [LK-030A] < 56 48 33 46 79 44 4C 34  4C 55 30 31 30 32 30 30 | VH3FyDL4LU******
      [LK-030A] < 22 2C 22 6F 66 66 73 65  74 22 3A 31 30 32 34 2C | ","offset":1024,
      [LK-030A] < 22 63 6F 6D 70 6C 65 74  65 22 3A 74 72 75 65 2C | "complete":true,
      [LK-030A] < 22 66 69 63 56 61 6C 75  65 53 65 72 76 65 72 22 | "ficValueServer"
      [LK-030A] < 3A 22 66 34 38 66 34 33  37 64 35 35 64 34 37 31 | :"f48f437d55****
      [LK-030A] < 34 63 22 2C 22 62 53 69  7A 65 22 3A 31 30 32 34 | **","bSize":1024
      [LK-030A] < 7D 2C 22 69 64 22 3A 22  36 22 2C 22 6D 65 73 73 | },"id":"6","message"
      [LK-030A] < 61 67 65 22 3A 22 73 75  63 63 65 73 73 22 7D    | :"success"}
      [1637138924.099][LK-2014] Upload total size:2048
    • mqttuploadfile002.txt

      [1637138923.884][LK-0309] pub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/send_reply
      [LK-030A] < 7B 22 63 6F 64 65 22 3A  32 30 30 2C 22 64 61 74 | {"code":200,"data"
      [LK-030A] < 61 22 3A 7B 22 75 70 6C  6F 61 64 49 64 22 3A 22 | :{"uploadId":"
      [LK-030A] < 6B 6F 48 54 45 4B 46 34  59 58 31 6E 61 46 30 74 | koHTEKF4YX1naF0t
      [LK-030A] < 49 33 43 35 30 31 30 32  30 30 22 2C 22 6F 66 66 | I3C5******","offset"
      [LK-030A] < 73 65 74 22 3A 31 30 32  34 2C 22 63 6F 6D 70 6C | :1024,"complete"
      [LK-030A] < 65 74 65 22 3A 74 72 75  65 2C 22 62 53 69 7A 65 | :true,"bSize
      [LK-030A] < 22 3A 31 32 37 7D 2C 22  69 64 22 3A 22 35 22 2C | ":127},"id":"5",
      [LK-030A] < 22 6D 65 73 73 61 67 65  22 3A 22 73 75 63 63 65 | "message":"success"
      [LK-030A] < 73 73 22 7D                                      | }
      [1637138923.884][LK-2014] Upload total size:1151
  • 退出程式相關日誌:

    檔案上傳完成後,退出程式,並取消訂閱相關Topic。

    [1637648533.379][LK-2124] Complete upload total size:2048
    MQTT Upload file(mqttuploadfile001.txt) success
    [1637648534.407][LK-2100] Finish upload,Deleted upload task.
    MQTT Upload file(mqttuploadfile002.txt) success
    [1637648534.407][LK-210F] aiot_mqtt_upload_deinit
    [1637648534.407][LK-0309] unsub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/init_reply
    [1637648534.408][LK-0309] unsub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/send_reply
    [1637648534.408][LK-0309] unsub: /sys/a18wP******/LightSwitch/thing/file/upload/mqtt/cancel_reply
    [1637648534.513][LK-1000] adapter_network_deinit

物聯網平台日誌

您可以在物聯網平台控制管理上傳的檔案,並查看常式運行後的日誌資訊。

  • 管理上傳的檔案:

    在左側導覽列,選擇裝置管理裝置,然後單擊裝置對應的查看按鈕。在檔案管理頁簽下,您可以查看該裝置上傳的檔案清單。

    裝置檔案管理

    更多資訊,請參見檔案管理

  • 查看相關日誌:

    在左側導覽列,選擇監控營運 > Log Service,選擇產品後,查看裝置上傳檔案的相關日誌。

    檔案上傳功能相關日誌

後續步驟

  • 常式檔案配置完成後,需進行編譯,產生可執行檔./output/mqtt-upload-basic-demo。更多資訊,請參見編譯與運行

  • 作業記錄中出現的錯誤資訊,請參見aiot_mqtt_upload_api.h,中的狀態代碼描述根據提示解決問題。