当如下图所示,如果目录中因为一些原因导致升级失败,如下载失败等。.updater文件夹没有被删除时,使用qpycom里的文件拖拽功能也不能正常更新文件,app_fota也无法正常升级。目前知道的解决办法是自行删除.updater文件夹。自己创建的.updater文件夹也会复现这个现象。触发条件未知。
这是我使用的升级代码,以及后续添加的开机删除功能。
def remappfota():
import ql_fs
try:
if ql_fs.path_exists('usr/.updater'):
ql_fs.rmdirs('usr/.updater')
print('已删除升级目录')
else:
print('无升级目录无需删除')
except Exception as error:
pass
def start_fota_update(download_list):
"""
启动FOTA升级的函数,通过传入包含文件下载相关参数的列表来执行升级流程
参数:
download_list (list): 包含文件下载相关信息的字典列表,每个字典需包含 'url'(文件下载的URL地址)和 'file_name'(文件在本地存储的目录及文件名)两个键,例如:
[
{'url': 'http://www.example.com/app.py', 'file_name': '/usr/app.py'},
{'url': 'http://www.example.com/test.txt', 'file_name': '/usr/text.txt'}
]
"""
import app_fota
from misc import Power
if not isinstance(download_list, list):
print("传入的参数download_list类型不是列表,参数有误")
return
fota = app_fota.new()
print('准备下载...')
fota_flag=True
for item in download_list:
url = item.get('url')
file_name = item.get('file_name')
if not isinstance(url, str) or not isinstance(file_name, str):
print("列表中存在元素的 'url' 或 'file_name' 参数类型不是字符串,下载操作跳过该元素")
continue
if not file_name.startswith("/usr/"):
print("文件 {} 的路径格式不符合预期,不是以/usr/开头,下载操作跳过该元素".format(file_name))
continue
try:
res=fota.download(url, file_name)
if res ==0:
print("文件 {} 下载完成".format(file_name))
else:
print("升级失败{}删除所有文件".format(file_name))
remappfota()
fota_flag=False
except Exception as e:
print("下载文件 {} 时出现错误: {}".format(file_name, e))
if fota_flag:
print('所有文件下载完成')
fota.set_update_flag()
print('设置升级标志')
Power.powerRestart() # 重启模块
可能是usr空间不足导致的,模组usr剩余空间要至少是升级脚本大小的两倍
![]()
有这个可能。如果升级失败,最初我塞进去的108k的脚本,再升级就可能塞不进去了。没升级时脚本占用是244/388KB
