All Products
Search
Document Center

IoT Platform:Contoh

Last Updated:Jul 06, 2025

Topik ini menjelaskan cara memanggil operasi API dari Link SDK for C untuk mengimplementasikan fitur model Thing Specification Language (TSL) pada perangkat. Dalam contoh ini, file kode contoh bernama ./demos/data_model_basic_demo.c digunakan.

Informasi latar belakang

  • Untuk informasi lebih lanjut tentang fitur model TSL, lihat Contoh.

  • Fitur tag perangkat hanya tersedia untuk perangkat yang terhubung ke IoT Platform melalui Message Queuing Telemetry Transport (MQTT). Untuk informasi lebih lanjut tentang kode terkait koneksi MQTT saat mengonfigurasi fitur tersebut, lihat Ikhtisar.

Langkah 1: Inisialisasi SDK

  1. Tambahkan file header.

    ……
    ……
    
    #include "aiot_dm_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_dm_init untuk membuat instance klien bernama data-model dan inisialisasi parameter default.

        dm_handle = aiot_dm_init();
        if (dm_handle == NULL) {
            printf("aiot_dm_init gagal");
            return -1;}

Langkah 2: Konfigurasikan fitur yang diperlukan

Panggil operasi aiot_dm_setopt untuk mengonfigurasi item berikut:

  1. Asosiasikan dengan penanganan koneksi MQTT.

    Penting

    Sebelum mengonfigurasi parameter spesifik tag perangkat, pastikan bahwa informasi verifikasi perangkat telah ditentukan. Untuk informasi lebih lanjut, lihat Contoh.

    • Kode contoh:

          aiot_dm_setopt(dm_handle, AIOT_DMOPT_MQTT_HANDLE, mqtt_handle);
    • Parameter:

      Parameter

      Contoh

      Deskripsi

      AIOT_DMOPT_MQTT_HANDLE

      mqtt_handle

      Anda harus membuat koneksi MQTT. Parameter ini digunakan untuk mengasosiasikan dengan penanganan koneksi MQTT.

  2. Konfigurasikan fungsi callback untuk memproses pesan TSL.

    1. Definisikan fungsi callback.

      static void demo_dm_recv_handler(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
      {
          printf("demo_dm_recv_handler, type = %d\r\n", recv->type);
      
          switch (recv->type) {
      
              /* Kirim respons dari IoT Platform setelah perangkat mengirimkan properti, mengirimkan acara, meminta properti yang diinginkan, atau menghapus properti yang diinginkan. */
              case AIOT_DMRECV_GENERIC_REPLY: {
                  demo_dm_recv_generic_reply(dm_handle, recv, userdata);
              }
              break;
      
              /* Konfigurasikan properti. */
              case AIOT_DMRECV_PROPERTY_SET: {
                  demo_dm_recv_property_set(dm_handle, recv, userdata);
              }
              break;
      
              /* Panggil layanan secara asinkron */
              case AIOT_DMRECV_ASYNC_SERVICE_INVOKE: {
                  demo_dm_recv_async_service_invoke(dm_handle, recv, userdata);
              }
              break;
      
              /* Panggil layanan secara sinkron */
              case AIOT_DMRECV_SYNC_SERVICE_INVOKE: {
                  demo_dm_recv_sync_service_invoke(dm_handle, recv, userdata);
              }
              break;
      
              /* Kirim data biner downstream */
              case AIOT_DMRECV_RAW_DATA: {
                  demo_dm_recv_raw_data(dm_handle, recv, userdata);
              }
              break;
      
              /* Saat Anda memanggil layanan secara sinkron untuk mengirim data biner, parameter rrpc_id ditambahkan ke data biner. */
              case AIOT_DMRECV_RAW_SYNC_SERVICE_INVOKE: {
                  demo_dm_recv_raw_sync_service_invoke(dm_handle, recv, userdata);
              }
              break;
      
              /* Kirim respons dari IoT Platform setelah perangkat mengirimkan data biner. */
              case AIOT_DMRECV_RAW_DATA_REPLY: {
                  demo_dm_recv_raw_data_reply(dm_handle, recv, userdata);
              }
              break;
      
              default:
                  break;
          }
      }
    2. Konfigurasikan fungsi callback untuk memproses pesan TSL.

      • Kode contoh:

            aiot_dm_setopt(dm_handle, AIOT_DMOPT_RECV_HANDLER, (void *)demo_dm_recv_handler);                   
      • Parameter:

        Parameter

        Contoh

        Deskripsi

        AIOT_DMOPT_RECV_HANDLER

        demo_dm_recv_handler

        Fungsi ini dipanggil ketika pesan TSL diterima.

  3. Tentukan apakah IoT Platform mengembalikan respons.

    Anda dapat menggunakan kode berikut untuk menentukan apakah IoT Platform mengembalikan respons setelah menerima pesan perangkat:

    • Kode contoh:

          uint8_t post_reply = 1;
      
          ……
          ……
      
         aiot_dm_setopt(dm_handle, AIOT_DMOPT_POST_REPLY, (void *)&post_reply);
    • Parameter:

      Parameter

      Contoh

      Deskripsi

      AIOT_DMOPT_POST_REPLY

      1

      Nilai valid:

      • 1: mengembalikan respons

      • 0: tidak mengembalikan respons

    • Jika nilai parameter AIOT_DMOPT_POST_REPLY adalah 1, Anda harus menentukan logika untuk memproses pesan respons.

      Anda dapat menentukan logika pemrosesan berdasarkan kebutuhan bisnis Anda. Dalam contoh ini, pesan respons dicetak.

      • ICA Standard Data Format (Alink JSON)ICA标准数据格式

        Pesan respons terdapat dalam struktur recv->data.generic_reply. Pesan-pesan tersebut menggunakan format data Alink. Untuk informasi lebih lanjut, lihat Properti perangkat, acara, dan layanan.

        static void demo_dm_recv_generic_reply(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata){
            printf("demo_dm_recv_generic_reply msg_id = %d, code = %d, data = %.*s, message = %.*s\r\n",
                recv->data.generic_reply.msg_id,
                recv->data.generic_reply.code,
                recv->data.generic_reply.data_len,
                recv->data.generic_reply.data,
                recv->data.generic_reply.message_len,
                recv->data.generic_reply.message);
        }
      • Custom data format透传/自定义格式

        Pesan respons terdapat dalam struktur recv->data.raw_data. Sebelum pesan dikirim, Anda harus mengunggah skrip penguraian ke IoT Platform. Untuk informasi lebih lanjut, lihat Penguraian pesan.

        static void demo_dm_recv_raw_data_reply(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
        {
            printf("demo_dm_recv_async_service_invoke receive reply for up_raw msg, data len = %d\r\n", recv->data.raw_data.data_len);
        
        }

Langkah 3: Kirim properti perangkat

Setelah menghubungkan perangkat ke IoT Platform melalui MQTT, panggil operasi aiot_dm_send untuk mengirimkan properti perangkat. Properti yang akan dikirimkan disimpan di lokasi tertentu menggunakan struktur aiot_dm_msg_t. Struktur ini merupakan parameter input dari operasi aiot_dm_send.

Tulis kode untuk mengirimkan properti perangkat berdasarkan format data perangkat berikut:

ICA standard data format (Alink JSON)

  1. Tambahkan fitur TSL.

    • Masuk ke Konsol IoT Platform. Pada tab Feature Definition halaman Product Details, tambahkan properti ke modul TSL default atau modul kustom. Misalnya, Anda dapat membuat modul kustom bernama demo_extra_block. Untuk informasi lebih lanjut, lihat Tambahkan fitur TSL.

      Tabel berikut menjelaskan properti TSL yang ditambahkan dalam contoh ini.

      Modul TSL

      Fitur

      Pengenal

      Tipe data

      Definisi data

      Tipe baca/tulis

      Modul default

      Saklar lampu malam 1

      LightSwitch

      bool

      • 0: on

      • 1: off

      Baca dan tulis

      Daya

      Power

      teks

      Panjang data: 10.240 karakter

      Baca dan tulis

      Arus operasi

      WF

      int32

      • Nilai valid: 0 hingga 10.

      • Ukuran langkah: 1

      • Satuan: A

      Baca dan tulis

      demo_extra_block

      Saklar lampu malam 2

      NightLightSwitch

      bool

      • 0: on

      • 1: off

      Baca dan tulis

    • Dalam contoh ini, Anda juga dapat menambahkan fitur dengan mengimpor File TSL. Untuk informasi lebih lanjut, lihat Tambahkan fitur TSL secara batch.

  2. Tentukan isi pesan properti.

    • Kode contoh:

      • Modul default:

        /* Kirim properti. */
                demo_send_property_post(dm_handle, "{\"LightSwitch\": 0}");
        /* Kirim beberapa properti sekaligus. */
                demo_send_property_batch_post(dm_handle, "{\"properties\":{\"Power\": [ {\"value\":\"on\",\"time\":1612684518000}],\"WF\": [{\"value\": 3,\"time\":1612684518000}]}}");
      • Modul kustom:

                demo_send_property_post(dm_handle, "{\"demo_extra_block:NightLightSwitch\": 1}");
    • Contoh pesan:

      • Pesan TSL yang dikirimkan berada dalam format JSON. Tabel berikut menjelaskan pesan contoh dan format Alink dari pesan tersebut. Untuk informasi lebih lanjut, lihat Properti perangkat, acara, dan layanan.

        Catatan

        Anda hanya perlu fokus pada konten pesan, yang ditunjukkan oleh parameter params dalam data Alink. Link SDK mengenkapsulasi dan memproses pesan tersebut.

        Tipe pesan

        Contoh

        Format Alink

        Satu properti

        {\"LightSwitch\": 0}
        {
          "id": "123",
          "version": "1.0",
          "sys":{
              "ack":0
          },
          "params": {
                 "LightSwitch": 0
            },
          "method": "thing.event.property.post"
        }

        Beberapa properti

        {\"properties\":{\"Power\": [ {\"value\":\"on\",\"time\":1612684518000}],\"WF\": [{\"value\": 3,\"time\":1612684518000}]}}
        {
          "id": 123, 
          "version": "1.0",
          "sys":{
              "ack":0
          }, 
          "method": "thing.event.property.batch.post", 
          "params": {
            "properties": {
                  "Power": [{
                        "value": "on", 
                        "time": 1612684518000
                    },
                  ], 
                  "WF": [{
                        "value": 3, 
                        "time": 1612684518000
                        },
                  ]
              }, 
        }
      • Setelah beberapa properti dikirimkan, IoT Platform mengirimkan respons untuk mengonfirmasi bahwa pesan telah diterima. Untuk menerima respons tersebut, Anda harus berlangganan topik /sys/a18wP******/LightSwitch/thing/event/property/batch/post_reply.

        Kode contoh:

            aiot_mqtt_sub(mqtt_handle, "/sys/a18wP******/LightSwitch/thing/event/property/batch/post_reply", NULL, 1,
                          NULL);

        Deskripsi:

        • a1oGs****** adalah ProductKey dari perangkat.

        • LightSwitch adalah DeviceName dari perangkat.

  3. Definisikan fungsi untuk mengirimkan properti.

    /* Kirim properti. */
    int32_t demo_send_property_post(void *dm_handle, char *params)
    {
        aiot_dm_msg_t msg;
    
        memset(&msg, 0, sizeof(aiot_dm_msg_t));
        msg.type = AIOT_DMMSG_PROPERTY_POST;
        msg.data.property_post.params = params;
    
        return aiot_dm_send(dm_handle, &msg);
    }
    
    /* Kirim beberapa properti sekaligus. */
    int32_t demo_send_property_batch_post(void *dm_handle, char *params)
    {
        aiot_dm_msg_t msg;
    
        memset(&msg, 0, sizeof(aiot_dm_msg_t));
        msg.type = AIOT_DMMSG_PROPERTY_BATCH_POST;
        msg.data.property_post.params = params;
    
        return aiot_dm_send(dm_handle, &msg);
    }

Custom data format

  1. Unggah skrip penguraian data ke IoT Platform.

    Untuk informasi lebih lanjut, lihat Apa itu penguraian data?

  2. Tulis kode untuk mengirimkan data biner perangkat.

    Kode contoh:

        {
            aiot_dm_msg_t msg;
            uint8_t raw_data[] = {0x01, 0x02};
    
            memset(&msg, 0, sizeof(aiot_dm_msg_t));
            msg.type = AIOT_DMMSG_RAW_DATA;
            msg.data.raw_data.data = raw_data;
            msg.data.raw_data.data_len = sizeof(raw_data);
            aiot_dm_send(dm_handle, &msg);
        }
Catatan

Saat menggunakan model TSL untuk komunikasi, pastikan jumlah pesan tidak melebihi ambang batas.

  • Untuk informasi lebih lanjut tentang batasan komunikasi, lihat Batasan.

  • Jika jumlah pesan melebihi ambang batas, masuk ke konsol IoT Platform untuk melihat pesan yang terakumulasi. Untuk informasi lebih lanjut, lihat Lihat dan pantau grup konsumen.

Langkah 4: Konfigurasikan properti perangkat

Anda dapat memanggil operasi SetDeviceProperty atau SetDevicesProperty untuk mengirimkan perintah konfigurasi properti ke perangkat. Perangkat memanggil operasi aiot_mqtt_recv untuk menerima perintah dan memanggil fungsi callback demo_dm_recv_handler untuk memproses perintah tersebut.

Saat menentukan logika pemrosesan fungsi callback, perhatikan hal-hal berikut:

  • Catatan penggunaan:

    • Pesan yang diterima digunakan sebagai parameter input fungsi callback aiot_dm_recv_handler_t. Pesan tersebut disimpan di lokasi tertentu menggunakan struktur aiot_dm_recv_t.

    • Konten perintah dalam pesan yang diterima bervariasi berdasarkan format data perangkat. Tabel berikut menjelaskan bidang perintah.

      Format data perangkat

      Bidang dalam pesan yang diterima

      Deskripsi

      ICA standard data format (Alink JSON)

      recv->data.property_set.params

      Bidang ini sama dengan parameter params dalam data Alink. Untuk informasi lebih lanjut, lihat Properti perangkat, acara, dan layanan.

      Custom data format

      recv->data.raw_data

      Anda harus menguraikan data pada perangkat. Untuk informasi lebih lanjut, lihat Apa itu penguraian data?

  • Logika pemrosesan yang direkomendasikan:

    1. Perbarui properti perangkat.

    2. Kirimkan properti yang telah diperbarui.

  • Logika pemrosesan kode contoh:

    Dalam contoh ini, pesan yang diterima dicetak. Untuk mengirimkan properti yang telah diperbarui, Anda dapat menghapus simbol komentar (/* dan */) di bawah TODO.

    • ICA standard data format (Alink JSON)

      static void demo_dm_recv_property_set(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
      {
          printf("demo_dm_recv_property_set msg_id = %ld, params = %.*s\r\n",
                  (unsigned long)recv->data.property_set.msg_id,
                  recv->data.property_set.params_len,
                  recv->data.property_set.params);
      
          /* TODO: Kode contoh berikut menunjukkan cara mengembalikan respons setelah IoT Platform mengirimkan perintah untuk mengonfigurasi properti. Untuk menjalankan kode contoh, hapus komentar dari kode contoh. */
          /*
          {
              aiot_dm_msg_t msg;
      
              memset(&msg, 0, sizeof(aiot_dm_msg_t));
              msg.type = AIOT_DMMSG_PROPERTY_SET_REPLY;
              msg.data.property_set_reply.msg_id = recv->data.property_set.msg_id;
              msg.data.property_set_reply.code = 200;
              msg.data.property_set_reply.data = "{}";
              int32_t res = aiot_dm_send(dm_handle, &msg);
              if (res < 0) {
                  printf("aiot_dm_send gagal\r\n");
              }
          }
          */
      }
    • Custom data format

      static void demo_dm_recv_raw_data(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
      {
          printf("demo_dm_recv_raw_data raw data len = %d\r\n", recv->data.raw_data.data_len);
          /* TODO: Kode contoh berikut menunjukkan cara mengirimkan data biner. Jika Anda ingin mengirimkan data biner, Anda harus mengonfigurasi skrip penguraian data di konsol IoT Platform.  */
          /*
          {
              aiot_dm_msg_t msg;
              uint8_t raw_data[] = {0x01, 0x02};
      
              memset(&msg, 0, sizeof(aiot_dm_msg_t));
              msg.type = AIOT_DMMSG_RAW_DATA;
              msg.data.raw_data.data = raw_data;
              msg.data.raw_data.data_len = sizeof(raw_data);
              aiot_dm_send(dm_handle, &msg);
          }
          */
      }

Langkah 5: Kirimkan acara perangkat

Setelah menghubungkan perangkat ke IoT Platform melalui MQTT, panggil operasi aiot_dm_send untuk mengirimkan acara perangkat. Acara yang akan dikirimkan disimpan di lokasi tertentu menggunakan struktur aiot_dm_msg_t. Struktur ini merupakan parameter input dari operasi aiot_dm_send.

Tulis kode untuk mengirimkan acara perangkat berdasarkan format data perangkat berikut:

  • Jika data perangkat Anda dalam custom format, Anda dapat menggunakan operasi API yang sama untuk mengirimkan acara dan properti. Untuk informasi lebih lanjut, lihat Langkah 3.

  • Jika data perangkat Anda dalam ICA standard data format (Alink JSON), lakukan langkah-langkah berikut:

  1. Tambahkan model TSL.

    • Masuk ke Konsol IoT Platform. Pada tab Feature Definition halaman Product Details, tambahkan acara ke produk. Untuk informasi lebih lanjut, lihat Tambahkan fitur TSL.

      Tabel berikut menjelaskan acara TSL yang ditambahkan dalam contoh ini.

      Fitur

      Pengenal

      Tipe acara

      Parameter keluaran

      Kesalahan

      Error

      Kesalahan

      • Nama parameter: Kode kesalahan

      • Pengenal parameter: ErrorCode

      • Tipe data: enum

      • Item enumerasi:

        • 0: Terjadi kesalahan pada perangkat keras perangkat.

        • 1: Terjadi kesalahan pada perangkat lunak perangkat.

        • 2: Terjadi kesalahan yang tidak diketahui.

    • Dalam contoh ini, Anda juga dapat menambahkan fitur dengan mengimpor File TSL. Untuk informasi lebih lanjut, lihat Tambahkan fitur TSL secara batch.

  2. Tentukan isi pesan acara.

    • Kode contoh:

              demo_send_event_post(dm_handle, "Error", "{\"ErrorCode\": 0}");
    • Contoh pesan:

      Pesan TSL yang dikirimkan berada dalam format JSON. Tabel berikut menjelaskan pesan contoh dan format Alink dari pesan tersebut. Untuk informasi lebih lanjut, lihat Properti perangkat, acara, dan layanan.

      Catatan

      Anda hanya perlu fokus pada konten pesan, yang ditunjukkan oleh parameter params dalam data Alink. Link SDK mengenkapsulasi dan memproses pesan tersebut.

      Contoh

      Format Alink

      {\"ErrorCode\": 0}
      {
        "id": "123",
        "version": "1.0",
        "params": {
              "ErrorCode": 0
        },
        "method": "thing.event.alarm.post"
      }
  3. Definisikan fungsi untuk mengirimkan acara.

    
    int32_t demo_send_event_post(void *dm_handle, char *event_id, char *params)
    {
        aiot_dm_msg_t msg;
    
        memset(&msg, 0, sizeof(aiot_dm_msg_t));
        msg.type = AIOT_DMMSG_EVENT_POST;
        msg.data.event_post.event_id = event_id;
        msg.data.event_post.params = params;
    
        return aiot_dm_send(dm_handle, &msg);
    }

Langkah 6: Panggil layanan perangkat

Anda dapat memanggil operasi InvokeThingService atau InvokeThingsService untuk mengirimkan perintah pemanggilan layanan ke perangkat. Perangkat memanggil operasi aiot_mqtt_recv untuk menerima perintah dan memanggil fungsi callback demo_dm_recv_handler untuk memproses perintah.

Saat menentukan logika pemrosesan fungsi callback, perhatikan hal-hal berikut:

  • Catatan penggunaan:

    • Pesan yang diterima digunakan sebagai parameter input fungsi callback aiot_dm_recv_handler_t. Pesan tersebut disimpan di lokasi tertentu menggunakan struktur aiot_dm_recv_t.

    • Konten perintah dalam pesan yang diterima bervariasi berdasarkan format data perangkat. Tabel berikut menjelaskan bidang perintah.

      Format data perangkat

      Bidang dalam pesan sinkron

      Bidang dalam pesan asinkron

      Deskripsi

      ICA standard data format (Alink JSON)

      recv->data.sync_service_invoke

      recv->data.async_service_invoke

      Bidang ini sama dengan parameter params dalam data Alink. Untuk informasi lebih lanjut, lihat Properti perangkat, acara, dan layanan.

      Custom data format

      recv->data.raw_data

      recv->data.raw_service_invoke

      Anda harus mengunggah skrip untuk menguraikan konten perintah. Untuk informasi lebih lanjut, lihat Apa itu penguraian data?

    • Jika fungsi callback yang didefinisikan tidak memiliki logika untuk menanggapi pemanggilan layanan, Anda harus mengonfigurasi fungsi untuk menentukan logika tersebut. Saat mengonfigurasi fungsi untuk mengirimkan respons, pastikan nilai parameter berikut dalam respons sama dengan yang ada di permintaan.

      • Pemanggilan sinkron: rrpc_id dan msg_id.

      • Pemanggilan asinkron: msg_id.

    • Saat mengirimkan respons ke IoT Platform, perhatikan periode timeout.

      • Pemanggilan sinkron: Setelah perangkat menerima permintaan, kirimkan respons dalam waktu 8 detik. Jika tidak, IoT Platform akan menentukan bahwa pemanggilan gagal terlepas dari apakah perangkat menerima permintaan tersebut.

      • Pemanggilan asinkron: Anda dapat menentukan periode timeout berdasarkan kebutuhan bisnis Anda. Tidak ada batasan yang diterapkan.

  • Logika pemrosesan yang direkomendasikan:

    1. Proses perintah.

    2. Kembalikan respons ke IoT Platform.

  • Logika pemrosesan kode contoh:

    Dalam contoh ini, pesan yang diterima dicetak. Untuk mengirimkan properti yang telah diperbarui, Anda dapat menghapus simbol komentar (/* dan */) di bawah TODO.

    • ICA standard data format (Alink JSON)

      • Pemanggilan sinkron:

        static void demo_dm_recv_sync_service_invoke(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
        {
            printf("demo_dm_recv_sync_service_invoke msg_id = %ld, rrpc_id = %s, service_id = %s, params = %.*s\r\n",
                    (unsigned long)recv->data.sync_service_invoke.msg_id,
                    recv->data.sync_service_invoke.rrpc_id,
                    recv->data.sync_service_invoke.service_id,
                    recv->data.sync_service_invoke.params_len,
                    recv->data.sync_service_invoke.params);
        
            /* TODO: Kode contoh berikut menunjukkan cara mengembalikan respons setelah IoT Platform memanggil layanan perangkat secara sinkron. 
                */
        
            
            {
                aiot_dm_msg_t msg;
        
                memset(&msg, 0, sizeof(aiot_dm_msg_t));
                msg.type = AIOT_DMMSG_SYNC_SERVICE_REPLY;
                msg.data.sync_service_reply.rrpc_id = recv->data.sync_service_invoke.rrpc_id;
                msg.data.sync_service_reply.msg_id = recv->data.sync_service_invoke.msg_id;
                msg.data.sync_service_reply.code = 200;
                msg.data.sync_service_reply.service_id = "SetLightSwitchTimer";
                msg.data.sync_service_reply.data = "{}";
                int32_t res = aiot_dm_send(dm_handle, &msg);
                if (res < 0) {
                    printf("aiot_dm_send gagal\r\n");
                }
            }
            
        }
      • Pemanggilan asinkron:

        static void demo_dm_recv_async_service_invoke(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
        {
            printf("demo_dm_recv_async_service_invoke msg_id = %ld, service_id = %s, params = %.*s\r\n",
                    (unsigned long)recv->data.async_service_invoke.msg_id,
                    recv->data.async_service_invoke.service_id,
                    recv->data.async_service_invoke.params_len,
                    recv->data.async_service_invoke.params);
        
            /* TODO: Kode contoh berikut menunjukkan cara mengembalikan respons setelah IoT Platform memanggil layanan perangkat secara asinkron. Untuk menjalankan kode contoh, hapus komentar dari kode contoh. 
                */
        
            /*
            {
                aiot_dm_msg_t msg;
        
                memset(&msg, 0, sizeof(aiot_dm_msg_t));
                msg.type = AIOT_DMMSG_ASYNC_SERVICE_REPLY;
                msg.data.async_service_reply.msg_id = recv->data.async_service_invoke.msg_id;
                msg.data.async_service_reply.code = 200;
                msg.data.async_service_reply.service_id = "ToggleLightSwitch";
                msg.data.async_service_reply.data = "{\"dataA\": 20}";
                int32_t res = aiot_dm_send(dm_handle, &msg);
                if (res < 0) {
                    printf("aiot_dm_send gagal\r\n");
                }
            }
            */
        }
    • Custom data format

      • Operasi untuk memanggil layanan secara asinkron berdasarkan format data biner bekerja dengan cara yang sama seperti operasi untuk mengonfigurasi properti berdasarkan format data biner. Untuk informasi lebih lanjut, lihat Uraikan pesan yang dikirim ke topik kustom.

      • Kode contoh berikut menunjukkan cara memanggil layanan secara sinkron berdasarkan format data biner:

        static void demo_dm_recv_raw_sync_service_invoke(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata)
        {
            printf("demo_dm_recv_raw_sync_service_invoke raw sync service rrpc_id = %s, data_len = %d\r\n",
                    recv->data.raw_service_invoke.rrpc_id,
                    recv->data.raw_service_invoke.data_len);
        
            /* TODO: Contoh berikut menunjukkan cara mengembalikan respons setelah IoT Platform mengirimkan perintah untuk memanggil layanan secara sinkron. Untuk menjalankan kode contoh, hapus komentar dari kode contoh.*/
            /*
            {
                aiot_dm_msg_t msg;
                uint8_t raw_data[] = {0x01, 0x02};
        
                memset(&msg, 0, sizeof(aiot_dm_msg_t));
                msg.type = AIOT_DMMSG_RAW_SERVICE_REPLY;
                msg.data.raw_service_reply.rrpc_id = recv->data.raw_service_invoke.rrpc_id;
                msg.data.raw_data.data = raw_data;
                msg.data.raw_data.data_len = sizeof(raw_data);
                aiot_dm_send(dm_handle, &msg);
            }
            */
        }

Langkah 7: Tutup koneksi

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 membangun 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: Keluar dari program

Panggil operasi aiot_dm_deinit untuk menghapus instance klien data-model dan melepaskan sumber daya yang sesuai.

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

Apa yang harus dilakukan selanjutnya

  • Setelah mengonfigurasi file kode contoh, kompilasi file tersebut untuk menghasilkan file yang dapat dieksekusi. Dalam contoh ini, file yang dapat dieksekusi ./output/data-model-basic-demo dihasilkan.

    Untuk informasi lebih lanjut, lihat Siapkan lingkungan.

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