阿里云物联网平台设备接入认证方式
认证方式可选:
- 设备密钥(常用)
- ID2
- X.509
设备密钥认证
阿里云物联网平台为创建的产品颁布了产品码(ProductKey)和产品密钥(ProductSecret),创建的设备颁布了设备名(DeviceName)和设备密钥(DeviceSecret)。设备通过这个四元组认证接入阿里云平台,根据认证方式的不同,只需使用这个四元组中的一部分。
认证方式有一机一密,一型一密预注册,一型一密免预注册和子设备动态注册。他们之间的区别如下述表格:
对比项 | 一机一密 | 一型一密预注册 | 一型一密免预注册 | 子设备动态注册 |
---|---|---|---|---|
设备端烧录信息 | ProductKey、DeviceName、DeviceSecret | ProductKey、ProductSecret | ProductKey、ProductSecret | ProductKey |
云端是否需要开启动态注册 | 无需开启,默认支持。 | 需打开动态注册开关。 | 需打开动态注册开关。 | 需打开动态注册开关。 |
是否需要提前在物联网平台创建设备,注册DeviceName | 需要,产品下DeviceName唯一。 | 需要,产品下DeviceName唯一。 | 不需要。 | 需要,确保产品下DeviceName唯一。 |
产线烧录要求 | 逐一烧录设备证书,需确保设备证书的安全性。 | 批量烧录相同的产品证书,需确保产品证书的安全存储。 | 批量烧录相同的产品证书,需确保产品证书的安全存储。 | 网关可以本地获取子设备ProductKey。将子设备ProductKey烧录在网关上。 |
安全性 | 较高 | 一般 | 一般 | 一般 |
是否有配额限制 | 有,单个产品50万上限。 | 有,单个产品50万上限。 | 有,单个产品50万上限。 | 有,单个网关最多可注册1500个子设备。 |
其他外部依赖 | 无 | 无 | 无 | 依赖网关的安全性保障。 |
设备密钥认证实战
一机一密认证实战
开发环境
- 64位 ubuntu 服务器
- python3.6
- paho mqtt 1.4.0
- aliyun iot linkkit 1.1.0 (Python)
此处选用的是阿里云 Python 版本的 SDK ,方便我们快速验证功能,环境搭建参考Python SDK - 开发环境设备。
获取 example 示例代码,并放至环境搭建的工作目录。
例程演示
例程里 mqtt_connect_TCP.py
演示了 Python SDK 使用一机一密接入阿里云物联网平台的方式,先把例程跑起来,然后再分析其具体的使用方式。
首先在云端创建产品和设备,我这里为测试LED灯
产品和test1
设备,获取该设备的设备证书 ProductKey, DeviceName 和 DeviceSecret 。
在 mqtt_connect_TCP.py
例程里将设备证书填写到相应代码处,其中 host_name
为物联网平台的 Region ID,可在地域和可用区这里找到,我这里为华东 2,查表为 cn-shanghai 。
然后在之前创建的 Python 虚拟环境中运行该程序,
可以在云端看见 test1 设备已经激活并且在线。
例程分析
该 python 例程挺简单的,首先得到了 linkkit 的一个对象,其创建对象的参数就是我们设备的设备证书和 Region ID 。
lk = linkkit.LinkKit(
host_name="cn-shanghai",
product_key="xxxxxxx",
device_name="test1",
device_secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxx")
之后注册了一系列的回调函数,能根据名称很明显地看出回调的时机。
lk.on_connect = on_connect
lk.on_disconnect = on_disconnect
lk.on_topic_message = on_topic_message
lk.on_subscribe_topic = on_subscribe_topic
lk.on_unsubscribe_topic = on_unsubscribe_topic
lk.on_publish_topic = on_publish_topic
然后配置了 matt 连接的安全模式,就开始建立连接了。
lk.config_mqtt(secure="")
lk.connect_async()
一型一密预注册实战
开发环境
- 64位 ubuntu 服务器
- python3.6
- paho mqtt 1.4.0
- aliyun iot linkkit 1.1.0 (Python)
此处选用的是阿里云 Python 版本的 SDK ,方便我们快速验证功能,环境搭建参考Python SDK - 开发环境设备。
获取 example 示例代码,并放至环境搭建的工作目录。
例程演示
例程里 dynamic_register.py
演示了 Python SDK 使用一型一密(预注册)接入阿里云物联网平台的方式,先把例程跑起来,然后再分析其具体的使用方式。
首先在云端创建产品和设备,我这里为测试LED灯
产品和test2
设备。
使用一型一密进行动态注册,需要在云端开启动态注册
功能,如下图:
然后将该设备的 product_key, product_secret 和 device_name 写入代码中,注意 device_secret 需保持空。其中 host_name
为物联网平台的 Region ID,可在地域和可用区这里找到,我这里为华东 2,查表为 cn-shanghai 。
然后在之前创建的 Python 虚拟环境中运行该程序,可以发现连接已经建立,
并且在云端可以看见 test2 设备已经激活并且在线。
例程分析
首先也是得到 linkkit 的一个对象,参数为一型一密预注册设备的认证数据,
lk = linkkit.LinkKit(
host_name="cn-shanghai",
product_key="xxxxxxxxx",
device_name="test2",
device_secret="",
product_secret="xxxxxxxxxxxxxxxxxxxxxxxx")
然后也是注册了一系列的回调函数,
lk.on_device_dynamic_register = on_device_dynamic_register
lk.on_connect = on_connect
lk.on_disconnect = on_disconnect
lk.on_topic_message = on_topic_message
lk.on_subscribe_topic = on_subscribe_topic
lk.on_unsubscribe_topic = on_unsubscribe_topic
lk.on_publish_topic = on_publish_topic
这里注意下 on_device_dynamic_register
回调函数,设备动态注册成功后 SDK 会回调该函数,
def on_device_dynamic_register(rc, value, userdata):
if rc == 0:
print("dynamic register device success, rc:%d, value:%s" % (rc, value))
else:
print("dynamic register device fail,rc:%d, value:%s" % (rc, value))
这里的 rc
为动态注册的结果,0 为成功,非 0 为失败。
若 rc
为 0,则 value
值为成功注册得到的 DeviceSecret,若 rc
为非 0,则 value
值为错误原因,均为字符串。
云平台只会提供一次 DeviceSecret,再次动态注册该设备时就会得到失败的结果,因此需要在本地持久化该 DeviceSecret ,例程里面并没有做持久化的工作,因此再次运行该例程会得到失败的结果,如下图:
最后直接建立连接:
lk.connect_async()
一型一密免预注册
TODO
一型一密免预注册认证必须使用 TLS 加密,否则不能使用。
建议采用设备的MAC地址、IMEI、SN码等作为 DeviceName 进行动态注册,避免 DeviceName 在云端冲突。
子设备动态注册
TODO