数据压缩功能支持设备与物联网平台之间的消息传输,压缩数据,从而节约设备流量、提高传输速度。本文介绍数据压缩功能的使用。
前提条件
使用限制
数据压缩仅支持尊享型企业版实例和标准型企业版实例。更多信息,请参见购买企业版实例。
功能原理
首先,设备通过MQTT协议连接物联网平台,上报需要压缩或解压缩的Topic列表。然后,物联网平台回复后,处于列表中Topic对应的消息,就可以压缩后再通信。使用C Link SDK Extended接入,压缩或解压缩的动作由SDK执行,设备端应用程序发送或接收到的为未压缩数据。
如下功能时序图,以设备的应用程序./demos/compress_basic_demo.c
为例,介绍应用程序实现该功能的流程。
步骤一:设备初始化
创建设备句柄,完成设备建连。
static void* demo_device_init(char *product_key, char *device_name, char *device_secret, char *host, uint16_t port)
{
int32_t res = STATE_SUCCESS;
/* 创建设备 */
void *device = aiot_device_create(product_key, device_name);
....
....
res = aiot_device_connect(device);
....
....
return device;
}
步骤二:配置压缩模块
Topic列表定义。
/* TODO: 替换为自己需要压缩的上行消息topic列表, topic需为全量topic,不支持通配 */ char *compr_list[] = { "/"PRODUCT_KEY"/"DEVICE_NAME"/user/update", "/sys/"PRODUCT_KEY"/"DEVICE_NAME"/thing/event/property/post", }; /* TODO: 替换为自己需要压缩的下行消息topic列表, topic需为全量topic,不支持通配 */ char *decompr_list[] = { "/"PRODUCT_KEY"/"DEVICE_NAME"/user/update_reply", "/sys/"PRODUCT_KEY"/"DEVICE_NAME"/thing/event/property/post_reply", };
设置Topic列表。
/* 设置压缩topics列表,主要包含设备上行topics */ aiot_device_compress_set_compr_list(device, compr_list, sizeof(compr_list)/sizeof(char *)); /* 设置解压缩topics列表,主要包含设备下行topics */ aiot_device_compress_set_decompr_list(device, decompr_list, sizeof(decompr_list)/sizeof(char *));
设置压缩模块回调函数。
aiot_device_compress_set_callback(device, demo_update_reply, &code);
(可选)步骤三:上报压缩Topic列表
向物联网平台上报压缩列表。设备一般只需上报一次,物联网平台会持久化存储压缩列表。
/* 向物联网平台上报压缩或解压缩topic列表,只需要上报一次,重启有效 */
aiot_device_compress_update_topic(device);
步骤四:上报压缩列表中的消息
当消息的Topic已在列表中时,您可以发布消息,C Link SDK Extended会自动完成消息的压缩。
char *pub_topic = "/sys/"PRODUCT_KEY"/"DEVICE_NAME"/thing/event/property/post";
char *pub_payload = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}";
aiot_msg_t *pub_message = aiot_msg_create_raw(pub_topic, (uint8_t *)pub_payload, strlen(pub_payload));
/* 发送消息 */
aiot_device_send_message(device, pub_message);
/* 删除消息 */
aiot_msg_delete(pub_message);
步骤五:下发压缩列表中的消息
如果下发的消息需要压缩,物联网平台会完成压缩动作,C Link SDK Extended完成消息的解压,回调函数中的数据为解压后的数据。
static void demo_msg_callback(void *device, const aiot_msg_t *message, void *userdata)
{
/* 设备接收到消息,默认只做打印处理 */
printf("[message] <<, topic: %s\n", message->topic);
printf("[message] <<, payload: %.*s\n", message->payload_lenth, message->payload);
}
步骤六:设备反初始化
/* 断开设备连接,并回收设备资源 */
demo_device_deinit(device);
文档内容是否对您有帮助?