全部产品
Search
文档中心

IoT Platform:Kode contoh

更新时间:Jun 21, 2025

Artikel ini menjelaskan cara memanggil operasi API dari Link SDK for C untuk mengunggah file perangkat ke IoT Platform melalui MQTT. Ini mengurangi overhead sumber daya perangkat keras dan biaya pengembangan. Dalam contoh ini, file kode contoh ./demos/mqtt_upload_basic_demo.c digunakan.

Konteks

  • Untuk informasi lebih lanjut tentang fitur pengunggahan file, lihat Ikhtisar.

  • Anda harus menggunakan protokol MQTT untuk mengunggah file.

Langkah 1: Inisialisasi klien

  1. Tambahkan file header.

    ……
    ……
    #include "aiot_mqtt_api.h"
    #include "aiot_mqtt_upload_api.h"
    #include "core_crc64.h"
    ……
  2. Tambahkan dependensi dasar serta konfigurasikan fitur output log.

    /* Kumpulan fungsi terkait sistem yang disimpan di folder portfiles/aiot_port. */
    extern aiot_sysdep_portfile_t g_aiot_sysdep_portfile;
    /* Sertifikat server yang terletak di external/ali_ca_cert.c. * /
    extern const char *ali_ca_cert;
    /* Callback untuk mencetak log SDK. */
    static int32_t demo_state_logcb(int32_t code, char *message)
    {
        printf("%s", message);
        return 0;
    }
  3. Panggil operasi aiot_mqtt_upload_init untuk membuat instance klien dan menginisialisasi parameter default.

        mqtt_handle = aiot_mqtt_upload_init();

Langkah 2: Konfigurasikan fitur yang diperlukan

Panggil operasi aiot_mqtt_upload_setopt untuk mengonfigurasi item berikut.

  1. Hubungkan menggunakan handle koneksi MQTT.

    null

    Sebelum menyetel parameter spesifik untuk pengunggahan file, pastikan informasi autentikasi perangkat telah ditentukan.

    Anda harus membangun koneksi MQTT. Contoh kode berikut digunakan untuk menghubungkan dengan handle koneksi MQTT:

        void *up_handle = aiot_mqtt_upload_init();
        aiot_mqtt_upload_setopt(up_handle, AIOT_MQTT_UPLOADOPT_MQTT_HANDLE, mqtt_handle);
  2. (Opsional)

    Setel parameter spesifik pengunggahan file.

    • Contoh Kode

          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);
    • Parameter:

      Parameter

      Deskripsi

      rsp_timeout

      Menentukan periode timeout retransmisi setiap paket data, dalam milidetik.

      Jika Anda tidak menentukan parameter ini atau menyetelnya ke 0, periode timeout adalah 5 detik.

      Dalam contoh ini, nilainya diatur ke 2000.

      AIOT_MQTT_UPLOADOPT_RSP_TIMEOUT_MS

      Memanggil operasi aiot_mqtt_upload_setopt untuk menyetel periode timeout retransmisi setiap paket data.

      rety_count

      Menentukan jumlah percobaan ulang jika terjadi kesalahan timeout.

      Nilai default: 10.

      Dalam contoh ini, nilainya diatur ke 5.

      AIOT_MQTT_UPLOADOPT_RETRY_COUNT

      Memanggil operasi aiot_mqtt_upload_setopt untuk menyetel jumlah percobaan ulang jika terjadi kesalahan timeout.

      block_size

      Menentukan ukuran maksimum setiap paket data, dalam byte.

      Nilai valid: 256 hingga 131072. Nilai default: 2048.

      Dalam contoh ini, nilainya diatur ke 1024.

      AIOT_MQTT_UPLOADOPT_DEFAULT_BLOCK_SIZE

      Memanggil operasi aiot_mqtt_upload_setopt untuk menyetel ukuran maksimum setiap paket data.

(Opsional) Langkah 3: Hitung checksum CRC64 file

Saat Anda mengunggah file, algoritma CRC16 digunakan secara default untuk menghitung checksum file. Anda dapat menentukan algoritma CRC64 berdasarkan kebutuhan bisnis Anda. Secara default, SDK menyediakan pustaka C spesifik CRC64.

Dalam contoh ini, algoritma CRC64 digunakan.

    uint64_t crc = mqtt_upload_get_file_crc64(MQTT_UPLOAD_FILE_NAME);

