2.10 haas506 2.0开发教程-高级组件库-aliyunIoT(2.2版本接口有更新)

最新案例教程点击下方链接跳转,CSDN已停止更新

点击跳转HaaS506官方最新案例







案例说明

案例说明:
案例实现设备与物联网平台的连接(并进行OTA升级)。
阿里云物联网连接方式之一。
注意 :目前仅华东2(上海)地域支持设备进行一型一密免预注册认证。

关于动态注册

  • 在物联网平台为产品开启动态注册功能后,直连设备可使用一型一密安全认证方式完成动态注册,通过MQTT通信协议连接物联网平台。设备先基于TLS建立与物联网平台的连接,获取MQTT连接所需的设备密钥,再断开连接,然后重新建立MQTT连接进行通信。

  • 动态注册流程,基于MQTT通道的设备动态注册

在这里插入图片描述

关于创建产品

  • 使用物联网平台接入设备前,您需在物联网平台控制台创建产品和对应设备,获取设备证书(ProductKey、DeviceName和DeviceSecret)。
  • 产品相当于一类设备的集合,同一产品下的设备具有相同的功能。您可以根据产品批量管理设备,如定义物模型、自定义Topic等。
  • 您的每个实际设备需对应一个物联网平台设备。将物联网平台颁发的设备证书(ProductKey、DeviceName和DeviceSecret)烧录到设备上,用于设备连接物联网平台的身份验证。

阿里云平台连接

1、平台产品创建

第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。

① 登录物联网平台控制台
请添加图片描述
② 在实例概览页面,找到对应的实例,单击实例进入实例详情页面。

  • 注意 在中国地域,目前仅华东2(上海)地域开通了公共实例服务。

  • 在左侧导航栏,选择设备管理 > 产品,单击创建产品。
    请添加图片描述

  • 输入产品信息
    请添加图片描述

2、添加设备

请添加图片描述

使用IMEI号添加设备

注意:设备名称需要输入IMEI号,代码需要使用设备名称IMEI进行动态注册

请添加图片描述

  • 点击确定
    请添加图片描述

3、开启动态注册

要连接云平台必须打开动态注册按钮。在这个界面也可以查看需要复制的产品信息。

请添加图片描述

4、代码复制

  • 注意更改productKey和productSecret(176行)
  • 2.2版本获取IMEI号接口有更新,需要更改以下内容(Ctrl+F 查找modem)
# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = modem.info.getDevImei()
...

main.py

# coding=utf-8

from driver import GPIO
import network
import ujson
import utime as time
import modem
from  aliyunIoT import Device
import ota
import kv


 # ota 消息推送的接受函数
def on_trigger(data):
     global info
 # 保存服务端推送的ota信息
     info['url'] = data['url']
     info['length'] = data['length']
     info['module_name'] = data['module_name']
     info['version'] = data['version']
     info['hash'] = data['hash']
     info['hash_type'] = data['hash_type']
    # 开始ota 包下载
     dl_data = {}
     dl_data['url'] = info['url']
     dl_data['store_path'] = info['store_path']
     ota.download(dl_data)



 # ota 升级包下载结果回调函数
def on_download(data):
     global info
     if data >= 0:
         print('Ota download succeed')
     # 开始ota包校验
         param = {}
         param['length'] = info['length']
         param['store_path'] = info['store_path']
         param['hash_type'] = info['hash_type']
         param['hash'] = info['hash']
         ota.verify(param)

 # ota 升级包校验结果回调函数
def on_verify(data):
      global info
      print(data)
      if data >= 0 :
          print('Ota verify succeed')
          print('Start Upgrade')
     # 开始ota升级
          param = {}
          param['length'] = info['length']
          param['store_path'] = info['store_path']
          param['install_path'] = info['install_path']
          ota.upgrade(param)

 # ota 升级包结果回调函数
def on_upgrade(data):
     if data >= 0 :
        print('Ota succeed')
        #ota升完级后 重启设备
        reboot()
 
#当iot设备连接到物联网平台的时候触发'connect' 事件
def on_connect(data):
    global module_name,default_ver,productKey,deviceName,deviceSecret,on_trigger,on_download,on_verify,on_upgrade
    print('***** connect lp succeed****')
    data_handle = {}
    data_handle['device_handle'] = device.getDeviceHandle()

 # 初始化ota服务
    ota.init(data_handle)

 # ota 回调函数注册
    ota.on(1,on_trigger)
    ota.on(2,on_download)
    ota.on(3,on_verify)
    ota.on(4,on_upgrade)
    report_info = {
         "device_handle": data_handle['device_handle'],
         "product_key": productKey ,
         "device_name": deviceName ,
         "module_name": module_name ,
         "version": default_ver
         }
 # 上报本机ota相关信息,上报版本信息返回以后程序返回,知道后台推送ota升级包,才会调用on_trigger函数
    ota.report(report_info)    


#当连接断开时,触发'disconnect'事件
def on_disconnect():
    print('linkkit is disconnected')

#当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
     #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:
             print('网络连接成功')
             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,device_dyn_resigter_succed
    key = '_amp_customer_devicesecret'
    deviceSecretdict = kv.get(key)
    print("deviceSecretdict:",deviceSecretdict)
    if isinstance(deviceSecretdict,str):    
        deviceSecret = deviceSecretdict 

    if deviceSecretdict is None or deviceSecret is None:
        key_info = {
            'productKey': productKey  ,
            'productSecret': productSecret ,
            'deviceName': deviceName
            }
        # 动态注册一个设备,获取设备的deviceSecret
        #下面的if防止多次注册,当前若是注册过一次了,重启设备再次注册就会卡住,
        if not device_dyn_resigter_succed:
            device.register(key_info,on_dynreg_cb)   



if __name__ == '__main__':
    ICCID=None
    g_connect_status = False
    net = None
    device = None
    deviceSecret = None
    deviceName = None
    #替换productKey 和 productSecret 
    ###################################
    productKey = "a1YJLSG9zJJ"
    productSecret = "eVnp8AWcy3xpvgZQ"
    ###################################
    device_dyn_resigter_succed = False
    # 定义需要升级的模块和版本号
    module_name = 'default'
    default_ver = '1.0.0'
# 定义升级包的下载和安装路径,其中url,hash_type和hash 会通过服务端推送被保存下来

    info = {
        'url': '',
        'store_path': '/data/pyamp/app.zip',
        'install_path': '/data/pyamp/',
        'length': 0,
        'hash_type': '',
        'hash': ''
    }

    # 连接网络
    connect_network()
    # 获取设备的IMEI 作为deviceName 进行动态注册
    #2.2版本改为
    #deviceName = modem.info.getDevImei()
    deviceName = modem.getDevImei()
    #获取设备的ICCID
    ICCID=modem.sim.getIccid()
    #初始化物联网平台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_DISCONNECT,on_disconnect)
    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)

    #上报版本信息
    FwVersion={}
    FwVersion["FwVersion"]="amp-v1.16 build on 2021-11-17, 15:18:23"
    FwVersionStr=ujson.dumps(FwVersion)
    data0={
        'params':FwVersionStr
    }
    time.sleep_ms(1000)
    device.postProps(data0)
    print("FwVersionStr:",FwVersionStr)

    #将ICCID,IMEI数据放入字典
    imei_iccid={}
    imei_iccid["IMEI"]=deviceName
    imei_iccid["ICCID"]=ICCID
    #将字典转换为字符串
    imei_iccid_str=ujson.dumps(imei_iccid)
    data1={
        'params':imei_iccid_str
    }
    #10S上报一次
    time.sleep_ms(1000)
    device.postProps(data1)
    while True:
        print('当前App版本号:' + default_ver)
        print('等待Ota升级包.....')
        print('--------------------------------------------------------------------')
        time.sleep(1)

board.json



{
    "name": "haas506",
    "version": "2.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"
  }

更改productKey和productSecret

复制productKey和productSecret,粘贴到代码的指定位置
在这里插入图片描述

5、测试log

1、烧录代码
2、查看是否激活
在这里插入图片描述
3、日志输出
在这里插入图片描述

Class-aliyunIoT

aliyunIoT.device

register(data, cb)connect(data)device.on(event_type, cb)getDeviceInfo()getDeviceHandle()getNtpTime(cb(data))postProps(data)postEvent(data)postRaw(data)uploadFile(fileName, cb)subscribe(data)publish(data)unsubscribe(data)end()
设备动态注册连接物联网平台回调注册获取设备信息获取句柄NTP对时上报属性上报事件上报自定义数据上传文件订阅发布取消订阅结束
device() - 初始化
函数功能:device初始化,初始化物联网平台Device类,获取Device实例。
注意事项:请替换物联网平台申请到的产品和设备信息。确保网络以及物联网平台连接成功
参数说明:无
返回值说明: 成功,device实例;失败,None

register(data, cb) - 设备动态注册

函数功能:设备动态注册,用于一型一密设备获取deviceSecret。
注意事项:首先确保网络连接成功。确保物联网平台产品、设备创建成功 。
参数说明:
参数类型必选参数说明
datadictionary设备信息
cbfunc注册回调函数
data参数说明
参数类型必选参数说明
deviceNameString物联网平台上注册的deviceName
productKeyString物联网平台上注册的productKey
productSecretString物联网平台上注册的productSecret
regionString阿里云region,默认值:cn-shanghai
keepaliveSecint物联网平台上注册的keepaliveSec
返回值说明:成功,0; 失败,非0整数

connect(data) - 连接物联网平台

函数功能:连接物联网平台。
注意事项:确保网络连接成功。
参数说明:
参数类型必选参数说明
datadictionary设备模型
data参数说明
参数类型必选参数说明
deviceNameString物联网平台上注册的deviceName
deviceSecretString物联网平台上注册的deviceSecre
productKeyString物联网平台上注册的productKey
regionString阿里云region,默认值:cn-shanghai
keepaliveSecint物联网平台上注册的keepaliveSec
返回值说明:成功返回0, 其他表示失败

