# 配网失败处理与内存恢复 更新日期:2026-10-23。本文描述源码策略与主机验证,不代表新板实机验收。 ## 故障背景 新板启动日志显示内部 RAM 空闲 135,167 B、最大 DMA 连续块 73,728 B,均高于 当前配网门槛 49,152 B / 12,288 B。设备身份缺失返回 `ESP_ERR_NOT_FOUND`, 发生在 BLE 初始化之前。旧控制层将所有重新配网错误送入低内存恢复重启,并将 空快照打印为三个零。恢复启动再次失败后清除恢复模式,又被运行时触发重启。 因此该样本不能证明 BLE 内存不足,也不能证明身份补齐后的 BLE 内存一定充足。 ## 当前职责与流程 - `domain.h` 是配网语义及 `domain_wifi_provisioning_start_status_t` 的唯一声明点, 对应 AGENTS 所有权矩阵的“小程序 Wi-Fi 配网语义”一行。未增加新契约家族或改变所有权。 - `domain_runtime_mini_program_provisioning_preflight()` 只检查身份,无 BLE 初始化副作用。 `domain_runtime_mini_program_provisioning_start()` 同步启动,必须传入结果输出指针; 失败返回错误码及类型化原因,domain/platform 不后台重试。 - `control_plane_connectivity_runtime.c` 持有唯一配网协调策略,所有共享字段在 `s_provisioning_lock` 下访问;资源操作、通知和日志在锁外执行。 - 私有 `control_plane_provisioning_policy.h` 只实现等待、退避和恢复次数决策。 Wi-Fi worker 轮询协调器,不新增任务、定时器或上层状态镜像。 ```text 尝试被允许 → 身份检查 → 有界暂停语音 → 停止 STA → 内存检查 → BLE 启动 → 配网 worker ↓ ↓ ↓ 等待身份 按实际原因处理 仅内存错误允许一次恢复启动 ``` | 原因 | 策略 | 如何继续 | | --- | --- | --- | | 身份缺失 | 等待身份,不停现有音频,不自动重试、不重启 | 成功 `save_config` 后由 Wi-Fi worker 重新检查 | | 无效参数、不支持的配置 | 停止自动尝试 | 修正后 `retry_provisioning` | | 明确临时超时 | 首次失败后依次等待至少 1、3、10 秒,最多三次额外尝试 | 超限后等待显式重试 | | 未分类启动错误 | 停止自动尝试,不猜测为内存故障 | 根据日志排查后显式重试 | | 内存门槛不满足或明确分配失败 | 本轮最多一次恢复重启 | 恢复启动仍失败则保持运行,等待排查 | | Wi-Fi 密码错误或连接超时 | 保持 BLE,通知小程序连接失败 | 小程序重新提交凭据 | | BLE teardown 失败 | 暂停云语音/HTTPS,保留待释放义务 | 显式重试先有界完成旧实例 teardown,成功后才能重启 BLE | | 配网被停止或取消 | 有界释放,不自动重新进入配网 | 显式重试 | 退避由 worker 轮询驱动,1/3/10 秒是最短间隔,不是精确唤醒时间。 只有明确 `ESP_ERR_TIMEOUT` 被归为临时失败;未知错误不自动循环。 内存采样 API 本身失败属于诊断失败,不触发内存恢复重启。 ## 恢复次数与日志 `recovery_boot` 表示当前采用精简启动;`recovery_attempted` 表示该恢复链已用过重启。 RTC 一次性请求在恢复启动消费后锁存 attempted。恢复失败退出精简启动时,不清除 attempted;`save_config`、显式重试及再次消费请求也不重置它。 恢复配网成功并完成 BLE teardown 后,仍按原流程重启进入完整正常运行时; 这是成功后的模式切换,不是失败重试。普通启动配网成功直接恢复运行时,无需重启。 启动失败日志包含 `stage`、`error`、`reason`、`retry_ms`、`recovery_attempted` 和 `voice_paused`。内存日志使用实际采样;采样失败明确显示 unavailable / unknown, 不能把缺少快照打印为内存零值。 ## 等待期间的资源与产测命令 重新配网不再设置全局运行时停止标志,因此 Wi-Fi 协调、屏幕、电池、按键与 产测串口继续工作。身份检查在暂停资源之前完成。若已暂停语音后才失败,设备 明确进入离线等待/退避,云语音保持暂停,避免与 BLE 重试争抢内存;OTA、财运 HTTPS 和语音启动入口遵守此门禁。BLE 成功 teardown 或其他 STA 恢复路径解除门禁。 若旧 BLE 尚未成功释放,STA 即使已连接也不能直接恢复云服务。 ```text get_device_info set_device_id <后台分配的实际设备ID> set_serial_number <实际序列号> save_config get_device_info ``` `set_*` 只暂存 RAM,`save_config` 成功持久化后才发布配置通知;失败不发布。 CLI 不直接停资源或初始化 BLE。新命令 `retry_provisioning` 只请求协调器重新尝试, 不写入设备身份、不删除 Wi-Fi 凭据,也不重置内存恢复次数。Wi-Fi 已正常连接且 没有待清理 BLE 时继续正常联网,不强制中断连接进入配网。 ## 验证 ```bash python3 tools/test_provisioning_recovery.py ``` 该主机测试提取并编译实际领域启动、控制层协调、恢复请求消费、配网 worker 和 产测保存函数,使用 RTOS/BLE/存储故障桩及 ASan/UBSan。覆盖身份等待、失败与成功保存、 错误分类、退避与计时回绕、内存门槛边界和分配失败、恢复失败不再重启、未知快照日志、 停止超时、Wi-Fi 失败后继续接收凭据、成功恢复运行时、teardown 失败、取消和启动门超时。 固件使用 ESP-IDF 5.5.4 构建。实机仍需验证空身份持续运行、身份写入后的 BLE 广播、 错误/正确 Wi-Fi 凭据、连接后的 BLE 释放与语音恢复,并记录 BLE 真正初始化前后的 内部 RAM、最大 DMA 连续块及并行负载。主机故障注入不替代这些设备证据。