本文介紹如何進行Python Link SDK初始化,然後建立裝置與物聯網平台的串連。
背景資訊
Python Link SDK僅支援裝置密鑰方式,進行裝置身份認證,具體包括以下幾種認證方式。
認證方式 | 註冊方式 | 說明 | 相關文檔 |
一機一密 | 不涉及 | 每台裝置燒錄自己的裝置認證(ProductKey、DeviceName和DeviceSecret)。 | |
一型一密 | 預註冊 |
| 說明 一型一密預註冊和免預註冊的區別,請參見預註冊和免預註冊的區別。 |
免預註冊 |
|
範例程式碼
一機一密
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
時,表示一型一密免預註冊動態註冊成功。返回的值為從物聯網平台擷取的裝置的username
、clientId
、password
。
回呼函數
裝置與物聯網平台建立串連後,您可通過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 |
| 如果裝置的上行網路介面是WiFi或者Eth(乙太網路),那麼介面需包含MAC地址,MAC地址的格式為全大寫。 |
Eth(乙太網路) | ||
Cellular(蜂窩網) | Cellular|imei_001122|iccid_22334455|imsi_234241|msisdn_53212 | 如果是Cellular(即2G、3G、4G蜂窩網介面),那麼需要填入的介面資料為:
|
啟動串連
在MQTT串連參數配置、回呼函數設定、網路介面資訊等操作完成後,您需調用connect_async
發起串連。
lk.connect_async()
當裝置串連成功後,如果裝置由於網路等原因中斷連線,裝置會根據配置的保活等參數,自動發起重新串連的請求。因此,您無需再次調用該介面。