認(rèn)證與連接
本文介紹如何進(jìn)行Python Link SDK初始化,然后建立設(shè)備與物聯(lián)網(wǎng)平臺的連接。
背景信息
Python Link SDK僅支持設(shè)備密鑰方式,進(jìn)行設(shè)備身份認(rèn)證,具體包括以下幾種認(rèn)證方式。
認(rèn)證方式 | 注冊方式 | 說明 | 相關(guān)文檔 |
一機(jī)一密 | 不涉及 | 每臺設(shè)備燒錄自己的設(shè)備證書(ProductKey、DeviceName和DeviceSecret)。 | |
一型一密 | 預(yù)注冊 |
| 說明 一型一密預(yù)注冊和免預(yù)注冊的區(qū)別,請參見預(yù)注冊和免預(yù)注冊的區(qū)別。 |
免預(yù)注冊 |
|
使用限制
對于物聯(lián)網(wǎng)平臺提供的Python Link SDK,默認(rèn)設(shè)備采用TLS方式與物聯(lián)網(wǎng)平臺建連,使用TLS認(rèn)證連接時,不支持使用IP接入。
如果您是物聯(lián)網(wǎng)卡定向流量卡用戶,且運營商不支持配置域名時,可以為接入域名綁定固定IP。具體操作,請參見為接入域名綁定固定IP。
示例代碼
一機(jī)一密
from linkkit import linkkit lk = linkkit.LinkKit( host_name="YourHostName", product_key="YourProductKey", device_name="YourDeviceName", device_secret="YourDeviceSecret") lk.config_mqtt(endpoint="{Your Mqtt Host Url}") 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, check_hostname=True, cadata=None)
參數(shù)說明:
參數(shù)
示例
說明
host_name
cn-shanghai
設(shè)備接入的地域ID。
product_key
a18wP******
設(shè)備認(rèn)證信息。即完成添加設(shè)備后,您保存至本地的設(shè)備證書。
您也可以在物聯(lián)網(wǎng)平臺的設(shè)備詳情頁查看設(shè)備的認(rèn)證信息。更多信息,請參見獲取設(shè)備認(rèn)證信息。
device_name
LightSwitch
device_secret
uwMTmVAMnGGHaAkqmeDY6cHxxB******
endpoint
iot-cn-6ja******.mqtt.iothub.aliyuncs.com
接入域名。
您可在物聯(lián)網(wǎng)平臺控制臺的實例詳情頁面,單擊查看開發(fā)配置,獲取設(shè)備接入域名。具體內(nèi)容,請參見查看和配置實例終端節(jié)點信息(Endpoint)。
port
8883
端口號。
protocol
MQTTv311
設(shè)備與物聯(lián)網(wǎng)平臺建立連接的協(xié)議。
transport
TCP
傳輸控制協(xié)議。
secure
TLS
安全傳輸層協(xié)議。
keep_alive
60
?;顣r間,單位秒,取值范圍為60~180。當(dāng)設(shè)備的心跳時間不在?;顣r間內(nèi),物聯(lián)網(wǎng)平臺將拒絕設(shè)備的連接請求。
如果網(wǎng)絡(luò)不穩(wěn)定,建議增大該參數(shù)的值。更多信息,請參見MQTT?;?/a>。
clean_session
True
設(shè)置是否接收離線消息。取值為:
True:是
False:否
auto_reconnect_min_sec
1
設(shè)置重連的最小間隔時間,單位為秒,取值范圍為1~1,200。
auto_reconnect_max_sec
60
設(shè)置重連的最大間隔時間,單位為秒,取值范圍為1~1,200。
check_hostname
True
在MQTT建連時,設(shè)置TLS握手時是否需要校驗域名,默認(rèn)為
True
,表示需要校驗。如果
endpoint
輸入的是IP地址,請將check_hostname
設(shè)置為False。一型一密預(yù)注冊
說明更多代碼信息,請參見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內(nèi)就能返回 time.sleep(5) lk_auth.destroy()
LinkKit構(gòu)造參數(shù)中傳入
auth_type="register"
,表示一型一密預(yù)注冊,結(jié)果在回調(diào)on_device_dynamic_register
中透出。當(dāng)rc
值為0
時,表示一型一密動態(tài)注冊成功。返回的值為從物聯(lián)網(wǎng)平臺獲取的設(shè)備的DeviceSecret。您需將該參數(shù)的值儲存至本地,待設(shè)備接入時使用。具體操作,請參見一機(jī)一密。如果
auth_type=""
,則表示一種deprecated
的一型一密注冊方式,僅在華東2(上海)地域支持。更多信息,請參見dynamic_register_deprecated.py
文件。一型一密免預(yù)注冊
說明Python Link SDK僅支持地域為華東2(上海)、華北2(北京)的設(shè)備進(jìn)行一型一密免預(yù)注冊的認(rèn)證方式。
更多代碼信息,請參見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內(nèi)就能返回 time.sleep(5) lk_auth.destroy()
auth_type="regnwl"
表示一型一密免預(yù)注冊。當(dāng)rc
值為0
時,表示一型一密免預(yù)注冊動態(tài)注冊成功。返回的值為從物聯(lián)網(wǎng)平臺獲取的設(shè)備的username
、clientId
、password
。
回調(diào)函數(shù)
設(shè)備與物聯(lián)網(wǎng)平臺建立連接后,您可通過on_connect
回調(diào)函數(shù)了解連接結(jié)果。連接成功后,如果連接斷開,您可通過on_disconnect
回調(diào)函數(shù),編寫業(yè)務(wù)場景所需的處理邏輯。
Python Link SDK默認(rèn)支持重連。當(dāng)設(shè)備連接成功后,如果設(shè)備由于網(wǎng)絡(luò)等原因斷開連接,設(shè)備會根據(jù)配置的?;畹葏?shù),自動發(fā)起重新連接的請求。
示例代碼如下:
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
(可選)配置網(wǎng)絡(luò)接口信息
如果產(chǎn)品生產(chǎn)時,錯誤地將設(shè)備認(rèn)證信息燒寫至多個設(shè)備,多個設(shè)備將會被物聯(lián)網(wǎng)平臺認(rèn)為是同一個設(shè)備,從而出現(xiàn)一個設(shè)備上線將另外一個設(shè)備的連接斷開的情況。您可以將自己的接口信息上傳至物聯(lián)網(wǎng)平臺,物聯(lián)網(wǎng)平臺可以通過該接口的信息定位問題。
lk.config_device_info("Eth|03ACDEFF0032|Eth|03ACDEFF0031")
其中接口可取值:
網(wǎng)絡(luò)類型 | 示例值 | 說明 |
WiFi |
| 如果設(shè)備的上行網(wǎng)絡(luò)接口是WiFi或者Eth(以太網(wǎng)),那么接口需包含MAC地址,MAC地址的格式為全大寫。 |
Eth(以太網(wǎng)) | ||
Cellular(蜂窩網(wǎng)) | Cellular|imei_001122|iccid_22334455|imsi_234241|msisdn_53212 | 如果是Cellular(即2G、3G、4G蜂窩網(wǎng)接口),那么需要填入的接口數(shù)據(jù)為:
|
啟動連接
在MQTT連接參數(shù)配置、回調(diào)函數(shù)設(shè)置、網(wǎng)絡(luò)接口信息等操作完成后,您需調(diào)用connect_async
發(fā)起連接。
lk.connect_async()
當(dāng)設(shè)備連接成功后,如果設(shè)備由于網(wǎng)絡(luò)等原因斷開連接,設(shè)備會根據(jù)配置的?;畹葏?shù),自動發(fā)起重新連接的請求。因此,您無需再次調(diào)用該接口。