All Products
Search
Document Center

IoT Platform:Contoh penggunaan

Last Updated:Jun 17, 2026

Demo ./demos/cota_basic_demo.c menunjukkan cara mengimplementasikan konfigurasi remote untuk suatu Perangkat.

Informasi latar belakang

  • Untuk informasi selengkapnya tentang fitur konfigurasi remote, lihat Ikhtisar.
  • Fitur konfigurasi remote memerlukan koneksi MQTT. Untuk informasi selengkapnya tentang koneksi MQTT, lihat Koneksi MQTT.

Langkah 1: Inisialisasi

  1. Tambahkan file header.
    ……
    ……
    #include "aiot_ota_api.h"
    ……

  2. Konfigurasikan dependensi dasar dan output log.

        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. Panggil aiot_ota_init untuk membuat instans OTA.
        ota_handle = aiot_ota_init();
        if (NULL == ota_handle) {
            printf("aiot_ota_init failed\r\n");
            aiot_mqtt_deinit(&mqtt_handle);
            return -2;
        }

Langkah 2: Konfigurasi fitur

Panggil aiot_ota_setopt untuk mengonfigurasi opsi berikut.

  1. Kaitkan handle koneksi MQTT.
    Penting Sebelum mengatur parameter konfigurasi remote, pastikan parameter seperti kredensial Perangkat telah dikonfigurasi. Untuk informasi selengkapnya, lihat Konfigurasi parameter koneksi MQTT.
    •     aiot_ota_setopt(ota_handle, AIOT_OTAOPT_MQTT_HANDLE, mqtt_handle);
    • Item konfigurasi Contoh Deskripsi
      AIOT_OTAOPT_MQTT_HANDLE mqtt_handle Permintaan konfigurasi remote menggunakan koneksi MQTT. Item ini mengaitkan handle koneksi MQTT.



  2. Atur callback untuk pesan instruksi konfigurasi remote.
    •     aiot_ota_setopt(ota_handle, AIOT_OTAOPT_RECV_HANDLER, demo_ota_recv_handler);
    • Item konfigurasi Contoh Deskripsi
      AIOT_OTAOPT_MQTT_HANDLE demo_ota_recv_handler Dipanggil saat Perangkat menerima instruksi konfigurasi remote dari Platform IoT.

Langkah 3: Perangkat secara aktif meminta pesan konfigurasi

Jika Perangkat sedang offline saat Platform IoT mengirim instruksi konfigurasi remote, Perangkat dapat memintanya setelah kembali online.

