# EchoEar 屏幕确认后重启修复 设备:`KP01-B43A451634A8`,EchoEar ESP32-S3,串口 COM6。 ## 原因与修复 实机日志确认:Wi-Fi 默认静态缓冲区分配失败;失败路径保留了 `WIFI_STA`,但下一次调用又创建同名接口,触发 SDK 内部断言并重启。 - 新增 `main/ble_wifi.c`,逐阶段持有接口、事件组、驱动和事件处理器,重试不会重复创建或注册。 - 使用带错误检查的网络接口创建 API,不使用内部会 assert 的便捷创建函数;接口连接失败时清理自己创建的接口,不接管其他模块的接口。 - 仅 BLE 配网模式使用静态 RX/TX 各 4、动态 RX 8、TX cache 4,关闭该模式的 AMPDU/AMSDU。普通语音模式的 sdkconfig 性能配置不变。 - 在蓝牙启动之前预留 Wi-Fi 驱动资源;此时不启动 Wi-Fi 连接、不发送账号信息,实体点击确认仍然必需。 - 每次更换连接任务先停止上一次 STA,并等待停止事件;失败重试不重复初始化网络接口。 - Wi-Fi 启动内存不足和网络连接超时分别提示。重连失败时不继续提交云端绑定。 - 诊断只记录错误码、内存余量、断开原因编号,不记录 Wi-Fi 密码或绑定凭据。 本次没有修改线上服务、小程序协议或数据库,也没有解除绑定或恢复出厂设置。 ## 验证 - ESP-IDF v5.5.1 固件编译通过;程序大小 3,175,712 字节,5 MiB 程序分区剩余约 39%。 - `tests/ble-wifi-host.cjs` 将真实 `ble_wifi.c` 函数接入 SDK 模拟器,22 个生命周期/故障注入测试通过;使用 GCC `-Wall -Wextra -Werror -fsanitize=address,undefined`。 - 覆盖连续 10 次驱动初始化内存不足后恢复、所有初始化阶段失败、网络接口所有权保护、连接超时/断开/停止事件延迟、重复任务和参数校验。 - SDK 私密日志回归测试通过。 - COM6 只刷写 `0x10000` 程序,写入哈希校验通过;没有写入 NVS、分区表、工厂身份或资源分区。 - 新固件实机启动:Wi-Fi 初始化成功后内部可用内存 58,519 字节,最大连续块 31,744 字节。蓝牙初始化与启动任务正常完成。 - 45 秒启动观察只看到刷入后的 1 次主动重启,没有出现额外崩溃重启。 - 用小程序实际 Security2 实现完成实机自动连接和加密握手,连续两轮读取设备信息、状态成功,状态 `idle`。 - 用户随后通过小程序重新提交配网信息并轻点屏幕:约 6.4 秒取得 IP,再约 2.5 秒设备状态到达 `success`。上述只读握手测试没有代用户提交绑定。 - 云端只读复核:绑定记录 `COMMITTED`,完成时间 2026-09-13 21:11:25(北京时间),`binding_generation=5`,有效绑定数为 1。 - 云端语音激活状态当时为 `PROVISIONING`;绑定成功不代表语音服务已经开通完成。 ## 文件与回退 固件:`firmware/echoear-platform-agent/build/VolcRTCDemo.bin` SHA256:`261D68285C062ACDE5927690667A85DEDD5D19C6B88FF696F235F8CB0DE3D6EA` 刷入前 5 MiB 程序分区备份:`.tmp-mini-release/before-wifi-fix-app-20260913.bin` 备份 SHA256:`15B84C11253A1D96B23F3952433751195550436EB522F87D4F171D7C98D20814` 仅在明确需要回退时把该程序备份写回 `0x10000`,不要整片擦除。 只读诊断:`tools/monitor_provisioning.py --port COM6 --seconds 45`,默认不重启;`--reset` 必须显式指定。