数据压缩功能支持设备与物联网平台之间的消息传输,压缩数据,从而节约设备流量、提高传输速度。本文介绍数据压缩功能的使用。
前提条件
使用限制
数据压缩仅支持尊享型企业版实例和标准型企业版实例。更多信息,请参见购买企业版实例。
背景信息
部分物联网设备使用的是蜂窝网络,流量成本比较高。数据压缩功能通过对传输的数据进行压缩,以达到节约流量的目的。
数据压缩通信的详细说明,请参见数据压缩。
直连设备
设置压缩和解压缩的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) {
}
});