当前位置:网站首页>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
边栏推荐
- Specification of protein quantitative kit for abbkine BCA method
- Duchefa d5124 md5a medium Chinese and English instructions
- Informatics Orsay all in one 1339: [example 3-4] find the post order traversal | Valley p1827 [usaco3.4] American Heritage
- Analysis of steam education mode under the integration of five Education
- When JS method passes long type ID value, precision loss will occur
- CTF逆向基础
- Ros2 topic [01]: installing ros2 on win10
- Analyze the knowledge transfer and sharing spirit of maker Education
- Duchefa low melting point agarose PPC Chinese and English instructions
- Duchefa丨D5124 MD5A 培养基中英文说明书
猜你喜欢
2.8 basic knowledge of project management process
Norgen AAV提取剂盒说明书(含特色)
Abnova丨E (DIII) (WNV) 重组蛋白 中英文说明书
Informatics Orsay all in one 1339: [example 3-4] find the post order traversal | Valley p1827 [usaco3.4] American Heritage
phpstudy小皮的mysql点击启动后迅速闪退,已解决
Analyze the knowledge transfer and sharing spirit of maker Education
Duchefa丨P1001植物琼脂中英文说明书
解析创客教育的知识迁移和分享精神
Abnova blood total nucleic acid purification kit pre installed relevant instructions
Duchefa p1001 plant agar Chinese and English instructions
随机推荐
How to make ERP inventory accounts of chemical enterprises more accurate
Ros2 topic [01]: installing ros2 on win10
Informatics Olympiad 1338: [example 3-3] hospital setting | Luogu p1364 hospital setting
Abbkine trakine F-actin Staining Kit (green fluorescence) scheme
Minimum commission for stock trading account opening, where to open an account with low commission? Is it safe to open an account on your mobile phone
挖财商学院给的证券账户安全吗?可以开户吗?
ProSci LAG-3 重组蛋白说明书
Document method
Analysis of steam education mode under the integration of five Education
Abnova CRISPR spcas9 polyclonal antibody protocol
Kubernetes resource object introduction and common commands (V) - (configmap & Secret)
mysql全面解析json/数组
Abnova maxpab mouse derived polyclonal antibody solution
常用的视图容器类组件
台风来袭!建筑工地该如何防范台风!
Make Jar, Not War
CVPR 2022 | 常见3D损坏和数据增强
Relationship between mongodb documents
Applet event binding
NPDP如何续证?操作指南来了!