All Products
Search
Document Center

IoT Platform:Contoh

Last Updated:Jul 06, 2025

Menghubungkan sub-perangkat ke IoT Platform menggunakan gateway. File kode contoh ./demos/fota_posix_demo.c digunakan.

Informasi latar belakang

  • Untuk informasi lebih lanjut tentang gateway dan sub-perangkat, lihat Ikhtisar.
  • Gateway harus mempertahankan koneksi persisten dengan IoT Platform. Metode koneksi gateway sama dengan perangkat yang terhubung langsung. Untuk informasi lebih lanjut, lihat Ikhtisar.

    Tabel berikut menjelaskan informasi autentikasi gateway yang digunakan dalam contoh ini.

    ProductKeyDeviceNameDeviceSecret
    a18wP******LightSwitchGWuwMTmVAMnGGHaAkqmeDY6cHxxB******

Langkah 1: Inisialisasi klien

  1. Tambahkan file header
    ...
    ...
    
    #include "aiot_subdev_api.h"
  2. Tambahkan dependensi dasar dan konfigurasikan fitur keluaran log.

        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. Panggil operasi aiot_subdev_init untuk membuat subdev.
        subdev_handle = aiot_subdev_init();
        if (subdev_handle == NULL) {
            printf("aiot_subdev_init gagal\n");
            demo_mqtt_stop(&mqtt_handle);
            return -1;
        }

Langkah 2: Konfigurasikan fitur yang diperlukan

Panggil operasi aiot_subdev_setopt untuk mengonfigurasi item berikut:

  1. Hubungkan dengan handle koneksi MQTT.
  2. Konfigurasikan callback pesan.
  1. Hubungkan dengan handle koneksi MQTT.
    Penting Sebelum menyetel parameter yang terkait dengan gateway dan sub-perangkat, pastikan informasi autentikasi gateway telah dikonfigurasi. Untuk informasi lebih lanjut, lihat Contoh.
    •     aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_MQTT_HANDLE, mqtt_handle);
    • ParameterContohDeskripsi
      AIOT_SUBDEVOPT_MQTT_HANDLEmqtt_handleAnda harus membuat koneksi MQTT. Parameter ini digunakan untuk menghubungkan dengan handle koneksi MQTT.
  2. Konfigurasikan callback pesan.
    1. Tentukan fungsi callback pesan
      •     aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_RECV_HANDLER, demo_subdev_recv_handler);
      • ParameterContohDeskripsi
        AIOT_SUBDEVOPT_RECV_HANDLERdemo_subdev_recv_handlerKetika gateway menerima pesan dari IoT Platform, callback dipanggil untuk melakukan operasi yang diperlukan.
    2. Definisikan fungsi callback pesan
      Untuk informasi lebih lanjut tentang format data Alink pesan, lihat Kelola hubungan topologi dan Hubungkan atau putuskan koneksi sub-perangkat.
      void demo_subdev_recv_handler(void *handle, const aiot_subdev_recv_t *packet, void *user_data)
      {
          switch (packet->type) {
              case AIOT_SUBDEVRECV_TOPO_ADD_REPLY:
              case AIOT_SUBDEVRECV_TOPO_DELETE_REPLY:
              case AIOT_SUBDEVRECV_TOPO_GET_REPLY:
              case AIOT_SUBDEVRECV_BATCH_LOGIN_REPLY:
              case AIOT_SUBDEVRECV_BATCH_LOGOUT_REPLY:
              case AIOT_SUBDEVRECV_SUB_REGISTER_REPLY:
              case AIOT_SUBDEVRECV_PRODUCT_REGISTER_REPLY: {
                  printf("msgid        : %d\n", packet->data.generic_reply.msg_id);
                  printf("code         : %d\n", packet->data.generic_reply.code);
                  printf("product key  : %s\n", packet->data.generic_reply.product_key);
                  printf("device name  : %s\n", packet->data.generic_reply.device_name);
                  printf("message      : %s\n", (packet->data.generic_reply.message == NULL)?("NULL"):(packet->data.generic_reply.message));
                  printf("data         : %s\n", packet->data.generic_reply.data);
              }
              break;
              case AIOT_SUBDEVRECV_TOPO_CHANGE_NOTIFY: {
                  printf("msgid        : %d\n", packet->data.generic_notify.msg_id);
                  printf("product key  : %s\n", packet->data.generic_notify.product_key);
                  printf("device name  : %s\n", packet->data.generic_notify.device_name);
                  printf("params       : %s\n", packet->data.generic_notify.params);
              }
              break;
              default: {
      
              }
          }
      }