Langkah 4: Mulai permintaan untuk mengunggah file

  1. Panggil operasi aiot_mqtt_upload_open_stream untuk memulai permintaan pengunggahan file ke IoT Platform.

    null
    • Jika Anda mengunggah file dengan nama yang sama, jangan panggil operasi aiot_mqtt_upload_open_stream untuk memulai beberapa permintaan. Setelah pengunggahan gagal, Anda dapat memulai kembali permintaan untuk mengunggah file.

    • Jika Anda mengunggah file dengan nama yang berbeda, Anda dapat memanggil operasi aiot_mqtt_upload_open_stream untuk memulai beberapa permintaan. Anda juga dapat memulai permintaan untuk mengunggah beberapa file.

    • Contoh kode:

      • Tentukan ukuran file dan nama file:

        #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")
      • Mulai permintaan untuk mengunggah file:

         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);
    • Deskripsi contoh kode:

      • Dalam contoh ini, operasi dipanggil untuk mengunggah dua file berikut: mqttuploadfile001.txt dan mqttuploadfile002.txt.

        null
        • Perhatikan konvensi penamaan berikut untuk file:

          • Setiap nama file dapat berisi angka, huruf, garis bawah (_), dan titik (.).

          • Setiap nama file harus dimulai dengan angka atau huruf.

          • Setiap nama file dapat memiliki panjang hingga 100 byte.

        • Ukuran satu file tunggal dapat mencapai hingga 16 MB.

      • File mqttuploadfile001.txt memiliki checksum CRC64 dan parameter userdata ditentukan.

      • File mqttuploadfile002.txt tidak memiliki checksum CRC64 dan parameter userdata tidak ditentukan.

      • Dalam contoh ini, kebijakan pemrosesan diatur ke overwrite. Tabel berikut menjelaskan kebijakan pemrosesan yang tersedia.

        Kebijakan pemrosesan (conflictStrategy)

        Deskripsi

        overwrite

        Kebijakan ini digunakan secara default. Jika Anda menggunakan kebijakan ini, IoT Platform menghapus file yang ada dan hanya menyimpan file yang baru diunggah.

        append

        Setelah perangkat memulai permintaan pengunggahan file, IoT Platform mengembalikan informasi tentang file yang ada dengan nama yang sama. Dalam hal ini, Anda dapat melakukan operasi berikut pada perangkat:

        • Jika proses pengunggahan file di IoT Platform belum selesai, Anda dapat melanjutkan untuk mengunggah file lokal.

          null

          IoT Platform menyimpan file yang tidak sepenuhnya diunggah hanya selama 24 jam.

        • Jika proses pengunggahan file di IoT Platform selesai, Anda dapat mengubah kebijakan atau mengganti nama file lokal. Kemudian, unggah file lagi.

        reject

        IoT Platform mengembalikan kode kesalahan yang menunjukkan bahwa file sudah ada dan menolak permintaan untuk mengunggah file lokal.

  2. Setelah IoT Platform menerima permintaan, IoT Platform mengembalikan respons ke perangkat. Setelah perangkat menerima pesan respons, callback dipicu untuk membaca file.

    SDK membaca file atau data memori per segmen untuk mendapatkan parameter data. Kemudian, algoritma CRC16 digunakan untuk menghitung checksum paket data yang ditunjukkan oleh parameter data.

    null

    Selama transmisi segmen file, ukuran maksimum setiap paket data tidak boleh melebihi nilai parameter AIOT_MQTT_UPLOADOPT_DEFAULT_BLOCK_SIZE. Setiap paket data harus berukuran minimal 256 byte, kecuali untuk paket data terakhir.

    Callback mqtt_upload_read_data_handler ditentukan dalam contoh kode berikut:

    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. (Opsional)

    Jika Anda ingin membatalkan pengunggahan file, panggil operasi aiot_mqtt_upload_cancel_stream.

    Untuk informasi lebih lanjut, lihat aiot_mqtt_upload_cancel_stream.

Langkah 5: Periksa status pengunggahan file

Anda dapat memanggil operasi aiot_mqtt_upload_process untuk mendeteksi siklus status pengunggahan file. Contoh kode:

    while(1) {
        aiot_mqtt_upload_result_t result = aiot_mqtt_upload_process(up_handle);
        if (result.code == STATE_MQTT_UPLOAD_FINISHED) {
            /* Pengunggahan berhasil. */
            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 ) {
            /* Pengunggahan gagal. */
            printf("MQTT Upload file(%s) failed,res:-0x%.4X\r\n", result.file_name, -result.code);
            /* Hapus instance 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);
    }

Langkah 6: Keluar dari program

Panggil operasi aiot_mqtt_upload_deinit untuk menghapus instance klien dan melepaskan sumber daya yang digunakan.

aiot_mqtt_upload_deinit(&up_handle);

Apa selanjutnya

Setelah mengonfigurasi file kode contoh, kompilasikan file tersebut untuk menghasilkan file yang dapat dieksekusi. Dalam contoh ini, file yang dapat dieksekusi ./output/mqtt-upload-basic-demo dihasilkan.

Untuk informasi lebih lanjut, lihat Kompilasi dan Pelaksanaan.