haas506开发教程-高级组件库-linksdk
1.动态注册
- main.py
# coding=utf-8
from driver import GPIO
import network
import ujson
import utime as time
import modem
from linksdk import Device
from driver import KV
global g_connect_status,net,device,deviceSecret,deviceName,productKey,productSecret,device_dyn_resigter_succed,cloud_led
g_connect_status= False
net= None
device = None
deviceSecret = None
deviceName = None
productKey = "a1xYQ4bUOsi"
productSecret = "uQghlUXT9AcZAvlU"
device_dyn_resigter_succed = False
cloud_led=None
#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):
print('***** connect lp succeed****')
#当iot云端下发属性设置时,触发'props'事件
def on_props(request):
print('clound req data is {}'.format(request))
#当iot云端调用设备service时,触发'service'事件
def on_service(id,request):
print('clound req id is {} , req is {}'.format(id,request))
#当设备跟iot平台通信过程中遇到错误时,触发'error'事件
def on_error(err):
print('err msg is {} '.format(err))
#网络连接的回调函数
def on_4g_cb(args):
global g_connect_status
pdp = args[0]
netwk_sta = args[1]
if netwk_sta == 1:
g_connect_status = True
else:
g_connect_status = False
#网络连接
def connect_network():
global net,on_4g_cb,g_connect_status,cloud_led
cloud_led=GPIO()
cloud_led.open('cloud_led')
#NetWorkClient该类是一个单例类,实现网络管理相关的功能,包括初始化,联网,状态信息等.
net = network.NetWorkClient()
g_register_network = False
if net._stagecode is not None and net._stagecode == 3 and net._subcode == 1:
g_register_network = True
else:
g_register_network = False
if g_register_network:
#注册网络连接的回调函数on(self,id,func); 1代表连接,func 回调函数 ;return 0 成功
net.on(1,on_4g_cb)
net.connect(None)
else:
print('网络注册失败')
while True:
if g_connect_status==False:
cloud_led.write(0)
if g_connect_status:
print('网络连接成功')
cloud_led.write(1)
break
time.sleep_ms(20)
#动态注册回调函数
def on_dynreg_cb(data):
global deviceSecret,device_dyn_resigter_succed
deviceSecret = data
device_dyn_resigter_succed = True
# 连接物联网平台
def dyn_register_device(productKey,productSecret,deviceName):
global on_dynreg_cb,device,deviceSecret
kv = KV()
key = '_amp_customer_devicesecret'
deviceSecretdict = kv.getStorageSync(key)
if deviceSecretdict is not None:
deviceSecret = deviceSecretdict[key]
if deviceSecretdict is None or deviceSecret is None:
key_info = {
'productKey': productKey ,
'productSecret': productSecret ,
'deviceName': deviceName
}
# 动态注册一个设备,获取设备的deviceSecret
device.register(key_info,on_dynreg_cb)
def main():
global g_connect_status,net,device,deviceSecret,deviceName,productKey,productSecret,device_dyn_resigter_succed,cloud_led
#连接网络
connect_network()
#获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.getDevImei()
#初始化物联网平台Device类,获取device实例
device = Device()
if deviceName is not None and len(deviceName) > 0 :
#动态注册一个设备
dyn_register_device(productKey,productSecret,deviceName)
else:
print("获取设备IMEI失败,无法进行动态注册")
while deviceSecret is None:
time.sleep(0.2)
print('动态注册成功:' + deviceSecret)
key_info = {
'region' : 'cn-shanghai' ,
'productKey': productKey ,
'deviceName': deviceName ,
'deviceSecret': deviceSecret ,
'keepaliveSec': 60
}
#打印设备信息
print(key_info)
#device.ON_CONNECT 是事件,on_connect是事件处理函数/回调函数
device.on(device.ON_CONNECT,on_connect)
device.on(device.ON_PROPS,on_props)
device.on(device.ON_SERVICE,on_service)
device.on(device.ON_ERROR,on_error)
device.connect(key_info)
if __name__=="__main__":
print("enter main")
main()
print("exit main")
- board.json
{
"name": "haas506",
"version": "1.0.0",
"io": {
"cloud_led":{
"type":"GPIO",
"port": 9,
"dir": "output",
"pull":"pulldown"
},
"serial1":{
"type":"UART",
"port":0,
"dataWidth":8,
"baudRate":115200,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
},
"serial2":{
"type":"UART",
"port":1,
"dataWidth":8,
"baudRate":115200,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
},
"serial3":{
"type":"UART",
"port":2,
"dataWidth":8,
"baudRate":115200,
"stopBits":1,
"flowControl":"disable",
"parity":"none"
}
},
"debugLevel": "ERROR"
}
- 实现步骤
(1) 阿里云物联网平台创建一个产品,在产品详情页打开产品的动态注册功能
(2)复制productKey和productSecret,粘贴到代码的指定位置
(3)在产品下添加一个设备
(4)烧录代码
(5)查看是否激活
- 日志输出
enter main
网络连接成功
动态注册成功:953c3b995b4c769c4c0391e7269c9e5a
{'deviceName': '867082058707142', 'deviceSecret': '953c3b995b4c769c4c0391e7269c9e5a', 'region': 'cn-shanghai', 'productKey': 'a1xYQ4bUOsi', 'keepaliveSec': 60}
exit main
***** connect lp succeed*
2.Class-linksdk
-
Device
- 实例化:device=linksdk.Device()
- decvice.on(event, callback)
- 作用:通过这个函数,可以设置物联网平台各个事件的处理函数
- 参数:event-需要注册的事件名称;callsback-回调函数
- 返回:0成功
- 例如:device.on(device.ON_CONNECT,on_connect),传入一个“事件–连接”,和一个“回调函数”,当连接成功后,执行回调函数on_connect()中的代码。
- device.connect(keyInfo)
- 作用:是连接物联网平台的连接函数,该函数是异步调用
- 参数:keyInfo包含region,productKey,deviceName,deviceSecret,keepaliveSec
- 返回:0成功
参数 类型 说明 region str 区域,可以选择’cn-shanghai’ productKey str 产品的key deviceName str 产品下的设备的名称 deviceSecret str 产品的secret keepaliveSec int 心跳时间 - device.postProps(data)
- 作用:上报数据
- 参数:data是一个字典,例如data={‘param’:‘yourdata’}
- 返回:0成功
- 注意:当前版本 参数的名字未统一,即上报属性数据时,参数的名字是”param“,而上报事件时参数的名字是 “params”。之后版本会统一名称。
- device.postEvent(data)
- 作用:上报事件
- 参数:data为上报的事件内容,包含id和params
- 返回:0成功
参数 类型 说明 data dict 上报的事件内容,包含id和params,例如data={“id”:“xxx”,“params”:“xxxx”} id str 事件id params str 事件内容 - device.end()
- 作用: 断开mqtt连接,销毁mqtt实例
- 返回:0成功
- device.register(keyInfo, dynamic_register_callback)
- 作用:动态注册一个设备,获取设备的deviceSecret
- 参数:keyInfo,dynamic_register_callback
- 返回:0成功
- device.postRaw(data)
- 作用:上报二进制数据
- 参数:data是一个字典,例如data={’param’:0x11}
- 返回:0成功
- device.subscribe()
- 作用:订阅topic
- 返回:0成功
- device.unsubscribe()
- 作用:退订topic
- 返回:0成功
- device.publish(data)
- 作用:发送数据给自定义的topic
- 参数:data是一个字典,例如data={“topic”:“xxx”,“payload”:“xxx”,“qos”:1}
- 返回:0成功
- device.ON_CONNECT
- 作用:事件-连接
- device.ON_DISCONNECT
- 作用:事件-断开连接连接
- device.ON_ERROR
- 作用:事件-错误
- device.ON_PROPS
- 作用:事件-上报
- device.ON_RAWDATA
- 作用:事件-数据透传(字节流数据)
- device.ON_SERVICE
- 作用:事件-服务
- device.ON_CLOSE
- 作用:事件-关闭
3.总结
本节介绍了如何使用haas506的高级组件库的linksdk模块,利用linksdk实现了设备动态注册功能。
注意:
(1)当前版本 参数的名字未统一,即上报属性时,参数的名字是”param“,而上报事件时参数的名字是 “params”。之后版本会统一名称
(2)当前版本的 服务调用未实现,即on_service()回调函数接收不到云端下发的服务数据。