2.10 haas506开发教程-高级组件库-linksdk

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

linksdk Device on connect postProps postEvent end register postRaw subscribe unsubscribe publish ON_CONNECT ON_DISCONNECT ON_ERROR ON_PROPS ON_RAWDATA ON_SERVICE ON_CLOSE
  • 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成功
    参数类型说明
    regionstr区域,可以选择’cn-shanghai’
    productKeystr产品的key
    deviceNamestr产品下的设备的名称
    deviceSecretstr产品的secret
    keepaliveSecint心跳时间
    • device.postProps(data)
      • 作用:上报数据
      • 参数:data是一个字典,例如data={‘param’:‘yourdata’}
      • 返回:0成功
      • 注意:当前版本 参数的名字未统一,即上报属性数据时,参数的名字是”param“,而上报事件时参数的名字是 “params”。之后版本会统一名称。
    • device.postEvent(data)
      • 作用:上报事件
      • 参数:data为上报的事件内容,包含id和params
      • 返回:0成功
    参数类型说明
    datadict上报的事件内容,包含id和params,例如data={“id”:“xxx”,“params”:“xxxx”}
    idstr事件id
    paramsstr事件内容
    • 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()回调函数接收不到云端下发的服务数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值