文档

数据压缩

更新时间:

数据压缩功能支持设备与物联网平台之间的消息传输,压缩数据,从而节约设备流量、提高传输速度。本文介绍数据压缩功能的使用。

前提条件

使用限制

数据压缩仅支持尊享型企业版实例标准型企业版实例。更多信息,请参见购买企业版实例

功能原理

首先,设备通过MQTT协议连接物联网平台,上报需要压缩或解压缩的Topic列表。然后,物联网平台回复后,处于列表中Topic对应的消息,就可以压缩后再通信。使用C Link SDK Extended接入,压缩或解压缩的动作由SDK执行,设备端应用程序发送或接收到的为未压缩数据。

如下功能时序图,以设备的应用程序./demos/compress_basic_demo.c为例,介绍应用程序实现该功能的流程。

image.png

步骤一:设备初始化

创建设备句柄,完成设备建连。

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;
}

步骤二:配置压缩模块

  1. 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",
    };
  2. 设置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 *));
  3. 设置压缩模块回调函数。

    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);

  • 本页导读 (1)
文档反馈