Langkah 3: Tambahkan hubungan topologi

  1. Dapatkan informasi autentikasi sub-perangkat.
    Buat produk dan perangkat untuk sub-perangkat. Saat membuat produk, atur tipe node ke Gateway sub-device.Dalam contoh ini, produk dan sub-perangkat berikut dibuat.
    NamaProdukProductKeyNamaPerangkatDeviceSecretProductSecret
    LightSwitchSDa13FN******LightSwitch_SubDev_01768XBgQwgOakz3K4uhOiLeeh9x******y7GSILD480******
    LightSwitch_SubDev_02iwTZrbjbgNVChfuJkihjE5asek******
    LightSwitch_SubDev_03fdutq35iKMYdcWWBuIINY26hsN******
    LightSwitch_SubDev_04HCKv50YqgwdKhy5cE0Vz4aydmK******

    Untuk informasi lebih lanjut, lihat Buat produk dan Buat perangkat.

  2. Definisikan variabel g_subdev yang menunjukkan informasi autentikasi sub-perangkat.
    Dalam contoh ini, informasi autentikasi empat sub-perangkat disediakan. Dalam skenario bisnis sebenarnya, Anda harus menulis kode dan mendefinisikan metode untuk mendapatkan informasi autentikasi sub-perangkat. Contoh kode:
    • Setelah gateway menemukan sub-perangkat yang terhubung, gateway dapat memperoleh sertifikat sub-perangkat berdasarkan protokol yang ditentukan antara gateway dan sub-perangkat. Protokol tersebut ditentukan oleh penyedia gateway dan penyedia sub-perangkat.

    • Penyedia gateway menyediakan metode konfigurasi yang memungkinkan gateway untuk menetapkan informasi sertifikat sub-perangkat. Fitur ini diimplementasikan oleh penyedia gateway.

    aiot_subdev_dev_t g_subdev[] = {
        {
            "a13FN******",
            "LightSwitch_SubDev_01",
            "768XBgQwgOakz3K4uhOiLeeh9x******",
            "y7GSILD480******"
        },
        {
            "a13FN******",
            "LightSwitch_SubDev_02",
            "iwTZrbjbgNVChfuJkihjE5asek******",
            "y7GSILD480******"
        },
        {
            "a13FN******",
            "LightSwitch_SubDev_03",
            "fdutq35iKMYdcWWBuIINY26hsN******",
            "y7GSILD480******"
        },
        {
            "a13FN******",
            "LightSwitch_SubDev_04",
            "HCKv50YqgwdKhy5cE0Vz4aydmK******",
            "y7GSILD480******"
        }
    };
  3. Panggil operasi aiot_subdev_send_topo_add untuk menambahkan hubungan topologi antara sub-perangkat dan gateway. Permintaan dikirim ke IoT Platform.
        res = aiot_subdev_send_topo_add(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
        if (res < STATE_SUCCESS) {
            printf("aiot_subdev_send_topo_add gagal, res: -0x%04X\n", -res);
            aiot_subdev_deinit(&subdev_handle);
            demo_mqtt_stop(&mqtt_handle);
            return -1;
        }
  4. Opsional:Jika Anda tidak memerlukan gateway untuk menerima pesan dari IoT Platform sebagai proxy, panggil operasi aiot_subdev_send_topo_delete untuk menghapus hubungan topologi antara sub-perangkat dan gateway.
         aiot_subdev_send_topo_delete(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
         if (res < STATE_SUCCESS) {
             printf("aiot_subdev_send_topo_delete gagal, res: -0x%04X\n", -res);
             aiot_subdev_deinit(&subdev_handle);
             demo_mqtt_stop(&mqtt_handle);
             return -1;
         }

Langkah 4: Hubungkan sub-perangkat ke IoT Platform

  1. Panggil operasi aiot_subdev_send_batch_login untuk menghubungkan satu atau beberapa sub-perangkat dengan IoT Platform. Setelah sub-perangkat terhubung ke IoT Platform, status sub-perangkat berubah menjadi Online.
        aiot_subdev_send_batch_login(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
        if (res < STATE_SUCCESS) {
            printf("aiot_subdev_send_batch_login gagal, res: -0x%04X\n", -res);
            aiot_subdev_deinit(&subdev_handle);
            demo_mqtt_stop(&mqtt_handle);
            return -1;
        }
  2. Opsional:Jika Anda perlu memutuskan koneksi sub-perangkat, panggil operasi aiot_subdev_send_batch_logout untuk mengirim permintaan pemutusan koneksi. Setelah IoT Platform menerima permintaan, IoT Platform mengakhiri koneksi. Kemudian, status sub-perangkat berubah menjadi Offline.
    Penting IoT Platform memperbarui status sub-perangkat menjadi Offline. Dalam hal ini, gateway tidak lagi menerima pesan yang IoT Platform kirimkan ke sub-perangkat.
         aiot_subdev_send_batch_logout(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
         if (res < STATE_SUCCESS) {
             printf("aiot_subdev_send_batch_logout gagal, res: -0x%04X\n", -res);
             aiot_subdev_deinit(&subdev_handle);
             demo_mqtt_stop(&mqtt_handle);
             return -1;
         }
Pesan yang IoT Platform kirimkan ke sub-perangkat diproses berdasarkan status online sub-perangkat.
  • Jika sub-perangkat offline, pesan QoS 0 akan dibuang.
  • Jika sub-perangkat online, IoT Platform mengirimkan pesan ke gateway. Kemudian, gateway meneruskan pesan tersebut ke sub-perangkat.

Langkah 5: Berlangganan topik

Setelah sub-perangkat terhubung ke IoT Platform, Anda dapat memanggil operasi aiot_mqtt_sub untuk berlangganan topik. Kemudian, sub-perangkat dapat menerima pesan melalui topik tersebut.

Penting Saat menentukan topik, bedakan ProductKey dan DeviceName dari sub-perangkat dan gateway.
  •     {
            char *sub_topic = "/a13FN******/LightSwitch_SubDev_01/user/get";
    
            res = aiot_mqtt_sub(mqtt_handle, sub_topic, NULL, 1, NULL);
            if (res < 0) {
                printf("aiot_mqtt_sub gagal, res: -0x%04X\n", -res);
                return -1;
            }
        }
  • ParameterContohDeskripsi
    sub_topic/a13FN******/LightSwitch_SubDev_01/user/get
    • a1oGs****** menunjukkan ProductKey dari sub-perangkat.
    • LightSwitch_SubDev_01 menunjukkan DeviceName dari sub-perangkat.

    Dalam contoh ini, topik kustom default ditentukan.

    Untuk informasi lebih lanjut, lihat Topik.

Langkah 6: Publikasikan pesan dari sub-perangkat

Panggil operasi aiot_mqtt_pub untuk mengirim pesan ke topik tertentu.

  •      {
            char *pub_topic = "/a13FN******/LightSwitch_SubDev_01/user/update";
            char *pub_payload = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}";
    
            res = aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);
            if (res < 0) {
                printf("aiot_mqtt_sub gagal, res: -0x%04X\n", -res);
                return -1;
            }
        }
  • ParameterContohDeskripsi
    pub_topic /a13FN******/LightSwitch_SubDev_01/user/updateTopik yang memiliki izin Publish.
    • a1oGs****** menunjukkan ProductKey dari sub-perangkat.
    • LightSwitch_SubDev_01 menunjukkan DeviceName dari sub-perangkat.
    Dalam contoh ini, topik kustom default ditentukan.

    Untuk informasi lebih lanjut, lihat Topik.

    pub_payload{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}

    Konten pesan yang ingin Anda kirimkan perangkat ke IoT Platform.

    Dalam contoh ini, topik kustom digunakan. Anda dapat menentukan format pesan kustom.

    Untuk informasi lebih lanjut, lihat Format data.

Langkah 7: Putuskan koneksi gateway

Catatan

Koneksi MQTT diterapkan pada perangkat yang tetap terhubung secara persisten. Anda dapat memutuskan koneksi perangkat dari IoT Platform secara manual.

Dalam contoh ini, thread utama digunakan untuk mengonfigurasi parameter dan membuat koneksi. Setelah koneksi dibuat, Anda dapat menangguhkan thread utama.

Panggil operasi aiot_mqtt_disconnect untuk memutuskan koneksi perangkat dari IoT Platform.

    res = aiot_mqtt_disconnect(mqtt_handle);
    if (res < STATE_SUCCESS) {
        aiot_mqtt_deinit(&mqtt_handle);
        printf("aiot_mqtt_disconnect gagal: -0x%04X\n", -res);
        return -1;
    }

Langkah 8:

Panggil operasi aiot_subdev_deinit untuk menghapus subdev

    res = aiot_subdev_deinit(&subdev_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_subdev_deinit gagal: -0x%04X\n", res);
    }

Apa yang harus dilakukan selanjutnya

Setelah Anda mengonfigurasi file kode contoh, kompilasi file tersebut untuk menghasilkan file yang dapat dieksekusi. Dalam contoh ini, file yang dapat dieksekusi ./output/subdev-basic-demo dihasilkan. Untuk informasi lebih lanjut, lihat Kompilasi dan Menjalankan.