設(shè)備認證分為一機一密和一型一密兩種方式,本文介紹這兩種方式的使用場景。

認證方式

  • 一機一密:在設(shè)備上燒寫設(shè)備的ProductKey、DeviceName、DeviceSecret,然后適配相應(yīng)的HAL并調(diào)用SDK提供的函數(shù)連接物聯(lián)網(wǎng)平臺。這種方式要求對設(shè)備的產(chǎn)線工具進行一定的修改,需要對每個設(shè)備燒寫不同的DeviceName和DeviceSecret。

  • 一型一密:設(shè)備上燒寫設(shè)備的ProductKey、ProductSecret,每個設(shè)備需要具備自己的唯一標識并將該標識預(yù)先上傳到阿里云物聯(lián)網(wǎng)平臺,然后調(diào)用SDK提供的函數(shù)連接云端。這種方式每個設(shè)備上燒寫的信息是固定的ProductKey和ProductSecret。

獲取Link SDK

不同版本的Link SDK下載,請參見SDK獲取

一機一密編程

需要根據(jù)不用版本的Link SDK設(shè)置設(shè)備認證信息。
  • 在Link SDK v3.0.1中,需要實現(xiàn)下文認證信息的配置:
    • HAL_GetProductKey
    • HAL_GetDeviceName
    • HAL_GetDeviceSecret
  • 在Link SDK v3.1.0/v3.2.0中,通過IOT_Ioctl設(shè)置認證信息:
    • IOT_Ioctl(IOTX_IOCTL_SET_PRODUCT_KEY, g_product_key)
    • IOT_Ioctl(IOTX_IOCTL_SET_DEVICE_NAME, g_device_name)
    • IOT_Ioctl(IOTX_IOCTL_SET_DEVICE_SECRET, g_device_secret)
以Link SDK v3.0.1版本為例,IOT_MQTT_Construct()會調(diào)用HAL_GetProductKey()等三個HAL函數(shù)去獲取設(shè)備的身份信息,示例文件參考src\mqtt\examples\mqtt_example.c,代碼如下:
int main(int argc, char *argv[])
{
    void                   *pclient = NULL;
    int                     res = 0;
    int                     loop_cnt = 0;
    iotx_mqtt_param_t       mqtt_params;

    memset(&mqtt_params, 0x0, sizeof(mqtt_params));
    mqtt_params.handle_event.h_fp = example_event_handle;

    pclient = IOT_MQTT_Construct(&mqtt_params);
    if (NULL == pclient) {
        EXAMPLE_TRACE("MQTT construct failed");
        return -1;
    }
    ...

} 

一型一密編程

一型一密認證方法使用的流程示意圖:

一型一密示意圖
實現(xiàn)流程簡述:
  1. 設(shè)備使用ProductKey、ProductSecret和DeviceName到阿里云物聯(lián)網(wǎng)平臺獲取該設(shè)備對應(yīng)的DeviceSecret。
  2. 物聯(lián)網(wǎng)平臺的動態(tài)注冊服務(wù)將查找該設(shè)備的DeviceName是否在該ProductKey對應(yīng)的設(shè)備列表,如果該設(shè)備在列表中則返回該設(shè)備的DeviceSecret。
  3. 設(shè)備收到DeviceSecret之后,將使用一機一密的方式計算MQTT連接參數(shù)以及簽名。
  4. 設(shè)備使用計算出來的MQTT連接參數(shù)連接物聯(lián)網(wǎng)平臺。
注意
  • 您需要將獲取的DeviceSecret持久化到設(shè)備,以備后續(xù)使用。若獲取的DeviceSecret丟失可能導(dǎo)致設(shè)備無法上線等嚴重后果,物聯(lián)網(wǎng)平臺不接受已激活設(shè)備重復(fù)的動態(tài)注冊請求。
  • 使用一型一密功能,您必須對每個設(shè)備進行預(yù)注冊,即在阿里云物聯(lián)網(wǎng)平臺的控制臺上傳每個設(shè)備的DeviceName,并且在控制臺上打開對應(yīng)產(chǎn)品的動態(tài)注冊功能。

實現(xiàn)流程簡述步驟中涉及的API如下:

  • 第1步和第2步對應(yīng)用戶接口:IOT_Dynamic_Register()
  • 第3步對應(yīng)用戶接口:IOT_Sign_MQTT()
  • 第4步對應(yīng)用戶接口:IOT_MQTT_Construct()
說明
  • 當設(shè)備獲取到DeviceSecret之后再次調(diào)用IOT_Dynamic_Register()將會返回失敗,因此用戶編程時獲取到DeviceSecret之后需要將其保存到設(shè)備本地的存儲介質(zhì)中。
  • 您的程序在調(diào)用IOT_Dynamic_Register()之前應(yīng)該先調(diào)用HAL_GetDeviceSecret()查看設(shè)備是否已經(jīng)獲取到了DeviceSecret,如果已經(jīng)獲取到,則無需再次調(diào)用IOT_Dynamic_Register()
  • 詳細參數(shù)內(nèi)容,請參見功能API接口

