全部产品
Search
文档中心

IoT Platform:Contoh cara mendaftarkan perangkat secara dinamis melalui MQTT

更新时间:Jun 21, 2025

Topik ini menjelaskan cara memanggil operasi API dari Link SDK for C untuk mengirimkan permintaan Message Queuing Telemetry Transport (MQTT) ke IoT Platform, mendaftarkan perangkat secara dinamis, dan mendapatkan informasi verifikasi yang diperlukan untuk mengaktifkan perangkat. Dalam contoh ini, digunakan file kode sampel bernama ./demos/dynregmq_basic_demo.c.

Informasi latar belakang

Saat menyesuaikan SDK, atur Skema Otentikasi Perangkat ke Pendaftaran Dinamis pada halaman Penyesuaian SDK. Sebelum menggunakan file kode sampel dalam topik ini, pastikan Anda telah memahami isi dari topik Ikhtisar.

Langkah 1: Inisialisasi SDK

  1. Tambahkan file header.

    #include "aiot_state_api.h"
    #include "aiot_sysdep_api.h"
    #include "aiot_dynregmq_api.h"
  2. Tambahkan dependensi dasar dan konfigurasikan fitur output log.

        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. Panggil operasi aiot_dynregmq_init untuk membuat instance klien bernama dynregmq dan inisialisasi parameter default.

        dynregmq_handle = aiot_dynregmq_init();
        if (dynregmq_handle == NULL) {
            printf("aiot_dynregmq_init gagal\n");
            return -1;
        }

Langkah 2: Konfigurasikan fitur yang diperlukan

Panggil operasi aiot_dynregmq_setopt untuk mengonfigurasi item berikut:

  1. Konfigurasikan Parameter Koneksi.

  2. Konfigurasikan Callback Pesan.

  3. Untuk informasi lebih lanjut, lihat Pendaftaran Dinamis Berbasis MQTT.

  4. Konfigurasikan parameter koneksi.

    • Kode sampel:

          char *product_key       = "a18wP******";
          char *product_secret    = "CpIlPVCXI7******";
          char *device_name       = "LightSwitch";
          char         *mqtt_host = "iot-06******.mqtt.iothub.aliyuncs.com"; 
          uint8_t skip_pre_regist =1;
          ...
          /* Tentukan titik akhir server.  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_HOST, (void *)host);
          /* Tentukan port server.  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PORT, (void *)&port);
          /* Tentukan ProductKey perangkat.  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PRODUCT_KEY, (void *)product_key);
          /* Tentukan ProductSecret perangkat.  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PRODUCT_SECRET, (void *)product_secret);
          /* Tentukan DeviceName perangkat.
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_DEVICE_NAME, (void *)device_name);
          /* Tentukan kredensial keamanan koneksi.  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_NETWORK_CRED, (void *)&cred);
          /* Tentukan apakah akan menggunakan metode verifikasi tanpa pra-pendaftaran.  */
          aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_NO_WHITELIST, (void *)&skip_pre_regist);
          ...
          ...
    • Parameter:

      Parameter

      Contoh

      Ikhtisar

      mqtt_host

      iot-06******.mqtt.iothub.aliyuncs.com

      Titik akhir tempat Anda ingin menghubungkan perangkat.

      Format: ${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com.

      skip_pre_regist

      1

      Menentukan apakah akan menggunakan metode verifikasi tanpa pra-pendaftaran.

      • 0: tidak

      • 1: ya

      null

      Untuk informasi lebih lanjut tentang pra-pendaftaran dan metode verifikasi unik-sertifikat-per-produk tanpa pra-pendaftaran, lihat Verifikasi unik-sertifikat-per-produk.

      product_key

      a18wP******

      ProductKey dan ProductSecret yang Anda simpan saat membuat produk di konsol IoT Platform. Untuk informasi lebih lanjut, lihat Buat produk.

      product_secret

      CpIlPVCXI7******

      device_name

      LightSwitch

      DeviceName perangkat.

      IoT Platform memeriksa DeviceName saat perangkat mengajukan permintaan aktivasi. Kami sarankan Anda menggunakan pengenal yang dapat diperoleh dari perangkat sebagai DeviceName. Pengenal tersebut bisa berupa alamat MAC, Identitas Peralatan Bergerak Internasional (IMEI), atau nomor seri (SN) perangkat.

  5. Konfigurasikan callback pesan.

    1. Tentukan fungsi callback pesan.

      • Kode Sampel:

         int main(int argc, char *argv[])
        {
            ...
            Etc.
            aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_RECV_HANDLER, (void *)demo_dynregmq_recv_handler);
            aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_USERDATA, (void *)&demo_info);
            ...
            Etc.
        }
      • Parameter:

        Parameter

        Contoh

        Deskripsi

        AIOT_DYNREGMQOPT_RECV_HANDLER

        demo_dynregmq_recv_handler

        Mengonfigurasi callback pesan. Saat pesan diterima, callback dipanggil untuk melakukan operasi yang diperlukan.

        AIOT_DYNREGMQOPT_USERDATA

        &demo_info

        Konteks. Saat operasi demo_dynregmq_recv_handler dipanggil, nilai yang diperoleh dari operasi dikembalikan.

    2. Definisikan fungsi callback untuk pesan.

      void demo_dynregmq_recv_handler(void *handle, const aiot_dynregmq_recv_t *packet, void *userdata)
      {
          switch (packet->type) {
              /* TODO: Anda harus menyimpan ruang yang ditunjuk oleh parameter packet dalam callback. Setelah callback mengembalikan hasil, ruang tersebut dilepaskan.  */
              case AIOT_DYNREGMQRECV_DEVICEINFO_WL: {
                  if (strlen(packet->data.deviceinfo_wl.device_secret) >= sizeof(demo_devinfo_wl.device_secret)) {
                      break;
                  }
                  /* Jika Anda menggunakan metode verifikasi pra-pendaftaran, pastikan parameter device_secret disimpan secara persisten.  */
                  memset(&demo_devinfo_wl, 0, sizeof(demo_devinfo_wl_t));
                  memcpy(demo_devinfo_wl.device_secret, packet->data.deviceinfo_wl.device_secret,
                         strlen(packet->data.deviceinfo_wl.device_secret));
              }
              break;
              /* TODO: Anda harus menyimpan ruang yang ditunjuk oleh parameter packet dalam callback. Setelah callback mengembalikan hasil, ruang tersebut dilepaskan.  */
              case AIOT_DYNREGMQRECV_DEVICEINFO_NWL: {
                  if (strlen(packet->data.deviceinfo_nwl.clientid) >= sizeof(demo_devinfo_nwl.conn_clientid) ||
                      strlen(packet->data.deviceinfo_nwl.username) >= sizeof(demo_devinfo_nwl.conn_username) ||
                      strlen(packet->data.deviceinfo_nwl.password) >= sizeof(demo_devinfo_nwl.conn_password)) {
                      break;
                  }
                  /* Jika Anda menggunakan metode verifikasi tanpa pra-pendaftaran, pastikan parameter clientid, username, dan password disimpan secara persisten.  */
                  memset(&demo_devinfo_nwl, 0, sizeof(demo_devinfo_nwl_t));
                  memcpy(demo_devinfo_nwl.conn_clientid, packet->data.deviceinfo_nwl.clientid,
                         strlen(packet->data.deviceinfo_nwl.clientid));
                  memcpy(demo_devinfo_nwl.conn_username, packet->data.deviceinfo_nwl.username,
                         strlen(packet->data.deviceinfo_nwl.username));
                  memcpy(demo_devinfo_nwl.conn_password, packet->data.deviceinfo_nwl.password,
                         strlen(packet->data.deviceinfo_nwl.password));
              }
              break;
              default: {
              }
              break;
          }
      }

