全部产品
云市场

认证与连接

更新时间:2019-02-14 13:52:03

本文介绍如何初始化设备信息,建立设备与云端的连接

云端域名

阿里云IoT在多个国家与地区部署了服务器,厂商可设置设备需要连接的域名,点击此处了解可用的地域中列出的域名,默认地域为上海。

设备认证

设备的身份认证支持两种方法,不同方法需填写不同信息。

  • 若使用一机一密认证方式,需要指定host_name、product_key、device_name和device_secret

  • 若使用一型一密认证方式,需要制定host_name、product_key、device_name和product_secret,需要设置动态注册回调接口on_device_dynamic_register

说明 若使用一型一密认证方式,初始化过程中需设置一型一密动态注册接口。并在控制台开启动态注册。host_name为region信息,各区域信息可查询 https://help.aliyun.com/document_detail/40654.html

  • 一机一密
  1. from linkkit import linkkit
  2. lk = linkkit.LinkKit(
  3. host_name="cn-shanghai",
  4. product_key="xxxxxxxxxxx",
  5. device_name="nnnnnnnn",
  6. device_secret="ssssssssssssssssssssssssssssssss")

如果需要改变MQTT连接的一些默认参数,可以通过config_mqtt 指定端口等连接参数,如下所示:

  1. config_mqtt(self, port=1883, protocol="MQTTv311", transport="TCP",
  2. secure="TLS", keep_alive=60, clean_session=True,
  3. max_inflight_message=20, max_queued_message=0,
  4. auto_reconnect_min_sec=1,
  5. auto_reconnect_max_sec=60,
  6. cadata=None):

上面的代码示例中设置了端口号、安全协议、保活时间等参数。

  • 一型一密

若用户选用一型一密认证方式,首先需要动态注册过程根据ProductKey、DeviceName和ProductSecret去获取DeviceSecret,然后将DeviceSecret保存下来之后再使用一机一密方式进行设备连接。

下面是动态注册的代码示例:

  1. from linkkit import linkkit
  2. lk = linkkit.LinkKit(
  3. host_name="cn-shanghai",
  4. product_key="xxxxxxxxxxx",
  5. device_name="nnnnnnnn",
  6. device_secret="",
  7. product_secret="yyyyyyyyyyyyyyyy")
  8. lk.on_device_dynamic_register = on_device_dynamic_register
  9. def on_device_dynamic_register(rc, value, userdata):
  10. if rc == 0:
  11. print("dynamic register device success, rc:%d, value:%s" % (rc, value))
  12. else:
  13. print("dynamic register device fail,rc:%d, value:%s" % (rc, value))

当rc值为0时,动态注册成功, value 为从云端收到的deviceSecret, 需要用户将收到的device_secret存储下来。

注:

  • 如果设备已经通过动态注册方式获取到了deviceSecret,后续不能再继续使用动态注册方式去获取deviceSecret,而必须使用已获取到的deviceSecret使用一机一密方式连接阿里云IoT物联网。因此开发者需要保证deviceSecret存储的持久化,不能因为设备重启、重新安装导致deviceSecret丢失。

回调函数

设备连接云端成功后会通过on_connect回调函数通知用户,连接成功以后如果连接断开会通过on_disconnect 回调通知用户,用户可以在回调中加入自己的业务处理逻辑。

  1. lk.on_connect = on_connect
  2. lk.on_disconnect = on_disconnect
  3. def on_connect(session_flag, rc, userdata):
  4. print("on_connect:%d,rc:%d,userdata:" % (session_flag, rc))
  5. pass
  6. def on_disconnect(rc, userdata):
  7. print("on_disconnect:rc:%d,userdata:" % rc)

注:

  • 当设备连接到阿里云IoT物联网后,如果因为网络原因连接断开,SDK会自动尝试连接阿里云IoT物联网,用户无需调用API

配置网络接口信息

如果产品生产时错误的将一个三元组烧写到了多个设备,多个设备将会被物联网平台认为是同一个设备,从而出现一个设备上线将另外一个设备的连接断开的情况。用户可以将自己的接口信息上传到云端,那么云端可以通过接口的信息来进行问题定位。

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

其中接口可取值:

  • WiFi
  • Eth
  • Cellular

如果设备的上行网络接口是WiFi或者Eth(以太网),那么接口会有MAC地址,MAC地址的格式为全大写;

如果是Cellular(即2G、3G、4G蜂窝网接口),那么需要填入的接口数据为:

  • IMEI:string
  • ICCID: string
  • IMSI:string
  • MSISDN:string

填入信息格式举例:"Cellular|imei_001122|iccid_22334455|imsi_234241|msisdn_53212"

启动连接

在MQTT连接参数配置(可选),回调函数设置(必选),网络接口信息(可选)操作完成后,需要使用connect_async 调用开始进行实际的连接。

  1. lk.connect_async()

注:调用该函数之后如果因为网络处于连接断开状态导致连接失败,用户无需再次调用connect_async()、SDK会再次尝试连接云端。