數據壓縮功能支持設備與物聯網平臺之間的消息傳輸,壓縮數據,從而節約設備流量、提高傳輸速度。本文介紹數據壓縮功能的使用。
前提條件
使用限制
數據壓縮僅支持尊享型企業版實例和標準型企業版實例。更多信息,請參見購買企業版實例。
背景信息
部分物聯網設備使用的是蜂窩網絡,流量成本比較高。數據壓縮功能通過對傳輸的數據進行壓縮,以達到節約流量的目的。
數據壓縮通信的詳細說明,請參見數據壓縮。
直連設備
設置壓縮和解壓縮的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) {
}
});