全部產品
Search
文件中心

:使用樣本

更新時間:Jun 30, 2024

本文以C Link SDK中的Demo檔案./demos/devinfo_posix_demo.c為例,介紹如何調用Link SDK的API,向物聯網平台,上報或刪除裝置標籤。

背景資訊

  • 裝置標籤功能的更多資訊,請參見概述

  • 裝置標籤功能基於MQTT接入,開發過程中涉及MQTT接入的代碼說明,請參見MQTT接入

步驟一:初始化

  1. 添加標頭檔。

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

        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. 調用aiot_devinfo_init,建立Devinfo用戶端執行個體,並初始化預設參數。

        devinfo_handle = aiot_devinfo_init();
        if (devinfo_handle == NULL) {
            demo_mqtt_stop(&mqtt_handle);
            printf("aiot_devinfo_init failed\n");
            return -1;
        }

步驟二:配置功能

調用aiot_devinfo_setopt,配置以下功能。

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

    重要

    配置裝置標籤功能參數前,請確保已配置裝置認證資訊等相關參數。具體操作,請參見MQTT配置串連參數

    • 範例程式碼:

          aiot_devinfo_setopt(devinfo_handle, AIOT_DEVINFOOPT_MQTT_HANDLE, mqtt_handle);
    • 相關參數:

      配置項

      樣本

      說明

      AIOT_DEVINFOOPT_MQTT_HANDLE

      mqtt_handle

      裝置標籤。

  2. 配置訊息回調。

    • 範例程式碼:

          aiot_devinfo_setopt(devinfo_handle, AIOT_DEVINFOOPT_RECV_HANDLER, (void *)demo_devinfo_recv_handler);
    • 相關參數:

      配置項

      樣本值

      說明

      AIOT_DEVINFOOPT_RECV_HANDLER

      demo_devinfo_recv_handler

      接收到裝置標籤相關訊息時,調用該函數。

  3. 配置狀態監控。

    1. 定義狀態監控回呼函數。

      您可以參考以下內容,編寫回呼函數的處理邏輯:

      • 如果上報標籤失敗,會返回以下事件類型:

        事件類型

        說明

        AIOT_DEVINFOEVT_INVALID_DEVINFO

        收到的應答中,裝置資訊非法,無法擷取ProductKeyDeviceName

        AIOT_DEVINFOEVT_INVALID_RESPONSE

        收到的應答中欄位不合法。

        AIOT_DEVINFOEVT_INVALID_RESPONSE_FORMAT

        收到的應答中欄位格式錯誤。

      • 範例程式碼僅做列印處理,您可根據業務需要編寫處理邏輯。

      void demo_devinfo_event_handler(void *handle, const aiot_devinfo_event_t *event, void *userdata)
      {
          switch (event->type) {
              case AIOT_DEVINFOEVT_INVALID_DEVINFO: {
                  printf("AIOT_DEVINFOEVT_INVALID_DEVINFO\n");
              }
              break;
              case AIOT_DEVINFOEVT_INVALID_RESPONSE: {
                  printf("AIOT_DEVINFOEVT_INVALID_RESPONSE\n");
              }
              break;
              case AIOT_DEVINFOEVT_INVALID_RESPONSE_FORMAT: {
                  printf("AIOT_DEVINFOEVT_INVALID_RESPONSE_FORMAT\n");
              }
              break;
              default: {
      
              }
          }
      }
    2. 配置狀態監控的回呼函數。

      • 範例程式碼:

            aiot_devinfo_setopt(devinfo_handle, AIOT_DEVINFOOPT_EVENT_HANDLER, (void *)demo_devinfo_event_handler);
      • 相關參數:

        配置項

        樣本值

        說明

        AIOT_DEVINFOOPT_EVENT_HANDLER

        demo_devinfo_event_handler

        當裝置串連狀態發生變化時,根據該回呼函數定義的處理邏輯,執行對應的處理。

