本文介绍如何进行Python Link SDK初始化,然后建立设备与物联网平台的连接。
背景信息
Python Link SDK仅支持设备密钥方式,进行设备身份认证,具体包括以下几种认证方式。
| 认证方式 | 注册方式 | 说明 | 相关文档 | 
| 一机一密 | 不涉及 | 每台设备烧录自己的设备证书(ProductKey、DeviceName和DeviceSecret)。 | |
| 一型一密 | 预注册 | 
 | 说明  一型一密预注册和免预注册的区别,请参见预注册和免预注册的区别。 | 
| 免预注册 | 
 | 
使用限制
- 对于物联网平台提供的Python Link SDK,默认设备采用TLS方式与物联网平台建连,使用TLS认证连接时,不支持使用IP接入。 
- 如果您是物联网卡定向流量卡用户,且运营商不支持配置域名时,可以为接入域名绑定固定IP。具体操作,请参见为接入域名绑定固定IP。 
示例代码
- 一机一密 - 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)- 参数说明: - 参数 - 示例 - 说明 - host_name - cn-shanghai - 设备接入的地域ID。 - product_key - a18wP****** - 设备认证信息。即完成添加设备后,您保存至本地的设备证书。 - 您也可以在物联网平台的设备详情页查看设备的认证信息。更多信息,请参见获取设备认证信息。 - device_name - LightSwitch - device_secret - uwMTmVAMnGGHaAkqmeDY6cHxxB****** - endpoint - iot-cn-6ja******.mqtt.iothub.aliyuncs.com - 接入域名。 - 您可在物联网平台控制台的实例详情页面,单击查看开发配置,获取设备接入域名。具体内容,请参见查看和配置实例终端节点信息(Endpoint)。 - 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。 - check_hostname - True - 在MQTT建连时,设置TLS握手时是否需要校验域名,默认为 - True,表示需要校验。- 如果 - endpoint输入的是IP地址,请将- check_hostname设置为False。
- 一型一密预注册 说明- 更多代码信息,请参见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()当设备连接成功后,如果设备由于网络等原因断开连接,设备会根据配置的保活等参数,自动发起重新连接的请求。因此,您无需再次调用该接口。