全部產品
Search
文件中心

:使用樣本

更新時間:Jun 30, 2024

本文以C Link SDK中的Demo檔案./demos/http_basic_demo為例,介紹如何調用Link SDK的API,將HTTPS協議的裝置接入物聯網平台並進行訊息收發。

背景資訊

HTTPS接入的更多資訊,請參見概述

步驟一:初始化

配置底層依賴和日誌輸出。aiot_http_init,用戶端執行個體,並初始化預設參數。

 /* 配置SDK的底層依賴 */
    aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
    /* 配置SDK的日誌輸出 */
    aiot_state_set_logcb(demo_state_logcb);
    ...
    ...

    /* 建立1個HTTPS用戶端執行個體並內部初始化預設參數 */
    http_handle = aiot_http_init();

步驟二:配置功能

調用aiot_http_setopt,配置以下功能。

  1. 配置串連參數

  2. 配置事件回調

更多功能的配置項,請參見aiot_http_option_t

  1. 配置串連參數。

    • 範例程式碼:

          char       *http_host = "iot-as-http.cn-shanghai.aliyuncs.com";
          …
          aiot_sysdep_network_cred_t cred;
          char *product_key       = "a18wP******";
          char *device_name       = "LightSwitch";
          char *device_secret     = "uwMTmVAMnGGHaAkqmeDY6cHxxB******";
          …
          …
      
          /* 配置HTTPS伺服器網域名稱。 */
          aiot_http_setopt(http_handle, AIOT_HTTPOPT_HOST, (void *)host);
          /* 設定管理員連接埠。 */
          aiot_http_setopt(http_handle, AIOT_HTTPOPT_PORT, (void *)&port);
          /* 配置裝置安全憑證。 */
          aiot_http_setopt(http_handle, AIOT_HTTPOPT_NETWORK_CRED, &cred);
          /* 配置裝置ProductKey。 */
          aiot_http_setopt(http_handle, AIOT_HTTPOPT_PRODUCT_KEY, product_key);
          /* 配置裝置DeviceName。 */
          aiot_http_setopt(http_handle, AIOT_HTTPOPT_DEVICE_NAME, device_name);
          /* 配置裝置DeviceSecret。 */
          aiot_http_setopt(http_handle, AIOT_HTTPOPT_DEVICE_SECRET, device_secret);
                                      
    • 相關參數:

      參數

      樣本

      說明

      http_host

      iot-06z00ax1o******.http.iothub.aliyuncs.com

      裝置的接入網域名稱。

      product_key

      a18wP******

      裝置認證資訊。更多資訊,請參見擷取裝置認證資訊

      本常式的身份認證方式為一機一密。

      device_name

      LightSwitch

      device_secret

      uwMTmVAMnGGHaAkqmeDY6cHxxB******

  2. 配置狀態監控。

    1. 配置狀態監控的回呼函數。

      • 範例程式碼:

            int main(int argc, char *argv[])
        {
            ...
            ...
        
            /* 配置資料到達時, SDK應調用的使用者回呼函數 */
            aiot_http_setopt(http_handle, AIOT_HTTPOPT_RECV_HANDLER, demo_http_recv_handler);
            /* 配置內部狀態變化時, SDK應調用的使用者回呼函數 */
            aiot_http_setopt(http_handle, AIOT_HTTPOPT_EVENT_HANDLER, demo_http_event_handler);
        
        }
      • 相關參數:

        配置項

        樣本值

        說明

        AIOT_HTTPOPT_RECV_HANDLER

        demo_http_recv_handler

        當裝置接收到應答報文後,觸發該函數,執行對應處理。

        AIOT_HTTPOPT_EVENT_HANDLER

        demo_http_event_handler

        當Token變化時,觸發該回呼函數,以確保Token的有效性。

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

      • 在Token變化時,觸發回呼函數,設定執行操作。

        void demo_http_event_handler(void *handle, const aiot_http_event_t *event, void *user_data)
        {
            int32_t res;
        
            /* Token失效事件處理 */
            if (event->type == AIOT_HTTPEVT_TOKEN_INVALID) {
                printf("token invalid, invoke iot_http_auth to get new token\n");
                res = aiot_http_auth(handle);
                printf("aiot_http_auth in callback, res = -0x%04x\r\n", -res);
            }
        }
      • 在讀取到網路報文時,觸發回呼函數,執行設定的處理。樣本僅做列印處理,您在編寫處理邏輯時,需考慮以下幾點。

        • 應答報文的參數說明,請參見HTTPS串連通訊

        • 正常接收報文含AIOT_HTTPRECV_STATUS_CODEAIOT_HTTPRECV_HEADER AIOT_HTTPRECV_BODY三個事件,分別表示:通訊是否成功、報文的類型和報文的包體。

        • 根據業務需要,處理狀態代碼。狀態代碼的更多資訊,請參見HTTP狀態代碼

        void demo_http_recv_handler(void *handle, const aiot_http_recv_t *packet, void *userdata)
        {
            switch (packet->type) {
                case AIOT_HTTPRECV_STATUS_CODE: {
                    /* TODO: 以下代碼如果不被注釋, SDK收到HTTPS報文時, 會通過這個使用者回調列印HTTPS狀態代碼, 如404, 200, 302等。 */
                    /* printf("status code: %d\n", packet->data.status_code.code); */
                }
                break;
        
                case AIOT_HTTPRECV_HEADER: {
                    /* TODO: 以下代碼如果不被注釋, SDK收到HTTPS報文時, 會通過該回調列印HTTPS首部, 如Content-Length等。 */
                    /* printf("key: %s, value: %s\n", packet->data.header.key, packet->data.header.value); */
                }
                break;
        
                /* TODO: 如果需要處理物聯網平台的HTTPS回應報文, 在此處修改。當前樣本僅列印回應。 */
                case AIOT_HTTPRECV_BODY: {
                    printf("%.*s\r\n", packet->data.body.len, packet->data.body.buffer);
                }
                break;
        
                default: {
                }
                break;
        
            }
        }

