Topik ini menjelaskan cara memanggil operasi API dari Link SDK untuk C guna mengimplementasikan fitur kompresi data untuk perangkat. Contoh ini menggunakan file kode sampel bernama ./demos/compress_basic_demo.c.
Informasi latar belakang
Untuk informasi lebih lanjut tentang fitur kompresi data, lihat Ikhtisar.
Fitur kompresi data 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 Contoh.
Langkah 1: Inisialisasi SDK
Tambahkan file header.
…… …… #include "aiot_compress_api.h" ……Tambahkan dependensi dasar dan konfigurasikan fitur keluaran log.
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);Panggil fungsi aiot_compress_init untuk membuat instance modul kompresi data dan menginisialisasi parameter default.
/* Buat instance modul kompresi data dan inisialisasi parameter default. */ compress_handle = aiot_compress_init(); if (compress_handle == NULL) { demo_mqtt_stop(&mqtt_handle); printf("aiot_compress_init gagal\n"); return -1; }
Langkah 2: Konfigurasikan fitur yang diperlukan
Panggil fungsi aiot_compress_setopt untuk melakukan langkah-langkah berikut:
Hubungkan instance modul kompresi data dengan penanganan koneksi MQTT.
/* Tentukan penanganan koneksi MQTT */ aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_MQTT_HANDLE, mqtt_handle);Tentukan tingkat kompresi.
/* Tentukan tingkat kompresi. Tingkat kompresi berkisar antara 1 hingga 9. Semakin tinggi levelnya, semakin tinggi kualitas kompresi dan semakin tinggi konsumsi memori dan waktu.*/ uint8_t compress_level = 1; aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_LEVEL, &compress_level);Tentukan topik yang menerima pesan upstream dan data yang perlu dikompresi.
Nama topik harus lengkap dan tidak boleh mengandung karakter wildcard.
Definisikan topik.
/* TODO: Ganti topik berikut dengan topik yang menerima pesan upstream dan data yang perlu dikompresi. */ char *compr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post", };Tentukan topik.
/* Tentukan topik. */ for(int i = 0; i < sizeof(compr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_COMPR_TOPIC, compr_list[i]); }
Tentukan topik yang menerima pesan downstream dan data yang perlu dikompresi.
Definisikan topik.
/* TODO: Ganti topik berikut dengan topik yang menerima pesan downstream dan data yang perlu dikompresi. */ char *decompr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update_reply", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post_reply", };Tentukan topik.
/* Tentukan topik. */ for(int i = 0; i < sizeof(decompr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_DECOMPR_TOPIC, decompr_list[i]); }
Konfigurasikan fungsi callback untuk menyerahkan topik.
/* Serahkan topik yang datanya perlu dikompresi atau dekompresi hanya sekali. Topik akan berlaku setelah Anda me-restart perangkat. */ uint32_t code = 0; aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_RECV_HANDLER, demo_update_reply); aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_USERDATA, &code);Implementasikan fungsi callback dan dapatkan hasil yang dikembalikan.
static void demo_update_reply(void *handle, const aiot_compress_recv_t *packet, void *userdata) { uint32_t *code = (uint32_t *)userdata; *code = packet->data.update_reply.code; printf("kompres pembaruan balasan kode %d, pesan %.*s\r\n", packet->data.update_reply.code, packet->data.update_reply.message_len, packet->data.update_reply.message); }
(Opsional) Langkah 3: Kirim topik yang datanya perlu dikompresi
Perangkat perlu mengirimkan topik yang datanya perlu dikompresi atau dekompresi dan menunggu hasil yang dikembalikan.
Setelah perangkat mengirimkan topik, perangkat tidak perlu mengirim ulang topik setelah Anda me-restart perangkat.
Jika perangkat perlu memperbarui topik, perangkat dapat mengirimkan topik baru. IoT Platform menggunakan batch topik terbaru.
Kirim topik yang datanya perlu dikompresi.
aiot_compress_topiclist_update(compress_handle);Kembalikan hasilnya. Kode 200 menunjukkan bahwa panggilan berhasil.
if(code != 200) { demo_mqtt_stop(&mqtt_handle); aiot_compress_deinit(&compress_handle); printf("aiot_compress_topiclist_update gagal\n"); return -1; }
Langkah 4: Kirim pesan yang ingin Anda kompres ke topik
Setelah Anda mengirimkan topik, Anda dapat mengirimkan pesan ke topik. Link SDK untuk C secara otomatis mengompresi pesan tersebut.
Panggil fungsi aiot_mqtt_pub untuk mengirimkan pesan dengan cara yang sama seperti Anda mengirimkan pesan biasa.
char *pub_topic = "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post";
char *pub_payload = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0, \"message\":\"this is a test message, this is a test message, this is a test message\"}}";
aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);Langkah 5: Kirim pesan ke topik
Jika pesan downstream perlu dikompresi, IoT Platform dapat mengompresi pesan tersebut. Link SDK untuk C mendekompresi pesan tersebut dan fungsi callback mengembalikan pesan yang telah didekompresi.
Panggil fungsi aiot_mqtt_recv untuk menerima pesan. Saat pesan yang telah didekompresi tiba, Link SDK untuk C mendekompresi pesan tersebut dan memanggil fungsi callback untuk mengembalikan pesan yang telah didekompresi.
/* Fungsi callback default yang dapat dipanggil untuk menerima pesan MQTT. Fungsi ini dipanggil ketika SDK menerima pesan MQTT dari broker MQTT dan tidak ada callback kustom yang tersedia. */
void demo_mqtt_default_recv_handler(void *handle, const aiot_mqtt_recv_t *packet, void *userdata)
{
switch (packet->type) {
....
case AIOT_MQTTRECV_PUB: {
printf("pub, qos: %d, topic: %.*s\n", packet->data.pub.qos, packet->data.pub.topic_len, packet->data.pub.topic);
printf("pub, payload: %.*s\n", packet->data.pub.payload_len, packet->data.pub.payload);
}
break;
....
}
}Langkah 6: Keluar dari program
Panggil fungsi aiot_compress_deinit untuk menghapus instance dan melepaskan sumber daya.
/* Hapus instance modul kompresi data. Pada sebagian besar kasus, kode berikut tidak dijalankan. */
res = aiot_compress_deinit(&compress_handle);
if (res < STATE_SUCCESS) {
demo_mqtt_stop(&mqtt_handle);
printf("aiot_compress_deinit gagal: -0x%04X\n", -res);
return -1;
}Apa yang harus dilakukan selanjutnya
Setelah Anda mengonfigurasi file kode sampel, kompilasi file tersebut untuk menghasilkan file yang dapat dieksekusi. Dalam contoh ini, file yang dapat dieksekusi bernama
./output/compress-basic-demodihasilkan. Untuk informasi lebih lanjut, lihat Siapkan Lingkungan Pengembangan.Untuk informasi lebih lanjut tentang hasil eksekusi, lihat Lihat Log.