全部產品
Search
文件中心

:HTTPS動態註冊使用樣本

更新時間:Jun 30, 2024

本文以C Link SDK中的Demo檔案./demos/dynreg_basic_demo.c為例,介紹如何調用Link SDK的API,向物聯網平台發起HTTPS協議的請求,動態註冊裝置,擷取啟用裝置所需的認證資訊

背景資訊

HTTPS動態註冊的更多資訊,請參見HTTPS動態註冊概述

步驟一:初始化

  1. 添加標頭檔。

    #include "aiot_state_api.h"
    #include "aiot_sysdep_api.h"
    #include "aiot_dynreg_api.h"
  2. 配置底層依賴和日誌輸出。

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

        dynreg_handle = aiot_dynreg_init();
        if (dynreg_handle == NULL) {
            printf("aiot_dynreg_init failed\n");
            return -1;
        }

步驟二:配置功能

調用aiot_dynreg_init,配置以下功能。

  1. 配置串連參數

  2. 配置訊息回調

  3. 更多功能的配置項,請參見HTTPS動態註冊配置項

  4. 配置串連參數

    • 範例程式碼:

          char       *url = "iot-auth.cn-shanghai.aliyuncs.com"; 
          ……
          char *product_key       = "a18wP******";
          char *product_secret    = "CpIlPVCXI7******";
          char *device_name       = "LightSwitch";
          ……
          ……
          /* 配置已連線的服務器地址。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_HOST, (void *)host);
          /* 配置已連線的服務器連接埠。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_PORT, (void *)&port);
          /* 配置裝置ProductKey。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_PRODUCT_KEY, (void *)product_key);
          /* 配置裝置ProductSecret。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_PRODUCT_SECRET, (void *)product_secret);
          /* 配置裝置DeviceName。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_DEVICE_NAME, (void *)device_name);
          /* 配置網路連接的安全憑據。 */
          aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_NETWORK_CRED, (void *)&cred);
          ……
          ……
    • 相關參數:

      參數

      樣本

      說明

      url

      iot-auth.cn-shanghai.aliyuncs.com

      HTTPS動態註冊的伺服器網域名稱。

      您可將樣本值中的cn-shanghai更改為您服務所在的地區ID,可獲得您裝置的接入網域名稱。

      請在物聯網平台控制台左上方,查看您服務所在的地區。地區ID的取值,請參見支援的地區

      本樣本使用上海地區的公用執行個體。

      說明

      不支援華北2(北京)、華南1(深圳)地區。

      product_key

      a18wP******

      在物聯網平台建立產品時,儲存的產品的ProductKey和ProductSecret。更多資訊,請參見建立產品

      product_secret

      CpIlPVCXI7******

      device_name

      LightSwitch

      裝置的名稱。在物聯網平台為產品添加裝置時,設定的DeviceName需與此參數保持一致。

      因裝置啟用時會校正DeviceName,建議您採用可以直接從裝置中讀取到的ID,如裝置的MAC地址、IMEI或SN碼等,作為DeviceName使用。

      重要

      需與物聯網平台建立裝置時設定的名稱保持一致。

  5. 配置訊息回調

    1. 配置訊息回呼函數。

      • 範例程式碼:

         int main(int argc, char *argv[])
        {
            …… 
            ……
            aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_RECV_HANDLER, (void *)demo_dynreg_recv_handler);
            aiot_dynreg_setopt(dynreg_handle, AIOT_DYNREGOPT_USERDATA, (void *)&demo_info);
            …… 
            ……
        }
      • 相關參數:

        配置項

        樣本值

        說明

        AIOT_DYNREGOPT_RECV_HANDLER

        demo_dynreg_recv_handler

        設定訊息回調。當接收訊息時,根據該回呼函數的設定,執行對應的處理。

        AIOT_DYNREGOPT_USERDATA

        &demo_info

        設定上下文。當demo_dynregmq_recv_handler被調用時,該值會被傳回。

    2. 定義訊息回呼函數。

      void demo_dynreg_recv_handler(void *handle, const aiot_dynreg_recv_t *packet, void *userdata)
      {
          demo_info_t *demo_info = (demo_info_t *)userdata;
          switch (packet->type) {
              case AIOT_DYNREGRECV_STATUS_CODE: {
                  demo_info->code = packet->data.status_code.code;
              }
              break;
              /* TODO: 回調中需儲存packet指向的空間內容,回調返回後, 這些空間會被釋放。 */
              case AIOT_DYNREGRECV_DEVICE_INFO: {
                  demo_info->device_secret = malloc(strlen(packet->data.device_info.device_secret) + 1);
                  if (demo_info->device_secret != NULL) {
                      memset(demo_info->device_secret, 0, strlen(packet->data.device_info.device_secret) + 1);
                      memcpy(demo_info->device_secret, packet->data.device_info.device_secret,
                             strlen(packet->data.device_info.device_secret));
                  }
              }
              break;
              default: {
              }
              break;
          }
      }

步驟三:發送請求

調用aiot_dynreg_send_request,根據配置串連的參數,向伺服器發起動態註冊請求。

/* 發送動態註冊請求 */
    res = aiot_dynreg_send_request(dynreg_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_dynreg_send_request failed: -0x%04X\n", -res);
        return -1;
    }

步驟四:接收應答

註冊請求訊息發送後,物聯網平台返回應答報文。裝置端調用aiot_dynreg_recv,接收應答訊息,根據訊息回呼函數,執行對應處理。

    res = aiot_dynreg_recv(dynreg_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_dynreg_recv failed: -0x%04X\n", -res);
        return -1;
    }  

常式僅做列印操作,但在實際業務環境中,您還需編寫代碼,將返回的裝置身份認證資訊,儲存至本地。每當裝置登入時,通過該認證資訊建立與物聯網平台的串連。

    if (demo_info.device_secret != NULL) {
        printf("device secret: %s\n", demo_info.device_secret);
        free(demo_info.device_secret);
    }

步驟五:退出程式

調用aiot_dynreg_deinit,銷毀dynreg用戶端執行個體,釋放資源

    res = aiot_dynregmq_deinit(&dynregmq_handle);           

後續步驟

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

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

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