Skip to content

[Voice] 接入 ESP32-S3 Linx WSS Transport 与重连状态机 #107

Description

@ZhaoXingPeng

结论与下一步

本子 Issue 把 Linx 的 ESP32-S3 平台传输层单独落地:用 ESP-IDF esp_websocket_client==1.8.0 建立 WSS、TLS、鉴权 Header、事件队列、分片重组和断线状态机。先合入可在主机验证的纯 C++ 重组核心,再用已连接的 ESP32-S3 做真实 WSS/hello/重连验证;本 Issue 不接 I2S/AFE/Opus。

为什么这样拆

voicelife-pcb-native-mvp 已在目标硬件上验证了几个不能丢的约束:采集/编码/发送与接收/解码/播放必须分任务;队列必须有界;网络不能反向阻塞麦克风;打断或 decoder reset 要递增 generation 并清理旧播放数据。MVP 的全局 Application 状态机、FreeRTOS event bits 和具体板卡宏不进入核心,本 Issue 只迁移这些可验证的传输边界。

本期范围

  • 新增 components/voicelife_linx_esp,公共头文件不暴露 ESP-IDF 类型。
  • 固定 espressif/esp_websocket_client==1.8.0,使用 WSS 与证书 bundle;禁止跳过证书名校验,禁止日志输出 token。
  • 配置 Authorization: BearerProtocol-VersionDevice-IdClient-Id,并保留 secret:// 凭据引用边界。
  • 实现平台无关的 WebSocket 分片重组器:text/binary/continuation、data_ptrdata_lenpayload_lenpayload_offsetfin;设置消息大小上限,重连/关闭时清理残片,generation 不匹配的数据丢弃。
  • ESP 事件回调只复制事件到有界队列并更新连接状态,不在 callback 内 stop/destroy;由专用任务完成发送、分发和资源回收。
  • Transport 的连接状态至少区分 disconnected/connecting/connected/reconnecting/failed,并为 hello 超时、网络超时、关闭重连提供明确错误。
  • 复用 🎙️ feat: 建立可插拔语音会话与 Provider 契约 #106 的 Linx Provider/Codec 契约;Provider 继续负责协议字段映射,Transport 不解析业务事件。

明确不做

  • 不在本 Issue 接入 I2S、AFE/Wake/VAD/AEC、Opus 编解码和真实播放。
  • 不把任意非 ESP32 板卡做成同一份固件;其他板卡只在调研矩阵中登记。
  • 不把 AK/SK、token、Wi-Fi 密码、Device UUID 写入仓库、Profile 或日志。
  • 不把 MQTT 当作已经等价的 Linx WebSocket 实现。

验收标准

  • 主机 TDD 覆盖单帧、分片 text/binary、非法 continuation、超长消息、关闭/重连清理和 generation 隔离。
  • ESP-IDF 6.0.2 / ESP32-S3 构建通过,依赖锁定为 esp_websocket_client==1.8.0
  • 真实板在 115200 稳定串口下记录 WSS headers、TLS、Linx hello、hello 超时/断线重连;不输出敏感值。
  • 事件回调不执行 stop/destroy,队列满时有明确丢弃/失败策略,且不阻塞音频数据面。
  • PR 关联 [Voice] 建立可插拔实时音频与 Linx/xiaozhi Provider 契约 #105[Epic] VoiceLife 设备端 MVP 模块化开发与交付 #91,说明对 voicelife-pcb-native-mvp 的迁移取舍,并附本地测试、固件构建和真机证据。

依赖与风险

本 Issue 依赖 PR #106 的 Provider 契约;在 #106 合并前可使用堆叠分支开发,但 PR 不宣称已独立基于 main。真实 Linx 凭据只从 GitHub Secrets/本机受控配置注入,无法提供凭据时只验收 TLS/echo 或离线 fixture,不伪造云端通过。

Refs #91
Refs #105

Metadata

Metadata

Assignees

Labels

sub-task实现拆分自父任务的可验收子任务

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions