跑在 ESP32-C3 上的程序。它要做的事:录音、播放、联网、把声音切成帧搬出去、把云端语音搬回来播。
目标芯片:ESP32-C3 · 8MB Flash · 无 PSRAM · ESP-IDF 5.5.3 · FreeRTOS
这是「大脑的调度中心」。它不亲自碰音频字节,而是调用 wb_audio 去录/放、调用 wb_link 去收发,自己管「现在该干嘛」的状态机。改动最密集的文件。
其余内部函数(send_recording 流水线发送、handle_audio_ack、finish_voice_capture、on_play_frame 停等流控等)为 static 函数,散布在文件内,由上述入口统一驱动。
负责「卡片怎么连上 Cloudflare 锚点」。管 WebSocket 的建立、心跳保活、断线重连。也是本轮 P11「重连被拒」bug 的修复点。
项目里最核心、最讲究的模块。录音和播放各有一套环形缓冲;录音环写满时「丢最旧帧保最新」;CRC 从发送侧逐帧累计(丢掉的帧天然不计入)。
卡片和电脑在同一个房间时,可以不走公网、直接用蓝牙连。提供和 wb_anchor 一样的收发接口。
让上层不关心「到底走的蓝牙还是锚点」。上层只调用 wb_link_send_audio,具体走哪条路由 wb_link_kind 决定。
把「内存里的数据结构」和「线上字节流」互转。控制消息走 cJSON,音频帧是固定 243 字节的二进制结构。
卡片小屏幕上的界面。注意:默认字体没有中文字形,中文显示需要专门字体方案。
极小的一个模块,做语音压缩编解码。把 16 位采样压成 8 位,带宽砍一半。
管 Wi-Fi。支持一个「凭据列表」(MRU,最近连上的排前面),存进 NVS 掉电不丢。这是设备「离线找不到网」问题的关键排查点。
| 文件 | 作用 | 注意 |
|---|---|---|
main.c | 程序入口,启动各模块 | — |
wb_wifi_seed.local.h | Wi-Fi 凭据种子列表(编译期写入) | ⚠️ 含明文密码,不要提交进版本库 |
wb_anchor_secrets.local.h | 锚点令牌 / URL / 设备号 | ⚠️ 含令牌,同样保密 |
demo_*.c(10 个) | 出厂演示程序(音频、电池、蓝牙、按钮、低功耗等) | 派生应用需重做 UI,不能复用演示壳 |
wb_wifi_seed.local.h 和 wb_anchor_secrets.local.h 这两个文件里有明文 Wi-Fi 密码和令牌。项目规范明确「不得提交凭据、设备二维码密钥、私钥、个人数据」。对应仓库里有 .example 模板,真实值只在本地。