IoT Platform のデータ圧縮機能を使用すると、IoT Platform とデバイス間で圧縮データを送信できます。送信するメッセージを圧縮して、デバイストラフィックを削減し、送信速度を向上させることができます。このトピックでは、データ圧縮機能の使用方法について説明します。
前提条件
制限事項
データ圧縮機能は、排他的 Enterprise Edition インスタンスと標準 Enterprise Edition インスタンスでのみ使用できます。詳細については、「Enterprise Edition インスタンスを購入する」をご参照ください。
背景情報
多くの IoT デバイスはセルラーネットワークを使用しており、トラフィックコストが高くなります。データ圧縮機能を使用して、送信するデータを圧縮することで、トラフィックとコストを削減できます。
データの圧縮および送信方法の詳細については、「データ圧縮」をご参照ください。
直接接続デバイス
圧縮および展開のトピックを指定する
次のサンプルコードでは、以下のとおりです。
compTopicList: サーバーがデバイスにメッセージを配信するために使用するトピックを指定します。サーバーはデータを圧縮し、デバイスはデータを展開します。decompTopicList: デバイスがサーバーにメッセージを送信するために使用するトピックを指定します。デバイスはデータを圧縮し、サーバーはデータを展開します。hit data compression caseデバッグログはデバイス上に生成されます。
設定された圧縮および展開のリレーションシップはサーバーに保存されます。トピックの圧縮および展開操作をキャンセルするには、デバイス SDK で圧縮および展開をキャンセルする必要があります。
サーバーで圧縮および展開操作が無効になっていない状態で、デバイスがデータ圧縮をサポートしていない SDK を使用して IoT Platform に接続すると、サーバーとデバイス間の通信に問題が発生する可能性があります。
compTopicListパラメーターに/sys/${productKey}/${deviceName}/thing/dsltemplate/get_replyトピックを指定することはできません。指定すると、デバイス SDK が初期化に失敗する可能性があります。データの圧縮および展開にワイルドカード文字を含むトピックを指定することはできません。
// サーバーがデータを圧縮し、デバイスがデータを展開するときに使用されるトピックを指定します。
String compTopic = "/" + deviceInfoData.productKey + "/" + deviceInfoData.deviceName + "/user/get";
List<String> compTopicList = new ArrayList<>();
compTopicList.add(compTopic);
// デバイスがデータを圧縮し、サーバーがデータを展開するときに使用されるトピックを指定します。
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) {
// プロパティのレポートなど、カスタムビジネスロジックを設定します。
}
@Override
public void onFailure(ARequest aRequest, AError aError) {
}
});setCompressTopics メソッドでは、以下のとおりです。
最初のパラメーターは、サーバーがデータを圧縮し、デバイスがデータを展開するときに使用されるトピックを指定します。値は
nullにすることができます。2 番目のパラメーターは、デバイスがデータを圧縮し、サーバーがデータを圧縮するときに使用されるトピックを指定します。値は
nullにすることができます。
圧縮と展開を無効にする
ICompressor compressor = LinkKit.getInstance().getCompressor();
compressor.setCompressTopics(null, null, new IConnectSendListener() {
@Override
public void onResponse(ARequest aRequest, AResponse aResponse) {
//TODO: 独自のロジック
}
@Override
public void onFailure(ARequest aRequest, AError aError) {
}
});ゲートウェイとサブデバイス
圧縮および展開のトピックを指定する
次のサンプルコードでは、以下のとおりです。
compTopicList: サーバーがデバイスにメッセージを配信するために使用するトピックを指定します。サーバーはデータを圧縮し、デバイスはデータを展開します。decompTopicList: デバイスがサーバーにメッセージを送信するために使用するトピックを指定します。デバイスはデータを圧縮し、サーバーはデータを展開します。hit data compression caseデバッグログはデバイス上に生成されます。
設定された圧縮および展開のリレーションシップはサーバーに保存されます。トピックの圧縮および展開操作をキャンセルするには、デバイス SDK で圧縮および展開をキャンセルする必要があります。
サーバーで圧縮および展開操作が無効になっていない状態で、デバイスがデータ圧縮をサポートしていない SDK を使用して IoT Platform に接続すると、サーバーとデバイス間の通信に問題が発生する可能性があります。
データの圧縮および展開にワイルドカード文字を含むトピックを指定することはできません。
ゲートウェイとそのサブデバイスは、同時に圧縮と展開を実装することはできません。
// サブデバイスが IoT Platform に接続した後にのみデータを圧縮します。
final DeviceInfo info = new DeviceInfo();
// info パラメーターを、IoT Platform に接続されているサブデバイスの説明に設定します。
// info = userSubDev.get(index);
// サーバーがデータを圧縮し、デバイスがデータを展開するときに使用されるトピックを指定します。
String compTopic = "/" + info.productKey + "/" + info.deviceName + "/user/get";
List<String> compTopicList = new ArrayList<>();
compTopicList.add(compTopic);
// デバイスがデータを圧縮し、サーバーがデータを展開するときに使用されるトピックを指定します。
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() {
// サブデバイスが IoT Platform に送信するメッセージ (デバイスプロパティなど) を指定します。
}
@Override
public void onFailed(AError aError) {
}
});圧縮と展開を無効にする
LinkKit.getInstance().getGateway().gatewaySubDeviceSetCompressTopics(info, null, null, new ISubDeviceActionListener() {
@Override
public void onSuccess() {
// サブデバイスが IoT Platform に送信するメッセージ (デバイスプロパティなど) を指定します。
}
@Override
public void onFailed(AError aError) {
}
});