device.on(event_type, cb) - 回调注册

函数功能:注册device的回调函数,在相应事件触发时开始时触发。
注意事项:确保网络以及物联网平台连接成功
参数说明:
参数类型必选参数说明
eventint注册的事件类型
cbfuction监听事件的回调函数
事件类型说明(event)
事件说明
ON_CONNECT连接成功
ON_DISCONNECT断开连接
ON_SERVICEservice信息
ON_PROPS收到服务端的props消息
ON_CLOSE对象关闭
ON_ERROR异常
ON_SUBSCRIBEsub成功

getDeviceInfo() - 获取设备信息

函数功能:获得保存在该设备上的设备信息。
注意事项:读取之前需要首先确认设备信息是否保存过。
参数说明:无
返回值说明:成功,设备信息(deviceInfo结构,字典类型);失败,None
deviceInfo结构体说明
键值类型说明
deviceNameString物联网平台上注册的deviceName
deviceSecretString物联网平台上注册的deviceSecre
productKeyString物联网平台上注册的productKey
productSecretString物联网平台上注册的productSecret

getDeviceHandle() - 获取句柄

函数功能:获得Device实例句柄
注意事项:确保已经成功创建过Device实例。
参数说明:无
返回值说明:成功,Device实例;失败,None

getNtpTime(cb(data)) - NTP对时

函数功能:从物联网平台获得网络时间
注意事项:确保网络以及物联网平台连接成功。
参数说明
参数类型必选参数说明
cbfunc注册回调函数
返回值说明:成功,时间信息(字典类型,data) ;失败,非0整数
data结构说明
参数类型说明
yearString
monthString
dayString
secondString
msecondString毫秒
timestampint时间戳

postProps(data) - 上报属性

函数功能:上报设备属性
注意事项:确保网络以及物联网平台连接成功。
参数说明:
参数类型必选参数说明
datadictionarypayload
data参数说明
参数类型必选参数说明
paramsStringpayload
返回值说明:成功,0;失败,非0整数

postEvent(data)- 上报事件

函数功能:上报标准事件,格式见参数说明。
注意事项:确保网络以及物联网平台连接成功。
参数说明
参数类型必选参数说明
datadictionarypayload
data参数说明
参数类型必选参数说明
idString事件
paramsStringpayload
返回值说明:成功,0;失败,非0整数

postRaw(data) - 上报自定义数据

函数功能:上报自定义Raw数据。
注意事项:确保网络以及物联网平台连接成功。
参数说明:
参数类型必选参数说明
datadictionarypayload
data参数说明
参数类型必选参数说明
idString事件
paramsStringpayload
返回值说明:成功,0;失败,非0整数

uploadFile(fileName, cb) - 上传文件

函数功能:上传文件到物联网平台。
注意事项: 确保网络以及物联网平台连接成功。 文件大小需小于16MB,如超过请使用oss接口。
参数说明
参数类型必选参数说明
fileNamestr本地文件名字,包含路径名
cbfun回调函数
返回值说明:成功,uploadID(字符串类型);失败,None

uploadContent(fileName, buf, cb) - 上传数据流

函数功能:上传文件数据流,上传数据保存为指定文件文件名由参数指定。
注意事项: 确保网络以及物联网平台连接成功。 文件大小需小于16MB,超过请使用oss接口。
参数说明
参数类型必选参数说明
fileNamestr文件名字,用于在物联网云平台生成文件
bufstr待传输的数据
cbfun回调函数
返回值说明:成功,uploadID(字符串类型);失败,None

subscribe(data) - 订阅

函数功能:自定义Topic订阅
注意事项:确保网络以及物联网平台连接成功并且已经创建deveice对象。
参数说明
参数类型必选参数说明
datadictionarytpoic信息
data参数说明
参数类型必选参数说明
topicString创建时指定
qosint0,1
payloadString描述信息
返回值说明:成功,0 ;失败,非0整数

publish(data) - 发布

函数功能: 发布消息到指定topic
注意事项: 确保网络以及物联网平台连接成功并且已经创建对象。 确保已经subscribe成功。
参数说明:
参数类型必选参数说明
datadictionarytpoic信息
data参数说明
参数类型必选参数说明
topiString创建时指定
qosint0,1
payloadString描述信息
返回值说明:成功,0;失败,非0整数

unsubscribe(data) - 取消订阅

函数功能:取消自定义订阅
注意事项: 确保网络以及物联网平台连接成功。 确保已经subscribe过。
参数说明
参数类型必选参数说明
datadictionarytpoic信息
data参数说明
参数类型必选参数说明
topicString创建时指定
qosint0,1
payloadString描述信息
返回值说明:成功,0;失败,非0整数

end() - 结束

函数功能:close对象 并销毁线程资源。
参数说明:无
返回值说明:成功,0; 失败,非0整数
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值