步驟三:更新標籤

  1. 調用aiot_devinfo_send,根據上一步配置的參數,向物聯網平台發送更新標籤的請求。

    發送請求時,需注意:

    • 更新標籤訊息的資料結構類型為aiot_devinfo_msg_t,是aiot_devinfo_send()的入參。

    • 更新標籤訊息的類型為AIOT_DEVINFO_MSG_UPDATE

    • 樣本訊息內容說明:

      上報的訊息

      對應的Alink格式

      說明

      [
          {
              "attrKey": "testKey",
              "attrValue": "testValue"
          }
      ]
      {
        "id": "123",
        "version": "1.0",
        "sys":{
            "ack":0
        },
        "params": [
          {
              "attrKey": "testKey",
              "attrValue": "testValue"
          }
        ],
        "method": "thing.deviceinfo.update"
      }

      更新標籤的訊息的內容為JSON格式,是Alink格式資料中params的值。詳細說明,請參見上報標籤資訊

      範例程式碼更新標籤的資訊為testKey: testValue

        {
            aiot_devinfo_msg_t devinfo_update;
            char *update = "[{\"attrKey\":\"testKey\",\"attrValue\":\"testValue\"}]";
    
            memset(&devinfo_update, 0, sizeof(aiot_devinfo_msg_t));
            devinfo_update.product_key = product_key;
            devinfo_update.device_name = device_name;
            devinfo_update.type = AIOT_DEVINFO_MSG_UPDATE;
            devinfo_update.data.update.params = update;
    
            res = aiot_devinfo_send(devinfo_handle, &devinfo_update);
            if (res < STATE_SUCCESS) {
                aiot_devinfo_deinit(&devinfo_handle);
                demo_mqtt_stop(&mqtt_handle);
                return -1;
            }
            printf("aiot_devinfo_send update msg id: %d\n", res);
        }
  2. 物聯網平台接收到請求訊息後,更新裝置標籤,並返回應答報文。

  3. 裝置接收應答報文後,觸發回呼函數demo_devinfo_recv_handler,並執行對應的應答處理。

    您可以參考以下內容,編寫回呼函數的處理邏輯:

    • 應答報文的資料結構類型為aiot_devinfo_recv_t,是回呼函數的入參。

    • 應答報文訊息的類型為AIOT_DEVINFORECV_GENERIC_REPLY

    • 範例程式碼僅做列印處理。

    void demo_devinfo_recv_handler(void *handle, const aiot_devinfo_recv_t *packet, void *userdata)
    {
        switch (packet->type) {
            /* 物聯網平台對devinfo訊息的應答 */
            case AIOT_DEVINFORECV_GENERIC_REPLY: {
                printf("pk: %s, dn: %s, code: %d, msg id: %d, data: %.*s, message: %.*s\n", packet->product_key, packet->device_name,
                       packet->data.generic_reply.code, packet->data.generic_reply.msg_id, packet->data.generic_reply.data_len,
                       packet->data.generic_reply.data, packet->data.generic_reply.message_len, packet->data.generic_reply.message);
            }
            break;
            default: {
    
            }
        }
    }

(可選)步驟四:刪除標籤

  1. 裝置上報標籤後,調用aiot_devinfo_send,向物聯網平台發送一條刪除標籤的請求。

    發送請求時,需注意:

    • 刪除標籤訊息的資料結構類型為aiot_devinfo_msg_t,是aiot_devinfo_send()的入參。

    • 刪除標籤訊息的類型為AIOT_DEVINFO_MSG_DELETE

    • 樣本訊息內容說明:

      上報的訊息

      對應的Alink格式

      說明

          {
              "attrKey": "testKey"
          }
      {
        "id": "123",
        "version": "1.0",
        "sys":{
            "ack":0
        },
        "params": [
          {
              "attrKey": "testKey",
          }
        ],
        "method": "thing.deviceinfo.update"
      }

      刪除標籤的訊息的內容為JSON格式,是Alink格式資料中params的值。詳細說明,請參見刪除標籤資訊

      範例程式碼刪除的標籤為testKey

           {
              aiot_devinfo_msg_t devinfo_delete;
              char *delete = "[{\"attrKey\":\"testKey\"}]";
      
              memset(&devinfo_delete, 0, sizeof(aiot_devinfo_msg_t));
              devinfo_delete.product_key = product_key;
              devinfo_delete.device_name = device_name;
              devinfo_delete.type = AIOT_DEVINFO_MSG_DELETE;
              devinfo_delete.data.delete.params = delete;
      
              res = aiot_devinfo_send(devinfo_handle, &devinfo_delete);
              if (res < STATE_SUCCESS) {
                  aiot_devinfo_deinit(&devinfo_handle);
                  demo_mqtt_stop(&mqtt_handle);
                  return -1;
              }
              printf("aiot_devinfo_send delete msg id: %d\n", res);
          } 
  2. 物聯網平台接收到請求訊息後,刪除對應的標籤,並返回應答報文。

  3. 裝置接收應答報文後,觸發回呼函數demo_devinfo_recv_handler,並執行對應的應答處理。

    具體操作,請參見處理應答報文

步驟五:退出程式

調用aiot_devinfo_deinit,銷毀Devinfo用戶端執行個體,釋放資源。

    res = aiot_devinfo_deinit(&devinfo_handle);
    if (res < STATE_SUCCESS) {
        demo_mqtt_stop(&mqtt_handle);
        printf("aiot_devinfo_deinit failed: -0x%04X\n", -res);
        return -1;
    }

後續步驟

  • 常式檔案配置完成後,需進行編譯,產生可執行檔./demos/devinfo-posix-demo

    更多資訊,請參見編譯與運行

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