Gunakan file demo ./demos/compress_basic_demo.c dalam C Link SDK untuk memanggil API Link SDK dan mengaktifkan kompresi data untuk suatu perangkat.
Informasi latar belakang
-
Untuk informasi selengkapnya tentang kompresi data, lihat Overview.
-
Kompresi data menggunakan koneksi MQTT. Untuk informasi selengkapnya tentang kode terkait MQTT, lihat Contoh penggunaan.
Langkah 1: Inisialisasi
-
Tambahkan file header.
…… …… #include "aiot_compress_api.h" …… -
Konfigurasikan dependensi dasar dan output log.
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb); -
Panggil aiot_compress_init untuk membuat instans kompresi data dan menginisialisasi parameter default.
/* Buat instans client compress dan inisialisasi parameter default. */ compress_handle = aiot_compress_init(); if (compress_handle == NULL) { demo_mqtt_stop(&mqtt_handle); printf("aiot_compress_init failed\n"); return -1; }
Langkah 2: Konfigurasi fitur
Panggil aiot_compress_setopt untuk mengonfigurasi pengaturan berikut.
-
Asosiasikan handle koneksi MQTT.
/* Asosiasikan handle MQTT. */ aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_MQTT_HANDLE, mqtt_handle); -
Tetapkan tingkat kompresi.
/* Tetapkan tingkat kompresi. Tingkat berkisar dari 1 hingga 9. Tingkat yang lebih tinggi memberikan kompresi lebih baik tetapi mengonsumsi lebih banyak memori dan waktu. */ uint8_t compress_level = 1; aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_LEVEL, &compress_level); -
Tambahkan topik untuk pesan yang berasal dari perangkat seluler (MO) yang memerlukan kompresi.
Tentukan path topik lengkap. Karakter wildcard tidak didukung.
-
Definisikan daftar tersebut.
/* TODO: Ganti ini dengan daftar topik untuk pesan yang berasal dari perangkat seluler yang ingin Anda kompresi. */ char *compr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post", }; -
Konfigurasikan daftar topik.
/* Tambahkan topik untuk pesan yang berasal dari perangkat seluler yang memerlukan kompresi. */ for(int i = 0; i < sizeof(compr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_COMPR_TOPIC, compr_list[i]); }
-
-
Tambahkan topik untuk pesan terminasi seluler (MT) yang memerlukan dekompresi.
-
Definisikan daftar tersebut.
/* TODO: Ganti ini dengan daftar topik untuk pesan terminasi seluler yang ingin Anda kompresi. */ char *decompr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update_reply", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post_reply", }; -
Konfigurasikan daftar topik.
/* Tambahkan topik untuk pesan terminasi seluler yang memerlukan dekompresi. */ for(int i = 0; i < sizeof(decompr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_DECOMPR_TOPIC, decompr_list[i]); }
-
-
Tetapkan fungsi callback untuk pelaporan daftar topik.
/* Laporkan daftar topik untuk kompresi atau dekompresi ke Platform IoT. Anda hanya perlu melaporkan daftar ini sekali. Konfigurasi tetap berlaku setelah restart. */ 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 untuk mengambil hasilnya.
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("compress update reply code %d, message %.*s\r\n", packet->data.update_reply.code, packet->data.update_reply.message_len, packet->data.update_reply.message); }
(Opsional) Langkah 3: Laporkan daftar topik kompresi
Laporkan daftar topik untuk kompresi atau dekompresi dari perangkat, dan tunggu hasilnya.
-
Setelah perangkat melaporkan daftar tersebut, konfigurasi tetap berlaku meskipun perangkat direstart.
-
Untuk memperbarui daftar topik, laporkan kembali. Platform IoT selalu menggunakan daftar terbaru yang dilaporkan.
-
Laporkan daftar topik kompresi.
aiot_compress_topiclist_update(compress_handle); -
Kode return 200 menunjukkan bahwa operasi berhasil.
if(code != 200) { demo_mqtt_stop(&mqtt_handle); aiot_compress_deinit(&compress_handle); printf("aiot_compress_topiclist_update failed\n"); return -1; }
Langkah 4: Laporkan pesan dalam daftar kompresi
Saat Anda memublikasikan pesan ke topik dalam daftar kompresi, Link SDK secara otomatis mengompresi pesan tersebut.
Panggil aiot_mqtt_pub untuk memublikasikan pesan dengan cara yang sama seperti 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: Kirimkan pesan dalam daftar terkompresi
Untuk pesan terminasi seluler yang memerlukan kompresi, Platform IoT mengompresinya sebelum dikirimkan. Link SDK secara otomatis mendekompresi pesan-pesan tersebut, dan fungsi callback menerima data yang telah didekompresi.
Panggil aiot_mqtt_recv untuk memproses pesan yang diterima. Saat pesan terkompresi tiba, Link SDK mendekompresinya dan menjalankan callback pesan.
/* Callback pemrosesan pesan MQTT default. Ini dipanggil saat SDK menerima pesan MQTT dari server dan tidak tersedia callback pengguna yang sesuai untuk memprosesnya. */
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 aiot_compress_deinit untuk menghapus instans kompresi dan melepaskan sumber daya.
/* Hapus instans COMPRESS. Bagian kode ini biasanya tidak dijalankan. */
res = aiot_compress_deinit(&compress_handle);
if (res < STATE_SUCCESS) {
demo_mqtt_stop(&mqtt_handle);
printf("aiot_compress_deinit failed: -0x%04X\n", -res);
return -1;
}
Langkah selanjutnya
-
Setelah Anda mengonfigurasi file contoh, kompilasi file tersebut untuk menghasilkan file yang dapat dieksekusi
./output/compress-basic-demo. Untuk informasi selengkapnya, lihat Kompilasi dan jalankan. -
Untuk informasi selengkapnya tentang hasil operasi, lihat Log operasional.