Gunakan file demo ./demos/subdev_basic_demo.c dalam C Link SDK untuk memanggil API Link SDK dan menghubungkan perangkat sub ke IoT Platform melalui gateway.
Informasi latar belakang
-
Untuk informasi lebih lanjut tentang gateway dan perangkat sub, lihat Ikhtisar.
-
Gateway untuk perangkat sub harus mempertahankan koneksi persisten dengan IoT Platform. Metode koneksi sama dengan perangkat yang terhubung langsung. Untuk informasi lebih lanjut, lihat Ikhtisar koneksi MQTT.
Dalam contoh ini, informasi otentikasi identitas untuk perangkat gateway adalah sebagai berikut:
ProductKey
DeviceName
DeviceSecret
a18wP******
LightSwitchGW
uwMTmVAMnGGHaAkqmeDY6cHxxB******
Langkah 1: Inisialisasi
-
Tambahkan file header.
…… …… #include "aiot_subdev_api.h" Konfigurasikan dependensi tingkat bawah dan output log.
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);-
Panggil aiot_subdev_init untuk membuat instans client
subdevdan menginisialisasi parameter default.subdev_handle = aiot_subdev_init(); if (subdev_handle == NULL) { printf("aiot_subdev_init failed\n"); demo_mqtt_stop(&mqtt_handle); return -1; }
Langkah 2: Konfigurasi fitur
Panggil aiot_subdev_setopt untuk mengonfigurasi fitur-fitur berikut.
-
Kaitkan handle koneksi MQTT.
PentingSebelum mengonfigurasi parameter fitur gateway dan perangkat sub, pastikan Anda telah mengonfigurasi informasi otentikasi identitas untuk gateway. Untuk informasi lebih lanjut, lihat Konfigurasi parameter koneksi untuk MQTT.
-
Kode contoh:
aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_MQTT_HANDLE, mqtt_handle); -
Parameter:
Item konfigurasi
Contoh
Deskripsi
AIOT_SUBDEVOPT_MQTT_HANDLE
mqtt_handle
Fitur gateway dan perangkat sub bergantung pada koneksi MQTT. Gunakan item konfigurasi ini untuk mengaitkan handle koneksi MQTT.
-
-
Konfigurasikan callback pesan untuk fitur gateway dan perangkat sub.
-
Konfigurasikan fungsi callback pesan.
-
Kode contoh:
aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_RECV_HANDLER, demo_subdev_recv_handler); -
Parameter:
Item konfigurasi
Nilai contoh
Deskripsi
AIOT_SUBDEVOPT_RECV_HANDLER
demo_subdev_recv_handler
Saat perangkat menerima pesan gateway atau perangkat sub dari IoT Platform, fungsi callback ini dipicu untuk memprosesnya.
-
-
Definisikan fungsi callback pesan.
Untuk informasi tentang format data Alink untuk pesan, lihat Kelola hubungan topologi dan Status online dan offline perangkat sub.
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
-
Dapatkan informasi otentikasi perangkat sub.
Buat produk dan perangkat untuk perangkat sub. Saat membuat produk, atur tipe node menjadi Gateway Sub-device. Misalnya, buat produk perangkat sub dan tambahkan empat perangkat sub.
Nama Produk
ProductKey
DeviceName
DeviceSecret
ProductSecret
LightSwitchSD
a13FN******
LightSwitch_SubDev_01
768XBgQwgOakz3K4uhOiLeeh9x******
y7GSILD480******
LightSwitch_SubDev_02
iwTZrbjbgNVChfuJkihjE5asek******
LightSwitch_SubDev_03
fdutq35iKMYdcWWBuIINY26hsN******
LightSwitch_SubDev_04
HCKv50YqgwdKhy5cE0Vz4aydmK******
Untuk informasi lebih lanjut, lihat Buat produk dan Buat perangkat.
-
Definisikan variabel
g_subdevuntuk informasi otentikasi perangkat sub.Kode contoh telah menetapkan informasi otentikasi untuk empat perangkat sub. Di lingkungan produksi, tulis kode Anda sendiri untuk mengambil informasi otentikasi perangkat sub. Contohnya:
- Definisikan protokol antara gateway dan perangkat sub yang memungkinkan gateway menemukan perangkat sub dan mendapatkan sertifikat perangkatnya. Produsen gateway dan perangkat sub menentukan protokol ini.
- Atau, produsen gateway dapat menyediakan metode untuk mengonfigurasi informasi sertifikat perangkat sub di gateway sebelumnya.
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******" } }; -
Panggil aiot_subdev_send_topo_add untuk mengirim permintaan ke IoT Platform guna menambahkan hubungan topologi antara perangkat sub dan perangkat gateway.
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 failed, res: -0x%04X\n", -res); aiot_subdev_deinit(&subdev_handle); demo_mqtt_stop(&mqtt_handle); return -1; } -
Opsi: Jika perangkat gateway tidak lagi bertindak sebagai agen untuk perangkat sub dalam menerima pesan dari IoT Platform, panggil aiot_subdev_send_topo_delete untuk menghapus hubungan topologi antara perangkat sub dan perangkat 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 failed, res: -0x%04X\n", -res); aiot_subdev_deinit(&subdev_handle); demo_mqtt_stop(&mqtt_handle); return -1; }
Langkah 4: Login perangkat sub
-
Panggil aiot_subdev_send_batch_login untuk mengirim permintaan ke IoT Platform agar login perangkat sub secara batch. Setelah perangkat sub login menggunakan hubungan topologi yang telah dibuat, statusnya 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 failed, res: -0x%04X\n", -res); aiot_subdev_deinit(&subdev_handle); demo_mqtt_stop(&mqtt_handle); return -1; } -
Opsi: Untuk menjadikan perangkat sub offline, panggil aiot_subdev_send_batch_logout untuk mengirim permintaan ke IoT Platform. Setelah IoT Platform menerima permintaan tersebut, perangkat sub akan dijadikan offline dan statusnya berubah menjadi Offline.
PentingSaat API ini dipanggil, IoT Platform memperbarui status perangkat sub menjadi offline, sehingga mencegah gateway menerima pesan yang ditujukan untuk perangkat sub tersebut.
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 failed, res: -0x%04X\n", -res); aiot_subdev_deinit(&subdev_handle); demo_mqtt_stop(&mqtt_handle); return -1; }
Setelah perangkat sub login atau logout, IoT Platform menangani pesan berdasarkan status perangkat sub:
-
Jika perangkat sub offline, pesan
QoS=0dari IoT Platform ke perangkat sub akan segera dibuang. -
Jika perangkat sub online, IoT Platform mengirim pesan untuk perangkat sub ke gateway yang sesuai, yang kemudian meneruskannya ke perangkat sub.
Langkah 5: Berlangganan topik untuk perangkat sub
Setelah perangkat sub terhubung ke IoT Platform melalui gateway, panggil aiot_mqtt_sub untuk berlangganan topik perangkat sub dan menerima pesan darinya.
Saat berlangganan topik, bedakan antara ProductKey dan DeviceName perangkat sub dan gateway. Pastikan Anda berlangganan topik perangkat yang benar.
-
Kode contoh:
{ 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 failed, res: -0x%04X\n", -res); return -1; } } -
Parameter:
Parameter
Contoh
Deskripsi
sub_topic
/a13FN******/LightSwitch_SubDev_01/user/get
Topik yang memiliki izin berlangganan untuk Anda. Di topik ini:
-
a13FN******adalah ProductKey perangkat sub. -
LightSwitch_SubDev_01adalah DeviceName perangkat sub.
Contoh ini menggunakan topik kustom default untuk perangkat sub agar menerima pesan dari IoT Platform.
Untuk informasi lebih lanjut tentang topik, lihat Apa itu topik?.
-
Langkah 6: Publikasikan pesan dari perangkat sub
Panggil aiot_mqtt_pub untuk mempublikasikan pesan ke topik perangkat sub tertentu.
-
Kode contoh:
{ 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 failed, res: -0x%04X\n", -res); return -1; } } -
Parameter:
Parameter
Contoh
Deskripsi
pub_topic
/a13FN******/LightSwitch_SubDev_01/user/update
Topik yang memiliki izin publikasi. Dalam topik ini:
-
a13FN******adalah ProductKey perangkat sub. -
LightSwitch_SubDev_01adalah DeviceName perangkat sub.
Contoh ini menggunakan topik kustom default untuk perangkat sub. Perangkat menggunakan topik ini untuk mempublikasikan pesan ke IoT Platform.
Untuk informasi lebih lanjut tentang topik, lihat Apa itu topik?.
pub_payload
{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}
Isi pesan yang dilaporkan ke IoT Platform.
Karena kategori topik untuk pesan contoh ini adalah kustom, format datanya juga dapat dikustomisasi.
Untuk informasi lebih lanjut tentang format data, lihat Format data.
-
Langkah 7: Putuskan koneksi gateway
MQTT biasanya digunakan untuk perangkat yang memerlukan koneksi persisten. Oleh karena itu, program biasanya tidak mencapai titik ini.
Dalam program contoh, thread utama bertanggung jawab untuk mengonfigurasi parameter dan membangun koneksi. Setelah koneksi terbentuk, thread utama dapat masuk ke mode hibernasi.
Anda dapat memanggil aiot_mqtt_disconnect untuk mengirim pesan pemutusan koneksi ke IoT Platform dan memutuskan koneksi jaringan.
res = aiot_mqtt_disconnect(mqtt_handle);
if (res < STATE_SUCCESS) {
aiot_mqtt_deinit(&mqtt_handle);
printf("aiot_mqtt_disconnect failed: -0x%04X\n", -res);
return -1;
}
Langkah 8: Keluar dari program
Panggil aiot_subdev_deinit untuk menghapus instans client subdev dan melepaskan sumber daya terkait.
res = aiot_subdev_deinit(&subdev_handle);
if (res < STATE_SUCCESS) {
printf("aiot_subdev_deinit failed: -0x%04X\n", res);
}
Langkah selanjutnya
-
Setelah mengonfigurasi file contoh, kompilasi untuk menghasilkan file yang dapat dieksekusi ./output/subdev-basic-demo.
Untuk informasi lebih lanjut, lihat Kompilasi dan jalankan.
-
Untuk informasi lebih lanjut tentang hasilnya, lihat Log operasional.