数据压缩

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

前提条件

使用限制

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

背景信息

部分物联网设备使用的是蜂窝网络,流量成本比较高。数据压缩功能通过对传输的数据进行压缩,以达到节约流量的目的。

数据压缩通信的详细说明,请参见数据压缩

直连设备

设置压缩和解压缩的Topic

下述Demo中:

  • compTopic列表:指定Topic用于服务端下发消息到设备,服务端进行数据压缩,设备端要相应地进行数据解压缩。

  • decompTopic列表:指定Topic用于设备上报消息到服务端,设备端进行数据压缩,服务端要相应地进行数据解压缩,设备端会有hit data compression case的debug级别的日志。

重要
  • 已设置的压缩和解压缩关系会保存在服务端,需设备端SDK执行取消压缩和解压缩操作,才能让服务端取消对相应Topic的压缩和解压缩操作。

    如果服务端未取消压缩和解压缩操作,对应设备通过一个不支持数据压缩的SDK登录后,设备与服务端通信可能会有问题。

  • 不可以将Topic:/sys/${productKey}/${deviceName}/thing/dsltemplate/get_reply加入到compTopicList中,否则会影响SDK初始化。

  • 压缩和解压缩功能不支持使用带通配符的Topic。

//指定服务端压缩,设备端解压缩的Topic
String compTopic =  "/" + deviceInfoData.productKey + "/" + deviceInfoData.deviceName + "/user/get";
List<String> compTopicList = new ArrayList<>();
compTopicList.add(compTopic);

//指定设备端压缩,服务端解压缩的Topic
String decompTopic = "/sys/" + deviceInfoData.productKey + "/" + deviceInfoData.deviceName + "/thing/event/property/post";
List<String> decompTopicList = new ArrayList<>();
decompTopicList.add(decompTopic);

ICompressor compressor = LinkKit.getInstance().getCompressor();
compressor.setCompressTopics(compTopicList, decompTopicList, new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {

        //TODO: 用户逻辑,比如上报属性等操作
    }

    @Override
    public void onFailure(ARequest aRequest, AError aError) {

    }
});
重要

setCompressTopics方法中:

  • 第一个入参:指定服务端压缩,设备端解压缩的Topic列表,可以为null

  • 第二个入参:指定设备端压缩,服务端解压缩的Topic列表,可以为null

取消压缩和解压缩

ICompressor compressor = LinkKit.getInstance().getCompressor();
compressor.setCompressTopics(null, null, new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {

        //TODO: your logic
    }

    @Override
    public void onFailure(ARequest aRequest, AError aError) {

    }
});

网关子设备

设置压缩和解压缩的Topic

下述Demo中:

  • compTopic列表:指定Topic用于服务端下发消息到设备,服务端进行数据压缩,设备端要相应地进行数据解压缩。

  • decompTopic列表:指定Topic用于设备上报消息到服务端,设备端进行数据压缩,服务端要相应地进行数据解压缩,设备端会有hit data compression case的debug级别的日志。

重要
  • 已设置的压缩和解压缩关系会保存在服务端,需设备端SDK执行取消压缩和解压缩操作,才能让服务端取消对相应Topic的压缩和解压缩操作。

    如果服务端未取消压缩和解压缩操作,对应设备通过一个不支持数据压缩的SDK登录后,设备与服务端通信可能会有问题。

  • 压缩和解压缩功能不支持使用带通配符的Topic。

  • 网关子设备和网关设备本身,不能同时使用压缩和解压缩能力,否则会冲突。

//TODO 需要在子设备login成功后才能进行压缩的操作
final DeviceInfo info = new DeviceInfo(); 
//TODO 需要将info设置为您的某个已经login成功的子设备
// info = userSubDev.get(index);

//指定服务端压缩,设备端解压缩的Topic
String compTopic =  "/" + info.productKey + "/" + info.deviceName + "/user/get";
List<String> compTopicList = new ArrayList<>();
compTopicList.add(compTopic);

//指定设备端压缩,服务端解压缩的Topic
String decompTopic = "/sys/" + info.productKey + "/" + info.deviceName + "/thing/event/property/post";
List<String> decompTopicList = new ArrayList<>();
decompTopicList.add(decompTopic);
String detopic2 = "/" + info.productKey + "/" + info.deviceName + "/user/update";
decompTopicList.add(detopic2);

LinkKit.getInstance().getGateway().gatewaySubDeviceSetCompressTopics(info, compTopicList, decompTopicList, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        //TODO: 子设备上行消息,比如上报属性等
    }

    @Override
    public void onFailed(AError aError) {

    }
});

取消压缩和解压缩

LinkKit.getInstance().getGateway().gatewaySubDeviceSetCompressTopics(info, null, null, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        //TODO: 子设备上行消息,比如上报属性等
    }

    @Override
    public void onFailed(AError aError) {

    }
});