Catatan Jika tidak ada Tugas Perangkat yang dibuat di Platform IoT, pemanggilan API akan mengembalikan receive task get detail reply, task_id:[$next],status:[9].
  1. Panggil aiot_mqtt_pub untuk mengirim permintaan ke Platform IoT guna mendapatkan informasi konfigurasi remote.
    •     {
              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);
                  /* Jika koneksi gagal, hapus instans MQTT dan lepaskan sumber daya. */
                  goto exit;
              }
          }
    • Parameter Nilai contoh Deskripsi
      topic_string /sys/a18wP******5/LightSwitch/thing/config/get Topik yang digunakan untuk meminta informasi konfigurasi remote.

      Untuk informasi selengkapnya tentang topik, lihat Apa itu topik?.

      Dalam kode contoh:

      • a18wP****** adalah ProductKey Perangkat.

      • LightSwitch adalah DeviceName Perangkat.

      Untuk informasi selengkapnya, lihat Dapatkan kredensial Perangkat.

      payload_string {\"id\":\"123\",\"params\":{\"configScope\":\"product\",\"getType\":\"file\"}} Konten pesan permintaan.

      Pesan permintaan dalam format JSON. Ini merupakan nilai dari params dalam data berformat Alink. Untuk informasi selengkapnya, lihat Perangkat secara aktif meminta informasi konfigurasi.

  2. Setelah Platform IoT menerima permintaan, Platform IoT mengembalikan informasi konfigurasi ke Perangkat.
    Catatan Ukuran maksimum konten konfigurasi remote adalah 64 KB.
    Anda dapat mengaktifkan konfigurasi remote dan mengedit konfigurasi di Konsol Platform IoT. Untuk informasi selengkapnya, lihat Edit file konfigurasi.
  3. Panggil aiot_mqtt_recv untuk menerima pesan instruksi konfigurasi remote.
    • Jika pointer g_dl_handle bernilai null, sistem hanya melakukan polling pesan MQTT dari jaringan.
    • Jika pointer g_dl_handle tidak null, fungsi aiot_download_recv dipanggil.
    while (1) {
            aiot_mqtt_process(mqtt_handle);
            res = aiot_mqtt_recv(mqtt_handle);
    
            if (res == STATE_SYS_DEPEND_NWK_CLOSED) {
                sleep(1);
            }
            if (NULL != g_dl_handle) {
                /* Sebelum konfigurasi remote diterima, ubah periode timeout penerimaan pesan MQTT menjadi 100 ms untuk mengurangi interval antara dua unduhan konfigurasi remote. */
                int32_t ret = aiot_download_recv(g_dl_handle);
                timeout_ms = 100;
    
                if (STATE_DOWNLOAD_FINISHED == ret) {
                    aiot_download_deinit(&g_dl_handle);
                    /* Setelah konfigurasi remote diterima, kembalikan periode timeout penerimaan pesan MQTT ke nilai default 5000 ms. */
                    timeout_ms = 5000;
                }
                aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_RECV_TIMEOUT_MS, (void *)&timeout_ms);
            }
        }
  4. Setelah Perangkat menerima pesan instruksi konfigurasi, fungsi callback demo_ota_recv_handler dipicu.
    Gunakan informasi berikut untuk menulis logika pemrosesan fungsi callback:
    • Platform IoT mengirim instruksi konfigurasi remote ke Perangkat melalui topik /sys/${ProductKey}/${DeviceName}/thing/config/push.
    • Link SDK mengurai instruksi dari Platform IoT ke dalam struktur data aiot_ota_recv_t dan secara otomatis mengurai pesan konfigurasi.
    • Tipe pesan untuk konfigurasi remote adalah AIOT_OTARECV_COTA.
    • Dalam fungsi callback, Anda dapat memulai permintaan HTTPS untuk mengunduh file konfigurasi remote. Untuk informasi tentang cara menulis fungsi callback, lihat Langkah 5: Unduh file konfigurasi remote.

Langkah 4: Perangkat menerima informasi konfigurasi remote yang didorong oleh Platform IoT

Jika Perangkat sedang online, Perangkat langsung menerima instruksi konfigurasi remote dari Platform IoT dan memicu fungsi callback.

Untuk informasi selengkapnya, lihat Tulis logika pemrosesan untuk fungsi callback.

Langkah 5: Unduh file konfigurasi remote