案例說明

以Link SDK v3.0.1版本為例,一型一密功能的案例程序參考src/dynamic_register/examples/dynreg_example.c文件。

下文對其進行逐段講解:

  1. 使用一型一密功能,需要包含其頭文件dynreg_api.h
    #include <stdio.h>
    #include <string.h>
    #include "infra_types.h"
    #include "infra_defs.h"
    #include "dynreg_api.h"
  2. 準備輸入?yún)?shù)region和出入?yún)⒔Y(jié)構(gòu)體meta
    iotx_http_region_types_t region = IOTX_HTTP_REGION_SHANGHAI;
    HAL_Printf("dynreg example\n");
    
    memset(&meta,0,sizeof(iotx_dev_meta_info_t));
    HAL_GetProductKey(meta.product_key);
    HAL_GetProductSecret(meta.product_secret);
    HAL_GetDeviceName(meta.device_name);
    說明
    • 入?yún)?code class="ph codeph" id="codeph-vsc-fwr-25p">region = IOTX_CLOUD_REGION_SHANGHAI表示用華東2(上海)作為演示連接站點的場景,您可根據(jù)自身需要替換為您的使用站點,詳細信息,請參見地域和可用區(qū)
    • 入?yún)?code class="ph codeph" id="codeph-2m5-oza-xre">meta表示從本地獲取的ProductKey、ProductSecret和DeviceName。
  3. 調(diào)用一型一密的IOT_Dynamic_Register()接口獲取DeviceSecret,此接口是一型一密功能點唯一提供的用戶接口,若執(zhí)行成功,在參數(shù)meta中將填上從物聯(lián)網(wǎng)平臺成功獲取到的DeviceSecret。
    res = IOT_Dynamic_Register(region, &meta);
    if (res < 0) {
        HAL_Printf("IOT_Dynamic_Register failed\n");
        return -1;
    }
    
    HAL_Printf("\nDevice Secret: %s\n\n", meta.device_secret);

功能API接口

IOT_Dynamic_Register
  • 原型:
    int32_t IOT_Dynamic_Register(iotx_http_region_types_t region, iotx_dev_meta_info_t *meta);
  • 接口說明:根據(jù)輸入?yún)?shù)中指定的站點區(qū)域,以及ProductKey和ProductSecret,請求物聯(lián)網(wǎng)平臺為DeviceName指定的設(shè)備申請DeviceSecret。
  • 參數(shù)說明:
    參數(shù) 數(shù)據(jù)類型 方向 說明
    region iotx_http_region_types_t 輸入 設(shè)備將要工作的區(qū)域,例如華東2(上海)、亞太東北1(東京)、美國西部1(硅谷)、亞太東南1(新加坡)等,完整內(nèi)容,請參見地域和可用區(qū)
    meta iotx_dev_meta_info_t * 輸入輸出 輸入的時候帶入設(shè)備的ProductKey、ProductSecret和DeviceName,輸出的時候返回從物聯(lián)網(wǎng)平臺獲取到的DeviceSecret。
  • 返回結(jié)果:
    返回結(jié)果 說明
    =0 請求成功。
    <0 請求失敗。
IOT_MQTT_Construct
  • 原型:
    void *IOT_MQTT_Construct(iotx_mqtt_param_t *pInitParams);
  • 接口說明:初始化MQTT建連參數(shù),建立MQTT連接。
  • 參數(shù)說明:
    參數(shù) 數(shù)據(jù)類型 方向 說明
    pInitParams iotx_mqtt_param_t * 輸入 MQTT建連參數(shù)。
  • 返回結(jié)果:
    返回結(jié)果 說明
    非空對象 請求成功。
    NULL(空對象) 請求失敗。
IOT_Sign_MQTT
  • 原型:
    int32_t IOT_Sign_MQTT(iotx_mqtt_region_types_t region, iotx_dev_meta_info_t *meta, iotx_sign_mqtt_t *signout)
  • 接口說明:計算MQTT簽名。
  • 參數(shù)說明:
    參數(shù) 數(shù)據(jù)類型 方向 說明
    region iotx_http_region_types_t 輸入 設(shè)備所屬的區(qū)域。
    meta iotx_dev_meta_info_t * 輸入 簽名所需的信息,存放設(shè)備的標識字符串,包括ProductKey、DeviceName等。
    signout iotx_sign_mqtt_t * 輸出 簽名結(jié)果,包括username、password、clientid、hostname等。
  • 返回結(jié)果:
    返回結(jié)果 說明
    =0 請求成功。
    <0 請求失敗。