嵌入式与可移植设备实现
约 1048 字大约 3 分钟
2026-10-16
按快速接入先跑通文字,再接采播与摄像头。协议核心与HAL分开:同一核心处理MQTT信封、能力、会话、请求表、超时、取消和水位;HAL提供网络、单调时钟、调度、存储、音频、摄像头及媒体会话。Linux软件设备与ESP-IDF可共享核心,不在核心引入Windows或芯片驱动依赖。
必须独立的状态
| 对象 | 必须保存的状态 |
|---|---|
| 连接 | 本地连接代次、能力修订、鉴权及订阅状态;重连不继承旧资源授权 |
| 会话 | sessionId、用途、选定模式、轨、媒体代次、终态 |
| 输入 | inputId、是否允许采集、UDP首末序号、用户主动停止意图 |
| 回复 | respId、内容段、水位、音频nonce与首末序号、取消/完成终态 |
| 驱动 | requested与实际active/paused/stopped/failed分开,不以命令入队代替完成 |
| 工具 | 原执行ID、结果及不确定状态,跨重试避免重复副作用 |
调度和背压
MQTT收发泵不能阻塞在录音、播放、模型等待或附件下载。采集、发送、接收、解码、播放使用有界队列;音频按真实采样节奏发送,不把一秒录音瞬间灌入实时接口。过载要明确记录或拒绝,不无限堆积。
半双工与全双工共用输入/输出状态。半双工在播放期间按策略禁止上行;全双工只要输入仍启用,播放和工具执行期间也继续采集、编码和发送。插话只清目标回复播放队列,不重置上行;AEC须来自真实驱动或受支持的处理链,桌面模拟不能虚报硬件AEC。
UDP实现要点
沿UDP包格式实现16字节头、AES-128-CTR和Opus,密钥从本次会话实际返回值取得。统一信令会话额外按AI音频控制实现:
- 双向序号独立,从128起,每包递增128;不能回绕,不能复制
/ai示例的递增规则代替。 - 一个UDP包一帧Opus,最大1275字节;完整包头作为CTR初始块。协议没有认证标签,不能把解码成功称为密码学认证。
- audioStart带下一输入首序号,audioStop带实际末序号;输入暂停前的积压不能在恢复后注入新输入。
- 每回复安装独立下行udpNonce及首序号,拒绝旧回复包;respAudioDone末序号用于尾包和缺口核对。
- MQTT与UDP可乱序到达,使用有界待安装队列;取消/过期/终态回复的音频不能播放。
- 可选udpReplyStartReceipt只有实际PCM输出就绪及边界安装成功才回执,不能在收到事件时立即假报ready。
WebRTC和摄像头
独立Peer绑定当前sessionId和mediaRevision,提交完整ICE SDP;只按允许轨采播。cameraId为物理源,trackId为会话逻辑轨。预览、对讲、录制、AI取帧分别授权,隐私模式须让实际采集停止,不能仅静音UI。
挂断、撤权、异常或代次退休:先阻止新采集和输出,取消worker,排空或丢弃对应队列,关闭Peer/UDP、撤销源订阅及焦点,最后回报真实状态。失联无法确认驱动停止时报告unknown,不伪报released。释放失败保留事实,不让后继会话复用未知占用资源。
最小测试清单
必须覆盖合法/非法字段、重复与迟到、两轮对话、播放中持续上行、取消旧回复、实际音频解码、用户停止后重连不自动开麦、错误与重复关闭。摄像头检查实际解码帧和采集停止;工具检查实际副作用而非只看ACK。把网络、时钟、驱动失败注入做成确定性单测,再进行正式后端软件联调;硬件AEC及现场听感单独验收。
更新日志
2026/10/16 17:05
查看所有更新日志
73db2-docs(AI与音视频): 统一AI命令和UDP栏目并保留原网址于fe3a7-docs(AI与音视频): 按场景整理完整接入流程与命令契约于