步驟三:請求串連

調用aiot_http_auth,根據配置串連的參數,向指定的物聯網平台HTTPS伺服器,發送身份認證請求,擷取Token。

/* 裝置認證, 擷取Token */
    res = aiot_http_auth(http_handle);
    if (res == 0) {
        printf("aiot_http_auth succeed\r\n");
    } else {
        /* 如果認證失敗, 就銷毀執行個體, 回收資源, 退出程式 */
        printf("aiot_http_auth failed, res = -0x%04x\r\n", -res);
        aiot_http_deinit(&http_handle);
        return -1;
    }

步驟四:發送訊息

調用aiot_http_send,在demo_http_post_lightswitch中,向指定Topic發送訊息。

說明
  • 常式僅列印發送的訊息。實際業務中,您需自訂函數demo_http_post_lightswitch

  • 您需刪除常式中代碼兩邊的注釋符號,以示範裝置向物聯網平台上報訊息。

  • 範例程式碼:

    int32_t demo_http_post_lightswitch(void *handle)
    {
        char data[] = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}";
        int32_t res;
    
        res = aiot_http_send(handle,
                             "/a1wAf******/LightSwitch/user/update",
                             (uint8_t *)data,
                             strlen(data));
        if (res < 0) {
            printf("aiot_http_send res = -0x%04X\r\n", -res);
            return res;
        }
        …
        …
    }
  • 相關參數:

    參數

    樣本

    說明

    data[]

    {\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}

    上報至物聯網平台的訊息內容。

    由於樣本訊息的Topic類型為自訂,因此資料格式可自訂。

    關於資料格式的更多資訊,請參見資料格式

    topic

    /a1wAf******/LightSwitch/user/update

    擁有發布許可權的Topic。其中:

    • a18wP******為裝置的ProductKey。

    • LightSwitch為裝置的DeviceName。

    裝置通過該Topic向物聯網平台發送訊息。

    關於Topic的更多資訊,請參見什麼是Topic

步驟五:接收應答

訊息發送後,物聯網平台返回應答報文。裝置端調用aiot_http_recv接收HTTPS應答資料,根據事件回呼函數,執行對應處理。

    res = aiot_http_recv(handle);
    if (res >= 0) {
        /* 成功接收到伺服器應答, 且業務應答碼為0, 說明資料上報成功 */
        return 0;
    } else {
        printf("aiot_http_recv res = -0x%04X\r\n", -res);
        return -1;
    }

步驟六:退出程式

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

    aiot_http_deinit(&http_handle);
    printf("program exit as normal return\r\n");
    printf("\r\n");

    return 0;

後續步驟

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

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

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