このトピックでは、Link SDK for CのAPI操作を呼び出して、デバイスのデータ圧縮機能を実装する方法について説明します。 この例では、という名前のサンプルコードファイルです。/demos/compress_basic_demo.cが使用されます。
背景情報
手順1: SDKの初期化
ヘッダーファイルを追加します。
…… …… # 「aiot_compress_api.h」を含む ……基になる依存関係を追加し、ログ出力機能を設定します。
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);aiot_compress_init関数を呼び出して、データ圧縮モジュールインスタンスを作成し、デフォルトパラメーターを初期化します。
/* データ圧縮モジュールインスタンスを作成し、デフォルトパラメータを初期化します。 */ 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);アップストリームメッセージを受信し、データを圧縮する必要があるトピックを指定します。
トピックの名前は完全である必要があり、ワイルドカード文字を含めることはできません。
トピックを定義します。
/* 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]); }
ダウンストリームメッセージを受信し、データを圧縮する必要があるトピックを指定します。
トピックを定義します。
/* 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]); }
コールバックの設定 関数 トピックを送信します。
/* データを1回だけ圧縮または解凍する必要があるトピックを送信します。 トピックは、デバイスを再起動すると有効になります。 */ uint32_tコード=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 (コード!) =200) { demo_mqtt_stop(&mqtt_handle); aiot_compress_deinit(&compress_handle); printf("aiot_compress_topiclist_update failed\n"); return -1; }
ステップ4: トピックに圧縮するメッセージを送信する
トピックを送信した後、トピックにメッセージを送信できます。 Link SDK for Cは自動的にメッセージを圧縮します。
一般的なメッセージを送信するのと同じ方法でメッセージを送信するには、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\":\" これはテストメッセージです。これはテストメッセージです。これはテストメッセージです。\"}}";
aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0); ステップ5: トピックにメッセージを送信する
ダウンストリームメッセージを圧縮する必要がある場合、IoT Platformはメッセージを圧縮できます。 Link SDK for Cはメッセージを解凍し、コールバック関数は解凍されたメッセージを返します。
メッセージを受信するには、aiot_mqtt_recv関数を呼び出します。 解凍されたメッセージが到着すると、Link SDK for Cはメッセージを解凍し、コールバック関数を呼び出して解凍されたメッセージを返します。
/* MQTTメッセージを受信するために呼び出すことができるデフォルトのコールバック関数。 この関数は、SDKがMQTTブローカーからMQTTメッセージを受信し、カスタムコールバックが利用できないときに呼び出されます。 * /
void demo_mqtt_default_recv_handler(void * handle, const aiot_mqtt_recv_t * packet, void * userdata)
{
switch (packet->type) {
....
ケース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);
}
ブレーク;
....
}
}ステップ6: プログラムを終了する
aiot_compress_deinit関数を呼び出して、インスタンスを削除し、リソースを解放します。
/* データ圧縮モジュールインスタンスを削除します。 ほとんどの場合、次のコードは実行されません。 */
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;
}