ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

设备已经装到墙上,固件还能怎么更新?OpenBeken OTA 升级实战

设备已经装到墙上,固件还能怎么更新?OpenBeken OTA 升级实战

设备已经装到墙上,固件还能怎么更新?OpenBeken OTA 升级实战

【免费下载链接】OpenBK7231T_AppOpen source firmware (Tasmota/Esphome replacement) for BK7231T, BK7231N, BL2028N, T34, XR809, W800/W801, W600/W601, BL602, LN882H, Realtek chips and more项目地址: https://gitcode.com/GitHub_Trending/op/OpenBK7231T_App

OpenBeken 是一款面向 BK7231T、BK7231N、BL602 等芯片的开源固件,它的 OTA(空中下载)固件升级系统可以让设备直接通过无线网络拉取新固件并刷写,无需再次接触硬件。如果你有一批已经部署在墙上的插座或灯,却还想统一升级版本,这篇讲的就是这件事。

一个很现实的麻烦:设备越多,刷机越难

先想象这个场景:你在 30 个房间里各装了一个 BK7231T 的插座,现在想给它们统一升级固件。逐台断电、拆盖、找 USB 转串口、插线、刷写、装回……这件事做三次还能忍,做三十次基本不可能。更糟的是,很多设备根本就在信号覆盖的边缘位置,物理接线比想象中更折腾。

OTA 要解决的就是这个问题:只要设备能连上你的局域网并且能访问某个 HTTP 地址,固件就能通过网络"空投"过去。对开发者来说,它同样意味着批量维护能力——新修了一个 bug,不用重新生产一批硬件。

原理一句话:HTTP 拉取、写入独立分区、重启生效

不需要展开看几十页驱动代码,核心逻辑可以一句话讲清:设备收到 URL 后,自己发起 HTTP GET 请求把固件文件下载下来,边下边写入 flash 里的独立 OTA 分区,下载完成后重启,引导程序加载新分区。

几个值得知道的点:

  • 固件是写进一个专门的 OTA 分区的,不会直接覆盖正在运行的那份代码,所以下载阶段掉电一般不会破坏旧系统;
  • 所有平台共用的接口定义在 src/hal/hal_ota.h 里,otarequest()负责发起下载,OTA_GetProgress()/OTA_GetTotalBytes()提供进度和总量查询,Web 界面上那个进度条就是从这里读的;
  • 各芯片的差异被隔离在 HAL 层,比如 BK7231 的实现见 src/hal/bk7231/hal_ota_bk7231.c,Armino(BK725x)实现在 src/hal/bk_armino/hal_ota_bk_armino.c。你作为使用者不需要关心这些,但它们决定了每个平台的文件格式和下载行为。

三步发出第一次 OTA 请求

不管走哪条路,准备阶段是一样的:把正确的固件文件放到一个设备能访问到的 HTTP 服务器上。本地起个静态服务即可,比如 Python 的python -m http.server 8000,或者 XAMPP、VS Code 的 Live Server,命令文档里也是这么建议的(见 docs/commands-extended.md 中ota_http的说明)。

路径一:Web 界面,适合单台操作

  1. 浏览器打开设备的 Web 应用,进入Config → OTA标签页;
  2. 选择固件文件(界面会校验扩展名,选错格式根本不让提交),点击 start;
  3. 设备上传固件文件到自身接口完成写入,随后自动重启。

路径二:ota_http命令,适合批量和脚本化

  1. 在 Web 界面的 Config → OTA 输入框里填好固件 URL,例如http://192.168.1.100:8000/BK7231T_openbeken.rbl,提交;
  2. 或者通过串口/Telnet/MQTT 直接下发ota_http http://192.168.1.100:8000/BK7231T_openbeken.rbl;
  3. 命令入口注册在 src/cmnds/cmd_main.c(函数CMD_HTTPOTA),最终会走到 src/httpserver/http_fns.c 里的OTA_RequestDownloadFromHTTP(),按芯片分发到对应平台逻辑。