Penting Perangkat tidak secara otomatis mengunduh file konfigurasi setelah menerima instruksi konfigurasi. Anda harus memanggil API Link SDK untuk memulai pengunduhan.
  1. Inisialisasi downloader.
    Panggil aiot_download_init untuk membuat download
                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->version,
                       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. Konfigurasikan parameter unduhan.
    Panggil aiot_download_setopt untuk mengonfigurasi parameter Tugas unduhan.
                /* Atur metode unduhan ke unduhan TLS. */
                if ((STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_NETWORK_CRED, (void *)(&cred))) ||
                    /* Atur port server untuk unduhan. */
                    (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_NETWORK_PORT, (void *)(&port))) ||
                    /* Atur informasi tentang Tugas unduhan. Informasi ini diperoleh dari anggota task_desc parameter input ota_msg. Termasuk URL unduhan, ukuran, dan nomor versi konfigurasi remote. */
                    (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_TASK_DESC, (void *)(ota_msg->task_desc))) ||
                    /* Atur fungsi callback yang dipanggil SDK saat konten yang diunduh tiba. */
                    (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_RECV_HANDLER, (void *)(demo_download_recv_handler))) ||
                    /* Atur panjang buffer maksimum untuk satu kali unduhan. Pengguna diberi tahu setiap kali buffer penuh. */
                    (STATE_SUCCESS != aiot_download_setopt(dl_handle, AIOT_DLOPT_BODY_BUFFER_MAX_LEN, (void *)(&max_buffer_len))) ||
                    /* Kirim permintaan HTTP GET ke server HTTP. */
                    (STATE_SUCCESS != aiot_download_send_request(dl_handle))) {
                    if (res != STATE_SUCCESS) {
                        aiot_download_deinit(&dl_handle);
                        break;
                    }
                }



  3. Setelah permintaan unduhan dikirim, Perangkat menerima pesan acknowledgement, yang memicu fungsi callback demo_download_recv_handler untuk memproses unduhan.
    Gunakan informasi berikut untuk menulis logika pemrosesan fungsi callback:
    • Struktur data pesan unduhan adalah aiot_download_recv_t. Ini merupakan parameter input fungsi callback.
    • packet->type dari pesan unduhan adalah AIOT_DLRECV_HTTPBODY.
    • Kode contoh hanya mencetak data. Anda harus mengunduh file konfigurasi ke lokasi tertentu.
    void demo_download_recv_handler(void *handle, const aiot_download_recv_t *packet, void *userdata)
    {
        /* Saat ini, hanya kasus di mana packet->type adalah AIOT_DLRECV_HTTPBODY yang didukung. */
        if (!packet || AIOT_DLRECV_HTTPBODY != packet->type) {
            return;
        }
        int32_t percent = packet->data.percent;
        uint8_t *src_buffer = packet->data.buffer;
        uint32_t src_buffer_len = packet->data.len;
    
        /* Jika percent adalah angka negatif, terjadi pengecualian penerimaan paket atau kesalahan verifikasi digest. */
        if (percent < 0) {
            /* Terjadi pengecualian penerimaan paket atau kesalahan verifikasi digest. */
            printf("exception happend, percent is %d\r\n", percent);
            return;
        }
    ……
    ……
    }
  4. Panggil aiot_download_report_progress untuk melaporkan progres unduhan.
    void demo_download_recv_handler(void *handle, const aiot_download_recv_t *packet, void *userdata)
    {
        /* Saat ini, hanya kasus di mana packet->type adalah AIOT_DLRECV_HTTPBODY yang didukung. */
        if (!packet || AIOT_DLRECV_HTTPBODY != packet->type) {
            return;
    ……
    ……
        aiot_download_report_progress(handle, percent);
        printf("config len is %d, config content is %.*s\r\n", src_buffer_len, src_buffer_len, (char *)src_buffer);
    }
  5. Setelah unduhan selesai, panggil aiot_download_deinit untuk mengatur handle g_dl_handle menjadi null.
    while (1) {
            aiot_mqtt_process(mqtt_handle);
            res = aiot_mqtt_recv(mqtt_handle);
    
            if (res == STATE_SYS_DEPEND_NWK_CLOSED) {
                sleep(1);
            }
            if (NULL != g_dl_handle) {
                /* Sebelum konfigurasi remote diterima, ubah periode timeout penerimaan pesan MQTT menjadi 100 ms untuk mengurangi interval antara dua unduhan konfigurasi remote. */
                int32_t ret = aiot_download_recv(g_dl_handle);
                timeout_ms = 100;
    
                if (STATE_DOWNLOAD_FINISHED == ret) {
                    aiot_download_deinit(&g_dl_handle);
                    /* Setelah konfigurasi remote diterima, kembalikan periode timeout penerimaan pesan MQTT ke nilai default 5000 ms. */
                    timeout_ms = 5000;
                }
                aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_RECV_TIMEOUT_MS, (void *)&timeout_ms);
            }
        }

Langkah 6: Keluar dari program

Panggil aiot_ota_deinit untuk menghapus instans OTA.

    aiot_ota_deinit(&ota_handle);

Langkah selanjutnya