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
凌晨两点,仓库里 200 台 BK7231T 设备要换固件,逐台拆机插 USB 不现实。OpenBeken 的 OTA 方案就是为此设计的:设备连上 Wi-Fi 后,向它发一条ota_http命令加一个固件下载地址,它自己完成下载、写 flash、重启。整条链路只有 HTTP 一条协议,不依赖 MQTT 或第三方服务器。
固件数据怎么从 HTTP 响应流走到 flash 分区
理解这条链路,排错时会快很多。
入口只做一件事:发一个异步 HTTP GET。ota_http命令落到CMD_HTTPOTA,再转发给平台 HAL 层的otarequest(const char *urlin)(src/hal/hal_ota.h)。函数内部把 2KB 响应缓冲区挂到一个回调上,然后立刻返回——下载在客户端线程里流式进行,主循环不被阻塞。
数据按 4KB 扇区落盘,边下边写。回调函数myhttpclientcallback在 src/hal/bk7231/hal_ota_bk7231.c 里有三个状态:state 0 时init_ota在 OTA 分区起点打开写入;state 1 时每来一段数据就累加进扇区缓冲,攒满SECTOR_SIZE(0x1000)就执行"擦除扇区 + 写入";state 2 时close_ota把不足一扇区的尾部补 0xFF 后写盘。BK7231T 的分区起点固定在0x132000,BK7231N 在0x12A000,宏名是START_ADR_OF_BK_PARTITION_OTA。注意 OTA 分区和运行分区是两块区域,下载期间旧固件照常跑,这才能做到"刷不坏正在执行的那份"。
进度就是一台字节计数器。每写一扇区,OTA_IncrementProgress(SECTOR_SIZE)就加 4096。Web 页面轮询时读OTA_GetProgress(),非负值即"有 OTA 在进行",页面直接显示已下载字节数和已刷写的 flash 地址。下载结束后计数 +1(CFG_IncrementOTACount),记录一次 OTA 历史。
准备:起一个固件下载服务
设备只做 HTTP 客户端,所以"服务器"只是局域网里任何能返回固件文件的进程:
python3 -m http.server 8080把对应平台、对应 flash 大小的 RBL 固件放到该目录即可。注意固件文件名里必须能对上你的芯片:BK7231T的 RBL 和 BK7231N的 QIO bin 互不通用(命令描述里原话是"getting N platform RBL on T will brick device")。
执行:一条命令触发
在 Web 界面进 OTA 标签页,把 RBL 文件拖进上传框点开始;或在命令行直接:
ota_http http://192.168.1.10:8080/firmware.rblURL 要求主机名后带/才能被正确解析,这条在源码注释里有明确提示。
验证:重启行为就是验证
刷写完成的回调会先保存配置(CFG_Save_IfThereArePendingChanges),延时 1 秒后bk_reboot。设备断开重连后,用status看版本、用otaCount相关状态确认计数 +1。如果刷的是好固件,设备 30 秒内稳定运行即算一次完整启动;如果连续多次启动失败(反复断电重启),设备会自己进入 AP 模式 + safe mode,此时引脚和继电器全部禁用,但 Web 页面仍可访问——这就是救回路径,docs/safeMode.md 有说明。
进阶避坑
刷完进不了系统 / 反复重启原因:固件与芯片不匹配,或 flash 大小不符(如往 1M 设备的 2M 分区布局里写文件)。 处理:进 safe mode 后重新用正确平台的文件 OTA;进不去 safe mode 就只能回 UART 首刷。
进度条长时间不动,最后超时报错原因:otarequest里request->timeout写死 10 秒,弱 Wi-Fi 或大文件下中间链路断了就会中止。 处理:把固件服务挪到与设备同网段、低延迟的位置,重试命令即可。
下载中途断网,想断点续传原因:实现里没有续传逻辑,扇区缓冲在 RAM 里,close_ota之外任何中断都留下半截分区。 处理:放弃续传预期,网络稳定后整体重刷——反正分区会被整扇区擦除重写,半截数据无害。
同一时间发起了第二个 OTA原因:otarequest检测到request->state == 1会直接拒绝并记日志"not starting another"。 处理:等当前任务自然结束或重启设备后再发命令。
页面显示已下载字节远小于实际文件大小原因:total_bytes是逐段累加的,流式传输下天然滞后,不代表出错。 处理:以Flashed(已刷写地址)推进为准,不要拿下载字节数当完成判据。
适用边界
这套 OTA 覆盖 OpenBeken 支持的大部分平台(BK7231T/N、BL602、W800、XR 系列等各自有 HAL 实现),但它是单向的:没有签名校验、没有 A/B 回滚,唯一保险是 safe mode。下次批量发版前,先在一台设备上用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),仅供参考