跳转至

02 fota方式升级WiFi

作者:拓毅恒 | 最后修改:2026-04-13

一、fota_wifi 概述

FOTA(Firmware Over-The-Air)WiFi 是一种通过无线方式远程升级设备 WiFi 固件的技术。它允许设备在保持在线的情况下,自动检查、下载并更新 WiFi 固件,无需手动干预或物理连接。

在 Air8000 平台上,fota_wifi 功能通过 exfotawifi 扩展库实现,支持自动检测 WiFi 固件版本并在有新版本时进行升级,是设备维护和功能更新的重要手段。

二、准备硬件环境

参考:Air8000 硬件环境清单,准备好硬件环境。

2.1 Air8000 核心开发板

Air8000 核心板集成了移动网络通信功能,如果要使用 4G 网络下载 WiFi 固件,需要正确安装 SIM 卡和天线才能正常工作。

三、准备软件环境

3.1 文章内容应用

  1. 烧录工具:Luatools 工具
  2. Air8000 烧录需要的固件:本demo开发测试时使用的固件为LuatOS-SoC_V2032_Air8000,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;
  3. Air8000 烧录需要脚本文件:Air8000/demo/fota_wifi
  4. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 核心板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。

3.2 API 介绍

这里仅介绍本篇文档所使用的 API,详情请查看:API - exfotawifi

exfotawifi.request()

请求检查并执行 WiFi 固件升级

四、fota_wifi 功能实现概述

本小节详细介绍 Air8000 开发板上 WiFi 固件自动升级功能的实现方法和核心代码逻辑。

4.1 主程序配置

主程序用于初始化系统环境并加载 WiFi 固件升级模块。

4.1.1 功能定义

配置项目信息,初始化系统组件(如看门狗),并加载 WiFi 固件升级模块。

4.1.2 代码示例

-- 定义项目信息
PROJECT = "fota_wifi"
VERSION = "001.000.000"

-- 在日志中打印项目名和项目版本号
log.info("main", "project name is ", PROJECT, "version is ", VERSION)

-- 初始化看门狗功能(如果支持)
if wdt then
    --配置喂狗超时时间为9秒钟
    wdt.init(9000)
    --启动一个循环定时器,每隔3秒钟喂一次狗
    sys.timerLoopStart(wdt.feed, 3000)
end

-- 加载WiFi固件升级模块
require "check_wifi"

-- 启动系统运行
-- sys.run()之后后面不要加任何语句
sys.run()

4.2 WiFi 固件升级模块

WiFi 固件升级模块是实现 WiFi 固件检查和升级的核心组件。

4.2.1 功能定义

检查当前 Air8000 模组的 WiFi 固件是否为最新版本,若不是则自动启动升级过程,并在升级完成后重启设备。

4.2.2 代码示例

-- 加载exfotawifi模块
local exfotawifi = require("exfotawifi")

-- WiFi固件升级任务
local function fota_wifi_task()
    -- 请求检查并执行WiFi固件升级
    local result = exfotawifi.request()
    if result then
        log.info("exfotawifi", "升级任务执行成功")
    else
        log.info("exfotawifi", "升级任务执行失败")
    end

    -- 等待升级完成事件(注意:固件版本需≥V2017版本才有此事件)
    sys.waitUntil("AIRLINK_SFOTA_DONE")
    log.info("fotawifi", "WIFI下载完毕,开始重启")
    sys.wait(100)
    -- 重启设备以完成固件更新
    pm.reboot()
end

-- 在设备启动时执行WiFi固件升级检查任务
sys.taskInit(fota_wifi_task)

五、功能演示

5.1 WiFi 固件升级准备

使用 Luatools 将代码烧录到 Air8000 开发板

5.2 WiFi 固件升级执行

设备启动后,会自动执行 WiFi 固件版本检查,日志中会显示检查过程

如果检测到需要升级,系统会自动下载新的 WiFi 固件:

下载完成后,系统会开始安装新固件:

5.3 升级完成与设备重启

固件安装完成后,系统会接收到 AIRLINK_SFOTA_DONE 事件,随后重启

5.4 升级结果验证

设备重启后,可以通过日志验证 WiFi 固件是否已成功更新到最新版本:

可以看到日志中显示的 WiFi 固件版本号已更新为最新版本。

六、更新记录

