本文以C Link SDK中的Demo檔案./demos/compress_basic_demo.c
為例,介紹如何調用Link SDK的API,協助您實現裝置的資料壓縮功能。
背景資訊
步驟一:初始化
添加標頭檔。
…… …… #include "aiot_compress_api.h" ……
配置底層依賴和日誌輸出。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);
調用aiot_compress_init,建立資料壓縮模組執行個體,並初始化預設參數。
/* 建立1個compress用戶端執行個體並內部初始化預設參數 */ compress_handle = aiot_compress_init(); if (compress_handle == NULL) { demo_mqtt_stop(&mqtt_handle); printf("aiot_compress_init failed\n"); return -1; }
步驟二:配置功能
調用aiot_compress_setopt, 配置以下功能。
關聯MQTT串連的控制代碼。
/* 添加關聯的MQTT控制代碼 */ aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_MQTT_HANDLE, mqtt_handle);
設定壓縮等級。
/* 設定壓縮等級,壓縮等級為1~9, 壓縮等級越高,壓縮效果越好,但記憶體和時間消耗越高 */ uint8_t compress_level = 1; aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_LEVEL, &compress_level);
添加上行訊息中需要壓縮的Topic列表。
Topic必須為完整Topic,不支援使用帶萬用字元的Topic列表。
列表定義。
/* TODO: 替換為自己需要壓縮的上行訊息topic列表 */ char *compr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post", };
配置Topic列表。
/* 添加需要壓縮的上行topic */ for(int i = 0; i < sizeof(compr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_COMPR_TOPIC, compr_list[i]); }
添加下行訊息中需要壓縮的Topic列表。
列表定義。
/* TODO: 替換為自己需要壓縮的下行訊息topic列表 */ char *decompr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update_reply", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post_reply", };
配置Topic列表。
/* 添加需要解壓縮的下行topic */ for(int i = 0; i < sizeof(decompr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_DECOMPR_TOPIC, decompr_list[i]); }
設定上報列表的回呼函數。
/* 向物聯網平台上報壓縮或解壓縮topic列表,只需要上報一次,重啟有效 */ 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);
回呼函數的實現,擷取返回的結果。
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); }
(可選)步驟三:上報壓縮Topic列表
裝置需要上報壓縮或解壓Topic列表,並等待返回結果。
說明
裝置上報成功以後,重啟無需再次上報。
如果需要更新Topic列表,可以再次上報更新,物聯網雲平台會以最新的一次上報為準。
上報壓縮Topic列表。
aiot_compress_topiclist_update(compress_handle);
返回結果,code為200時表示執行成功。
if(code != 200) { demo_mqtt_stop(&mqtt_handle); aiot_compress_deinit(&compress_handle); printf("aiot_compress_topiclist_update failed\n"); return -1; }
步驟四:上報壓縮列表中訊息
當訊息的Topic已在列表中,您發行就緒訊息,Link SDK會自動完成訊息的壓縮。
調用aiot_mqtt_pub像普通訊息一樣上報。
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);
步驟五:下發壓縮列表中的訊息
如果下發的訊息需要壓縮,物聯網平台會完成壓縮動作,Link SDK完成訊息的解壓,回呼函數中的資料為解壓後的資料。
調用aiot_mqtt_recv處理訊息接收,當有壓縮訊息到達時,Link SDK完成訊息解壓,並會執行訊息回調。
/* MQTT預設訊息處理回調, 當SDK從伺服器收到MQTT訊息時, 且無對應使用者回調處理時被調用 */
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;
....
}
}
步驟六:退出程式
調用aiot_compress_deinit, 銷毀執行個體,回收資源。
/* 銷毀COMPRESS執行個體, 一般不會運行到這裡 */
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;
}