当前位置:网站首页>haas506 2.0开发教程 - 阿里云ota - pac 固件升级(仅支持2.2以上版本)
haas506 2.0开发教程 - 阿里云ota - pac 固件升级(仅支持2.2以上版本)
2022-07-05 20:41:00 【智云服】
haas506 2.0开发教程-ota - pac 固件升级
ota - pac固件升级
案例说明
- 本案例用于升级开发板固件版本,例如:将haas506 - 2.0版本升级到2.2版本。
- 案例通过阿里云OTA升级,上传 < .bin > 格式文件,实现远程硬件更新。
- 注意:升级前需要确认开发板内存充足。
1.确定开发板内存
1、查看开发板内存
打开设备管理器,找到USB port 0对应COM口,
用串口工具打开串口,输入指令 ’ AT+FSLSTPART ’ ,查看内存大小
1、显示的数字为字节大小,例如剩余空间 924500 换算为内存大小 924500/1024 → 902.83 KB 2、剩余空间要大于硬件升级包,否则会导致升级失败
- 如果内存不足使用指令’ AT+FSLSTFILE=“/data/pyamp” '查看内部文件;
- 选择多余的文件使用指令’
AT+FSDELFILE=“文件路径” '删除。例如( AT+FSDELFILE=“/data/pyamp/abc.zip”)
注意:删除内容请谨慎,删除确定可以删除的。
2.物联网平台开发
第一次使用物联网平台的读者,需要开通实例后使用物联网平台功能。也可以使用免费的公共实例进行开发,在阿里云物联网平台中,左上角选择‘华东2-上海’,点击‘公共实例’,即可开通。
1、平台产品创建可参考haas506 2.0开发教程-aliyunIoT
3、设备端开发
- 第一次使用开发板的读者可以按照haas5062.0开发教程-导学篇搭建开发环境。
- 搭建完后复制以下代码到Visual Studio Code,复制产品证书到代码相应位置。
main.py
# coding=utf-8
from driver import GPIO
import network
import ujson
import utime as time
import modem
from modem import info as infos
import modem
from aliyunIoT import Device
import ota
import kv
# 定义升级包的下载和安装路径,其中url,hash_type和hash 会通过服务端推送被保存下来
info = {
'url': '',
'store_path': '/data/pyamp/app.zip',
'install_path': '/data/pyamp/',
'length': 0,
'hash_type': '',
'hash': ''
}
# 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)
#当连接断开时,触发'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)
net.connect({
'username' : '' ,
'password' : '',
'profileidx' :1,
'ipType' : 0,
'apn' :"CMNET",
'authType' : 1
})
else:
print('network reg failed')
while True:
if g_connect_status:
print('network connect success')
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 = "a1laDtv9VrO"
productSecret = "bPbyllJ80mRX5PPy"
##############################
device_dyn_resigter_succed = False
# 定义需要升级的模块和版本号
module_name = 'default'
default_ver = 'app-1.0.1'
# 连接网络
connect_network()
# 获取设备的IMEI 作为deviceName 进行动态注册
deviceName = infos.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("can not dynamic reg")
while deviceSecret is None:
time.sleep(0.2)
print('dynamic reg success:' + 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)
for num in range(1, 5):
report_info = {
"device_handle": device.getDeviceHandle(),
"product_key": productKey,
"device_name": deviceName,
"module_name": 'default',
"version": default_ver
}
ret = ota.report(report_info)
time.sleep(1)
sys_version=infos.getDevFwVersion()
while True:
# print('等待Ota升级包.....')
print('app_version:{} ;sys_version:{}'.format(default_ver,sys_version))
time.sleep_ms(1000)
board.json
{
"name": "haas506",
"version": "1.0.0",
"io": {
"cloud_led":{
"type":"GPIO",
"port": 1,
"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"
}
调试,确定开发板驻网成功
4.ota - 硬件升级
1、平台端找到 监控运维→OTA升级→添加升级包,填写数据,点击确定
- 没有模块可以进行添加
2、点击 验证 → 选择需要升级的设备。
3、点击 查看,等待升级完成
4、升级完成后开发板会重启,串口工具会打印相应的log,版本变为2.03
边栏推荐
- Informatics Orsay all in one 1339: [example 3-4] find the post order traversal | Valley p1827 [usaco3.4] American Heritage
- Specification of protein quantitative kit for abbkine BCA method
- Abnova e (diii) (WNV) recombinant protein Chinese and English instructions
- 手机开户股票开户安全吗?我家比较偏远,有更好的开户途径么?
- 如何形成规范的接口文档
- 14、Transformer--VIT TNT BETR
- Maker education infiltrating the transformation of maker spirit and culture
- 欢迎来战,赢取丰厚奖金:Code Golf 代码高尔夫挑战赛正式启动
- CADD course learning (7) -- Simulation of target and small molecule interaction (semi flexible docking autodock)
- Duchefa MS medium contains vitamin instructions
猜你喜欢
2.8、项目管理过程基础知识
小程序页面导航
Duchefa丨MS培养基含维生素说明书
全国爱眼教育大会,2022第四届北京国际青少年眼健康产业展会
2.8 basic knowledge of project management process
1、强化学习基础知识点
Applet page navigation
如何让化工企业的ERP库存账目更准确
2022北京眼睛健康用品展,护眼产品展,中国眼博会11月举办
Informatics Orsay all in one 1339: [example 3-4] find the post order traversal | Valley p1827 [usaco3.4] American Heritage
随机推荐
Material Design组件 - 使用BottomSheet展现扩展内容(二)
Duchefa d5124 md5a medium Chinese and English instructions
Abnova CD81 monoclonal antibody related parameters and Applications
培养机器人教育创造力的前沿科技
Mongodb/ document operation
Analysis of steam education mode under the integration of five Education
CVPR 2022 | 常见3D损坏和数据增强
[record of question brushing] 1 Sum of two numbers
如何让化工企业的ERP库存账目更准确
Norgen AAV extractant box instructions (including features)
Pytorch 1.12 was released, officially supporting Apple M1 chip GPU acceleration and repairing many bugs
14、Transformer--VIT TNT BETR
Informatics Olympiad 1340: [example 3-5] extended binary tree
2.8、项目管理过程基础知识
插值查找的简单理解
Make Jar, Not War
Duchefa丨S0188盐酸大观霉素五水合物中英文说明书
How to open an account online for futures? Is it safe?
小程序事件绑定
go 文件路径操作