批量场景下你可以用 MQTT 的cmnd/<设备名>/ota_httptopic 逐台下发,或者配合 docs/autoexecExamples.md 里提到的脚本能力做自动触发。对新手来说,先用路径一把一台设备跑通、确认重启后版本号正确,再上路径二,是最稳的顺序。

芯片支持矩阵:文件名先对号入座

升级前最常出的错,是把 A 芯片的固件推给了 B 芯片。OpenBeken 对每个平台要求的 OTA 文件扩展名都不同(定义见 src/new_common.h 中的OBK_OTA_EXTENSION),下表可以先对照:

芯片平台OTA 文件后缀HAL 实现位置
BK7231T / BK7231N.rblsrc/hal/bk7231/
BK725x 系列(Armino).rblsrc/hal/bk_armino/
BL602 / BL2028N.bin.xz.otasrc/hal/bl602/
XR809 / XR806.imgsrc/hal/xradio/
W800 / W801、W600 / W601.imgsrc/hal/w800/
LN882H / LN8825.bin/.imgsrc/hal/ln882h/
ESP32 系列 / ESP8266.imgsrc/hal/espidf/
TR6260、GD32VW553 等.img各自平台 HAL 目录

注意两点:一是.rbl这类文件本质是"启动器 + 固件"的组合包,把 BK7231N 的.rbl刷到 BK7231T 上是会出大问题的,官方 FAQ(docs/faq.md)原话就是"刷错平台会砖";二是同一颗芯片不同 SDK 版本(比如 BK7231 老 SDK 与 Armino 新 SDK)的文件也可能不通用,固件来源尽量认准 Releases 里对应平台的构建产物。

升级进度卡住怎么排查

遇到下载失败或进度不动,按下面的顺序查,基本能覆盖 90% 的情况:

  1. 先确认是"没开始"还是"没写完"。看 Web 界面进度条:进度一直是 0,多半是连接层问题;进度走到一半停了,看下面第 3 条。
  2. URL 必须设备可达且是 HTTP。目前ota_http只支持 HTTP,不支持 HTTPS;URL 里主机名后必须带/,否则部分平台解析不了(src/hal/bk_armino/hal_ota_bk_armino.c 里有明确注释)。用电脑浏览器先访问一遍同样的 URL,确认文件完整下载、长度对得上。
  3. 检查网络环境。下载是分块流式写入 flash 的,WiFi 信号弱的设备中途断流就会失败。设备离 AP 近、信道不拥挤时成功率明显更高。
  4. 重复发命令不会叠加下载。BK 平台实现在发起请求前会检查状态,发现已有下载在进行会直接忽略新请求(日志提示 "http in progress, not starting another"),所以卡住的会话要先等它超时或重启设备,再重新发起。
  5. 万一刷错了、设备反复重启起不来,别慌着报废。持续上下电几次,设备检测到连续启动失败后会进入安全模式并开放一个无密码的接入点(机制见 docs/safeMode.md),通过它进 Web 界面后用串口或这个模式重新刷一份正确的固件即可。
  6. 升级前备份配置。如果你的通道设置、autoexec 脚本、MQTT 主题等配置比较重要,先在 Web 界面导出配置或存个档,OTA 只更新固件、不动配置分区,但养成习惯没有坏处。

最后说两句

对单台设备,OTA 的价值是"装上去就再也不用动它";对批量部署,它的价值是升级从体力活变成了网络管理问题。理解"HTTP 拉取 + 独立 OTA 分区 + 重启切换"这条主线之后,文件对号入座、URL 可达、网络稳定这三件事守住了,升级流程本身几乎没有额外的学习成本。

核心关键词:OpenBeken OTA 固件升级、无线固件更新、BK7231T 固件

长尾关键词:如何远程升级 BK7231T 固件、HTTP OTA 配置步骤、BL602 OTA 升级失败排查、OpenBeken ota_http 命令用法

【免费下载链接】OpenBK7231T_AppOpen source firmware (Tasmota/Esphome replacement) for BK7231T, BK7231N, BL2028N, T34, XR809, W800/W801, W600/W601, BL602, LN882H, Realtek chips and more项目地址: https://gitcode.com/GitHub_Trending/op/OpenBK7231T_App

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进