fota_file.lua 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. --[[
  2. @module fota_file
  3. @summary 文件系统FOTA升级功能模块
  4. @version 1.0
  5. @date 2025.10.24
  6. @author 孟伟
  7. @usage
  8. -- 文件系统FOTA升级功能
  9. -- 提供从文件系统直接读取升级包进行固件升级的功能
  10. -- 可以使用luatools工具的烧录系统文件功能将升级包直接烧录到文件系统中,
  11. 本文件没有对外接口,直接在main.lua中require "fota_file"就可以加载运行;
  12. ]]
  13. local function fileUpgradeTask()
  14. -- 等待系统稳定后再开始升级
  15. sys.wait(10000)
  16. log.info("FOTA_FILE", "=== 开始文件系统升级 ===")
  17. -- 步骤1: 初始化FOTA流程
  18. log.info("FOTA_FILE", "初始化FOTA...")
  19. if not fota.init() then
  20. log.error("FOTA_FILE", "FOTA初始化失败")
  21. return
  22. end
  23. -- 步骤2: 等待底层准备就绪
  24. log.info("FOTA_FILE", "等待底层准备...")
  25. while not fota.wait() do
  26. sys.wait(100)
  27. end
  28. log.info("FOTA_FILE", "底层准备就绪")
  29. -- 步骤3: 从文件系统读取升级包并启动升级
  30. local filePath = "/update.bin"
  31. log.info("FOTA_FILE", "开始读取升级文件:", filePath)
  32. local result, isDone, cache = fota.file(filePath)
  33. log.info("FOTA_FILE", "升级文件写入flash中的fota分区结果", result, isDone, cache)
  34. -- 步骤4: 结束写入fota分区
  35. log.info("FOTA_FILE", "结束写入fota分区...")
  36. local result, isDone = fota.isDone()
  37. log.info("FOTA_FILE", "写入fota分区状态", "结果:", result, "完成:", isDone)
  38. if result then
  39. -- 步骤5: 处理写入结果
  40. if isDone then
  41. -- 升级文件成功写入flash中的fota分区,准备重启设备;
  42. -- 设备重启后,在初始化阶段的运行过程中会自动应用fota分区中的数据完成升级,最终升级结果可以通过观察日志中的版本号来区分。
  43. log.info("FOTA_FILE", "升级成功,准备重启设备")
  44. -- 调用fota.finish(true)结束升级流程,参数true表示正确走完流程。
  45. fota.finish(true)
  46. -- 可选:删除升级包文件
  47. -- os.remove("/update.bin")
  48. sys.wait(2000)
  49. rtos.reboot()
  50. else
  51. log.error("FOTA_FILE", "升级失败")
  52. -- -- 调用fota.finish(false)结束升级流程,参数false表示升级流程失败。
  53. fota.finish(false)
  54. end
  55. else
  56. log.error("FOTA_FILE", "升级失败:检查写入状态失败")
  57. -- -- 调用fota.finish(false)结束升级流程,参数false表示升级流程失败。
  58. fota.finish(false)
  59. end
  60. end
  61. -- 启动文件升级任务
  62. sys.taskInit(fileUpgradeTask)