V20

  1. add: ble,scan支持主动模式
  2. fix: ble,修复获取gatt信息时出现死机
  3. fix: ble,修复描述符handle查找异常
  4. fix: ble,修复indicate&notify 开关异常
  5. fix: ble,修正ble characteristics默认max_size
  6. fix: gpio,设置gpio3.3v和3.1v的执行参数填反了,导致调用接口设置3.3v却还是3.1v。并在开机就将gpio设置成3.3v
  7. change: gpio,开机时调整GPIO初始化逻辑,如果gpio设置不是复用的,那就关掉复用

V18

  1. add: gpio,支持GPIO使用中断模式
  2. add: ble,luat_ble_set_adv_data添加长度限制
  3. add: ble,添加可扫描标志
  4. add: ble,添加luat_ble_indicate_enable 接口
  5. add: log,开机的时候把pm.lastReson的值打印出来
  6. add: uart,支持1200和600波特率,300波特率不支持
  7. add: airlink,spi从机实现devinfo(设备信息)的获取
  8. fix: luavm,有概率在开机的时候莫名其妙死机
  9. fix: airlink,通过抓波形看到RDY脚有的时候拉不高 会在开机出现启动超时的情况, 不能正常恢复
  10. fix: airlink,rdy脚有时会在cs拉高之前触发一次高低电平,cs拉高后再触发一次,导致出现slave pkg err的日志
  11. fix: gpio,gpio输出模式的默认状态没有正确设置
  12. fix: gpio,输出模式时打开上拉/下拉是保持状态,输入模式不能在休眠保持电平
  13. fix: gpio,输入模式获取电平不正确
  14. fix: airlink,从机开机时概率出现获取数据长度错误 0,导致airlink无法正常通讯
  15. fix: airlink,fota,修复fota时airlink冲突的问题
  16. fix: dhcp,解决启动dhcp后,无法进入长链接的低功耗模式的问题
  17. fix: ulwip,dhcp, sta测试超过1个小时,重连热点就会上不了网。
  18. fix: ble,蓝牙描述符时候会导致128长度uuid异常
  19. fix: wlan,自动重连功能以及关闭自动重连功能未生效
  20. change: ble,蓝牙MAC地址获取,改到ble库
  21. change: uart,优化uart tx 缓存多个数据
  22. change: rtc,默认时间改到2000-01-01 00:00:00
  23. change: airlink,slave 从机端加快spi_cs中断的速度
  24. change: log,spi隐藏datalen的调试日志
  25. change: log,隐藏“TX内存高水位”的调试日志
  26. change: dhcp,dhcp-server需要完全忽略
  27. change: luatos,应该总是默认用STA,无论后续是否注册ETH
  28. change: gpio,执行close时,应该把输出输入标志位也全部关掉
  29. change: gpio,禁止使用GPIO10/11,因为是UART0
  30. remove: ble,去掉定向广播

V14

  1. add: wlan,WLAN_STA_INC事件添加bssid数据
  2. fix: eth,以太网拔网线,没有发出IP_LOSE事件,而且对dhcp client应该执行stop
  3. fix: uart,偶现的uart发送数据乱码的问题
  4. fix: gpio,修复在重复执行gpio.setup且默认高电平时, 会导致有5~10us的低电平及一堆毛刺
  5. fix: ulwip,dhcpclient,如果没有找到合适的网卡,会导致内存泄露
  6. change: log,打印io电平的日志
  7. change: netdrv,dhcp客户应该在网卡就绪,网线连接之后再打开

七、总结

本 demo 实现了 Air8000 开发板 WiFi 固件的自动检查和升级功能。通过 exfotawifi 扩展库,可以方便地实现设备 WiFi 固件的远程更新,确保设备始终运行最新版本的固件,从而获得更好的性能和安全性。整个升级过程完全自动化,无需人工干预,大大提高了设备维护的便捷性。

八、常见问题

8.1 升级失败问题

  • 确保 SIM 卡正常联网
  • 检查网络信号强度是否良好

8.2 版本兼容性

  • 最新的 WiFi 固件可能与部分 API 或功能存在兼容性问题
  • 测试完成后,建议在生产环境中注释掉 require "check_wifi",避免自动升级到未经测试的版本

8.3 无法获取系统消息问题

  • 需要检查下固件版本,固件版本需 ≥V2017 版本才有 AIRLINK_SFOTA_DONE 事件