C Link SDK のデモファイル ./demos/compress_basic_demo.c を使用して、Link SDK API を呼び出し、デバイスのデータ圧縮を有効にします。
背景情報
ステップ 1: 初期化
-
ヘッダーファイルを追加します。
…… …… #include "aiot_compress_api.h" …… -
基盤となる依存関係とログ出力を設定します。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb); -
aiot_compress_init を呼び出して、データ圧縮インスタンスを作成し、デフォルトパラメータを初期化します。
/* compress クライアントインスタンスを作成し、デフォルトパラメータを初期化します。 */ compress_handle = aiot_compress_init(); if (compress_handle == NULL) { demo_mqtt_stop(&mqtt_handle); printf("aiot_compress_init failed\n"); return -1; }
ステップ 2: 機能の設定
aiot_compress_setopt を呼び出して、以下の設定を行います。
-
MQTT 接続ハンドルを関連付けます。
/* MQTT ハンドルを関連付けます。 */ aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_MQTT_HANDLE, mqtt_handle); -
圧縮レベルを設定します。
/* 圧縮レベルを設定します。レベルの範囲は 1~9 です。レベルが高いほど圧縮率は向上しますが、より多くのメモリと時間を消費します。 */ uint8_t compress_level = 1; aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_LEVEL, &compress_level); -
圧縮が必要なモバイル発信 (MO) メッセージのトピックを追加します。
完全なトピックパスを指定してください。ワイルドカード文字はサポートされていません。
-
リストを定義します。
/* TODO: ここを圧縮対象のモバイル発信メッセージのトピックリストに置き換えてください。 */ char *compr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post", }; -
トピックリストを設定します。
/* 圧縮が必要なモバイル発信メッセージのトピックを追加します。 */ for(int i = 0; i < sizeof(compr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_COMPR_TOPIC, compr_list[i]); }
-
-
展開が必要なモバイル着信 (MT) メッセージのトピックを追加します。
-
リストを定義します。
/* TODO: ここを展開対象のモバイル着信メッセージのトピックリストに置き換えてください。 */ char *decompr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update_reply", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post_reply", }; -
トピックリストを設定します。
/* 展開が必要なモバイル着信メッセージのトピックを追加します。 */ for(int i = 0; i < sizeof(decompr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_DECOMPR_TOPIC, decompr_list[i]); }
-
-
トピックリスト報告用のコールバック関数を設定します。
/* 圧縮または展開のトピックリストを IoT Platform に報告します。リストの報告は一度だけで済みます。設定は再起動後も保持されます。 */ uint32_t code = 0; aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_RECV_HANDLER, demo_update_reply); aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_USERDATA, &code);コールバック関数を実装して、結果を取得します。
static void demo_update_reply(void *handle, const aiot_compress_recv_t *packet, void *userdata) { uint32_t *code = (uint32_t *)userdata; *code = packet->data.update_reply.code; printf("compress update reply code %d, message %.*s\r\n", packet->data.update_reply.code, packet->data.update_reply.message_len, packet->data.update_reply.message); }
(オプション) ステップ 3: 圧縮トピックリストの報告
デバイスから圧縮または展開のトピックリストを報告し、結果を待ちます。
-
デバイスがリストを報告すると、設定は再起動後も保持されます。
-
トピックリストを更新するには、再度報告してください。IoT Platform は常に、最後に報告されたリストを使用します。
-
圧縮トピックリストを報告します。
aiot_compress_topiclist_update(compress_handle); -
リターンコード 200 は、操作が成功したことを示します。
if(code != 200) { demo_mqtt_stop(&mqtt_handle); aiot_compress_deinit(&compress_handle); printf("aiot_compress_topiclist_update failed\n"); return -1; }
ステップ 4: 圧縮リスト内のメッセージの報告
圧縮リスト内のトピック へメッセージをパブリッシュすると、Link SDK は自動的にメッセージを圧縮します。
aiot_mqtt_pub を呼び出して、通常のメッセージと同じ方法でメッセージをパブリッシュします。
char *pub_topic = "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post";
char *pub_payload = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0, \"message\":\"this is a test message, this is a test message, this is a test message\"}}";
aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);
ステップ 5: 圧縮リスト内のメッセージの配信
圧縮対象のモバイル着信メッセージは、IoT Platform によって配信前に圧縮されます。Link SDK はこれらのメッセージを自動的に展開し、コールバック関数で展開済みのデータを受信します。
aiot_mqtt_recv を呼び出して、受信したメッセージを処理します。圧縮されたメッセージが到着すると、Link SDK はそれを展開し、メッセージコールバックを実行します。
/* デフォルトの MQTT メッセージ処理コールバック。SDK がサーバーから MQTT メッセージを受信した際に、そのメッセージを処理するための対応するユーザーコールバックが設定されていない場合に呼び出されます。 */
void demo_mqtt_default_recv_handler(void *handle, const aiot_mqtt_recv_t *packet, void *userdata)
{
switch (packet->type) {
....
case AIOT_MQTTRECV_PUB: {
printf("pub, qos: %d, topic: %.*s\n", packet->data.pub.qos, packet->data.pub.topic_len, packet->data.pub.topic);
printf("pub, payload: %.*s\n", packet->data.pub.payload_len, packet->data.pub.payload);
}
break;
....
}
}
ステップ 6: プログラムの終了
aiot_compress_deinit を呼び出して、圧縮インスタンスを破棄し、リソースを解放します。
/* COMPRESS インスタンスを破棄します。このコード部分は通常実行されません。 */
res = aiot_compress_deinit(&compress_handle);
if (res < STATE_SUCCESS) {
demo_mqtt_stop(&mqtt_handle);
printf("aiot_compress_deinit failed: -0x%04X\n", -res);
return -1;
}