Langkah 3: Kirim permintaan

Panggil operasi aiot_dynregmq_send_request untuk mengirim permintaan pendaftaran dinamis ke server. Untuk detail konfigurasi parameter, lihat Konfigurasikan parameter koneksi.

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

Langkah 4: Terima respons

Setelah permintaan pendaftaran dikirim, IoT Platform mengembalikan respons. Perangkat memanggil operasi aiot_dynregmq_recv untuk menerima data respons dan memproses data tersebut menggunakan callback pesan.

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

Dalam contoh ini, data respons dicetak. Tentukan logika untuk menyimpan informasi verifikasi perangkat yang dikembalikan di lokasi setempat. Informasi verifikasi digunakan saat perangkat terhubung ke IoT Platform.

    if (skip_pre_regist == 0) {
        printf("device secret: %s\n", demo_devinfo_wl.device_secret);
    } else {
        printf("clientid: %s\n", demo_devinfo_nwl.conn_clientid);
        printf("username: %s\n", demo_devinfo_nwl.conn_username);
        printf("password: %s\n", demo_devinfo_nwl.conn_password);
    }

Langkah 5: Keluar dari program

Panggil operasi aiot_dynregmq_deinit untuk menghapus instance klien dynregmq dan melepaskan sumber daya terkait.

    res = aiot_dynregmq_deinit(&dynregmq_handle);            

Apa yang harus dilakukan selanjutnya

  • Setelah mengonfigurasi file kode sampel, kompilasikan file tersebut untuk menghasilkan file yang dapat dieksekusi. Dalam contoh ini, file yang dihasilkan adalah ./output/dynregmq-basic-demo.

    Untuk informasi lebih lanjut, lihat Siapkan Lingkungan Pengembangan.

  • Untuk informasi lebih lanjut mengenai hasil eksekusi, lihat Lihat log.

  • Jika Anda menggunakan metode verifikasi unik-sertifikat-per-produk tanpa pra-pendaftaran untuk memverifikasi perangkat, IoT Platform mengeluarkan ClientId, UserName, dan Password bukan DeviceSecret ke perangkat setelah IoT Platform memverifikasi perangkat.

    Anda dapat menentukan ClientId, UserName, dan Password untuk parameter AIOT_MQTTOPT_USERNAME, AIOT_MQTTOPT_PASSWORD, dan AIOT_MQTTOPT_CLIENTID dalam file mqtt_basic_demo.c dan memanggil operasi aiot_mqtt_connect untuk menghubungkan perangkat ke IoT Platform. Kode sampel berikut memberikan contoh cara melakukan operasi sebelumnya:

     char *user_name  = "demo_user_name";
     char *password = "demo_passwd";
     char *client_id = "demo_client_id";
     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_USERNAME, user_name);
     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_PASSWORD, password);
     aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_CLIENTID, client_id);
     res = aiot_mqtt_connect(mqtt_handle);