结论与下一步
本子 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: Bearer、Protocol-Version、Device-Id、Client-Id,并保留 secret:// 凭据引用边界。
实现平台无关的 WebSocket 分片重组器:text/binary/continuation、data_ptr、data_len、payload_len、payload_offset、fin;设置消息大小上限,重连/关闭时清理残片,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 实现。
验收标准
依赖与风险
本 Issue 依赖 PR #106 的 Provider 契约;在 #106 合并前可使用堆叠分支开发,但 PR 不宣称已独立基于 main。真实 Linx 凭据只从 GitHub Secrets/本机受控配置注入,无法提供凭据时只验收 TLS/echo 或离线 fixture,不伪造云端通过。
Refs #91
Refs #105
结论与下一步
本子 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: Bearer、Protocol-Version、Device-Id、Client-Id,并保留secret://凭据引用边界。data_ptr、data_len、payload_len、payload_offset、fin;设置消息大小上限,重连/关闭时清理残片,generation 不匹配的数据丢弃。明确不做
验收标准
esp_websocket_client==1.8.0。voicelife-pcb-native-mvp的迁移取舍,并附本地测试、固件构建和真机证据。依赖与风险
本 Issue 依赖 PR #106 的 Provider 契约;在 #106 合并前可使用堆叠分支开发,但 PR 不宣称已独立基于 main。真实 Linx 凭据只从 GitHub Secrets/本机受控配置注入,无法提供凭据时只验收 TLS/echo 或离线 fixture,不伪造云端通过。
Refs #91
Refs #105