全部產品
Search
文件中心

:使用樣本

更新時間:Jun 30, 2024

本文以C Link SDK中的Demo檔案./demos/compress_basic_demo.c為例,介紹如何調用Link SDK的API,協助您實現裝置的資料壓縮功能。

背景資訊

  • 資料壓縮功能的更多資訊,請參見概述

  • 資料壓縮基於MQTT接入,開發過程中涉及MQTT接入的代碼詳細說明,請參見使用樣本

步驟一:初始化

  1. 添加標頭檔。

    ……
    ……
    #include "aiot_compress_api.h"
    ……
  2. 配置底層依賴和日誌輸出。

    aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
    aiot_state_set_logcb(demo_state_logcb);

  3. 調用aiot_compress_init,建立資料壓縮模組執行個體,並初始化預設參數。

     /* 建立1個compress用戶端執行個體並內部初始化預設參數 */
        compress_handle = aiot_compress_init();
        if (compress_handle == NULL) {
            demo_mqtt_stop(&mqtt_handle);
            printf("aiot_compress_init failed\n");
            return -1;
        }

步驟二:配置功能

調用aiot_compress_setopt, 配置以下功能。

  1. 關聯MQTT串連的控制代碼。

    /* 添加關聯的MQTT控制代碼 */
    aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_MQTT_HANDLE, mqtt_handle);
  2. 設定壓縮等級。

     /* 設定壓縮等級,壓縮等級為1~9, 壓縮等級越高,壓縮效果越好,但記憶體和時間消耗越高 */
     uint8_t compress_level = 1;
     aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_LEVEL, &compress_level);
  3. 添加上行訊息中需要壓縮的Topic列表。

    Topic必須為完整Topic,不支援使用帶萬用字元的Topic列表。

    • 列表定義。

      /* TODO: 替換為自己需要壓縮的上行訊息topic列表 */
      char *compr_list[] = {
          "/${YourProductKey}/${YourDeviceName}/user/update",
          "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post",
      };
    • 配置Topic列表。

      /* 添加需要壓縮的上行topic */
      for(int i = 0; i < sizeof(compr_list) / sizeof(char *); i++) {
          aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_COMPR_TOPIC, compr_list[i]);
      }
  4. 添加下行訊息中需要壓縮的Topic列表。

    • 列表定義。

      /* TODO: 替換為自己需要壓縮的下行訊息topic列表 */
      char *decompr_list[] = {
          "/${YourProductKey}/${YourDeviceName}/user/update_reply",
          "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post_reply",
      };
    • 配置Topic列表。

       /* 添加需要解壓縮的下行topic */
       for(int i = 0; i < sizeof(decompr_list) / sizeof(char *); i++) {
           aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_DECOMPR_TOPIC, decompr_list[i]);
       }
  5. 設定上報列表的回呼函數。

     /* 向物聯網平台上報壓縮或解壓縮topic列表,只需要上報一次,重啟有效 */
        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);
    }

(可選)步驟三:上報壓縮Topic列表

裝置需要上報壓縮或解壓Topic列表,並等待返回結果。

說明
  • 裝置上報成功以後,重啟無需再次上報。

  • 如果需要更新Topic列表,可以再次上報更新,物聯網雲平台會以最新的一次上報為準。

  • 上報壓縮Topic列表。

    aiot_compress_topiclist_update(compress_handle);
  • 返回結果,code為200時表示執行成功。

     if(code != 200) {
            demo_mqtt_stop(&mqtt_handle);
            aiot_compress_deinit(&compress_handle);
            printf("aiot_compress_topiclist_update failed\n");
            return -1;
        }

步驟四:上報壓縮列表中訊息

當訊息的Topic已在列表中,您發行就緒訊息,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);

步驟五:下發壓縮列表中的訊息

如果下發的訊息需要壓縮,物聯網平台會完成壓縮動作,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;

	....
    }
}

步驟六:退出程式

調用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;
    }

後續步驟

  • 常式檔案配置完成後,需進行編譯,產生可執行檔./output/compress-basic-demo。更多資訊,請參見編譯與運行

  • 關於運行結果的詳細說明,請參見作業記錄