全部產品
Search
文件中心

:認證與串連

更新時間:Jun 30, 2024

本文介紹如何進行Python Link SDK初始化,然後建立裝置與物聯網平台的串連。

背景資訊

Python Link SDK僅支援裝置密鑰方式,進行裝置身份認證,具體包括以下幾種認證方式。

認證方式

註冊方式

說明

相關文檔

一機一密

不涉及

每台裝置燒錄自己的裝置認證(ProductKey、DeviceName和DeviceSecret)。

一機一密

一型一密

預註冊

  • 同一產品下裝置燒錄相同產品認證(ProductKey和ProductSecret)。

  • 產品需開啟動態註冊功能。

  • 裝置通過動態註冊擷取DeviceSecret。

一型一密

說明

一型一密預註冊和免預註冊的區別,請參見預註冊和免預註冊的區別

免預註冊

  • 同一產品下裝置燒錄相同產品認證(ProductKey和ProductSecret)。

  • 產品需開啟動態註冊功能。

  • 裝置通過動態註冊擷取ClientID與DeviceToken的組合。

範例程式碼

  • 一機一密

    from linkkit import linkkit
    lk = linkkit.LinkKit(
        host_name="YourHostName",
        product_key="YourProductKey",
        device_name="YourDeviceName",
        device_secret="YourDeviceSecret")          
    lk.config_mqtt(port=8883, protocol="MQTTv311", transport="TCP",
                secure="TLS", keep_alive=60, clean_session=True,
                max_inflight_message=20, max_queued_message=0,
                auto_reconnect_min_sec=1,
                auto_reconnect_max_sec=60,
                cadata=None)

    參數說明:

    參數

    樣本

    說明

    host_name

    cn-shanghai

    裝置接入的地區ID。

    product_key

    a18wP******

    裝置認證資訊。即完成添加裝置後,您儲存至本地的裝置認證。

    您也可以在物聯網平台的裝置詳情頁查看裝置的認證資訊。更多資訊,請參見擷取裝置認證資訊

    device_name

    LightSwitch

    device_secret

    uwMTmVAMnGGHaAkqmeDY6cHxxB******

    endpoint

    iot-cn-6ja******.mqtt.iothub.aliyuncs.com

    接入網域名稱。

    僅企業版執行個體和新版公用執行個體,需配置該參數。

    說明

    如使用企業版執行個體和新版公用執行個體,請刪除代碼前的注釋符號(#)。

    port

    8883

    連接埠號碼。

    protocol

    MQTTv311

    裝置與物聯網平台建立串連的協議。

    transport

    TCP

    傳輸控制通訊協定。

    secure

    TLS

    安全傳輸層協議。

    keep_alive

    60

    保活時間,單位秒,取值範圍為60~180。當裝置的心跳時間不在保活時間內,物聯網平台將拒絕裝置的串連請求。

    如果網路不穩定,建議增大該參數的值。更多資訊,請參見MQTT保活

    clean_session

    True

    設定是否接收離線訊息。取值為:

    • True:是

    • False:否

    auto_reconnect_min_sec

    1

    設定重連的最小間隔時間,單位為秒,取值範圍為1~1,200。

    auto_reconnect_max_sec

    60

    設定重連的最大間隔時間,單位為秒,取值範圍為1~1,200。

  • 一型一密預註冊

    說明

    更多代碼資訊,請參見exmaple範例程式碼中的dynamic_register.py檔案。

    import time
    from linkkit import linkkit
    import logging
    
    # config log
    __log_format = '%(asctime)s-%(process)d-%(thread)d - %(name)s:%(module)s:%(funcName)s - %(levelname)s - %(message)s'
    logging.basicConfig(format=__log_format)
    
    product_key = "${YourProductKey}"
    device_name = "${YourDeviceName}"
    product_secret = "${YourProductSecret}"
    instance_id = "${YourInstanceId}"
    device_secret = ""
    
    lk_auth = linkkit.LinkKit(
        host_name="cn-shanghai",
        product_key=product_key,
        device_name=device_name,
        device_secret="",
        auth_type="register",
        instance_id=instance_id,
        product_secret=product_secret)
    
    
    def on_device_dynamic_register(rc, value, userdata):
        if rc == 0:
            global device_secret
            print("dynamic register device success, rc:%d, value:%s" % (rc, value))
            device_secret = value
        else:
            print("dynamic register device fail,rc:%d, value:%s" % (rc, value))
    
    
    lk_auth.enable_logger(logging.DEBUG)
    lk_auth.on_device_dynamic_register = on_device_dynamic_register
    lk_auth.connect_async()
    
    # 等待下行報文,一般1s內就能返回
    time.sleep(5)
    lk_auth.destroy()

    LinkKit構造參數中傳入auth_type="register",表示一型一密預註冊,結果在回調on_device_dynamic_register中透出。當rc值為0時,表示一型一密動態註冊成功。返回的值為從物聯網平台擷取的裝置的DeviceSecret。您需將該參數的值儲存至本地,待裝置接入時使用。具體操作,請參見一機一密

    如果auth_type="",則表示一種deprecated的一型一密註冊方式,僅在華東2(上海)地區支援。更多資訊,請參見dynamic_register_deprecated.py檔案。

  • 一型一密免預註冊

    說明
    • Python Link SDK僅支援地區為華東2(上海)、華北2(北京)的裝置進行一型一密免預註冊的認證方式。

    • 更多代碼資訊,請參見exmaple範例程式碼中的dynamic_register_nwl.py檔案。

    import time
    
    from linkkit import linkkit
    import logging
    
    
    # config log
    __log_format = '%(asctime)s-%(process)d-%(thread)d - %(name)s:%(module)s:%(funcName)s - %(levelname)s - %(message)s'
    logging.basicConfig(format=__log_format)
    
    
    product_key = "${YourProductKey}"
    device_name = "${YourDeviceName}"
    product_secret = "${YourProductSecret}"
    instance_id = "${YourInstanceId}"
    
    
    lk_auth = linkkit.LinkKit(
        host_name="cn-shanghai",
        product_key=product_key,
        product_secret=product_secret,
        device_name=device_name,
        device_secret="",
        instance_id=instance_id,
        auth_type="regnwl")
    
    
    def on_device_dynamic_register_nwl_reply(code, client_id_l, user_name_l, password_l):
        print("code:", code)
        if 0 == code:
            print("cid:", client_id_l)
            print("user_name:", user_name_l)
            print("password:", password_l)
    
    
    lk_auth.enable_logger(logging.DEBUG)
    lk_auth.on_device_dynamic_register_nwl_reply = on_device_dynamic_register_nwl_reply
    lk_auth.connect_async()
    # 等待下行報文,一般1s內就能返回
    time.sleep(5)
    lk_auth.destroy()

    auth_type="regnwl"表示一型一密免預註冊。當rc值為0時,表示一型一密免預註冊動態註冊成功。返回的值為從物聯網平台擷取的裝置的usernameclientIdpassword

回呼函數

裝置與物聯網平台建立串連後,您可通過on_connect回呼函數瞭解串連結果。串連成功後,如果串連斷開,您可通過on_disconnect回呼函數,編寫業務情境所需的處理邏輯。

說明

Python Link SDK預設支援重連。當裝置串連成功後,如果裝置由於網路等原因中斷連線,裝置會根據配置的保活等參數,自動發起重新串連的請求。

範例程式碼如下:

def on_connect(session_flag, rc, userdata):
    print("on_connect:%d,rc:%d,userdata:" % (session_flag, rc))
    pass
def on_disconnect(rc, userdata):
    print("on_disconnect:rc:%d,userdata:" % rc)
lk.on_connect = on_connect
lk.on_disconnect = on_disconnect          

(可選)配置網路介面資訊

如果產品生產時,錯誤地將裝置認證資訊燒寫至多個裝置,多個裝置將會被物聯網平台認為是同一個裝置,從而出現一個裝置上線將另外一個裝置的串連斷開的情況。您可以將自己的介面資訊上傳至物聯網平台,物聯網平台可以通過該介面的資訊定位問題。

lk.config_device_info("Eth|03ACDEFF0032|Eth|03ACDEFF0031")

其中介面可取值:

網路類型

樣本值

說明

WiFi

Eth|03ACDEFF0032|Eth|03ACDEFF0031

如果裝置的上行網路介面是WiFi或者Eth(乙太網路),那麼介面需包含MAC地址,MAC地址的格式為全大寫。

Eth(乙太網路)

Cellular(蜂窩網)

Cellular|imei_001122|iccid_22334455|imsi_234241|msisdn_53212

如果是Cellular(即2G、3G、4G蜂窩網介面),那麼需要填入的介面資料為:

  • IMEI

  • ICCID

  • IMSI

  • MSISDN

啟動串連

在MQTT串連參數配置、回呼函數設定、網路介面資訊等操作完成後,您需調用connect_async發起串連。

lk.connect_async()
重要

當裝置串連成功後,如果裝置由於網路等原因中斷連線,裝置會根據配置的保活等參數,自動發起重新串連的請求。因此,您無需再次調用該介面。