# T-AND-005 WebSocket 推流 + 自动重连 - **状态**:done - **依赖**:T-AND-004 ## 目标 把 239 字节帧与控制消息推给 Windows 客户端,网络抖动时自动恢复。 ## load ``` DSH.md contracts/websocket-keypoints.md # 锚点:1 端点与子协议、3 控制帧 app/src/main/java/com/opendance/studio/net/PoseWebSocketClient.kt ``` ## 交付物 `net/PoseWebSocketClient.kt`:OkHttp WebSocket 封装 + 状态流 + 统计。 ## 关键实现 | 项 | 做法 | 理由 | |--|--|--| | 子协议 | 请求头 `Sec-WebSocket-Protocol: opendance.pose.v1` | 契约 1 | | 二进制帧 | `socket.send(ByteString)` | 契约要求生产链路用二进制 | | 控制帧 | `send(text)`,JSON | hello / stats / bye | | 自动重连 | 指数退避 1s -> 2s -> 4s... 上限 15s,连接成功即重置 | 避免抖动时打爆对端 | | 非连接态发送 | 直接丢弃并计入 `droppedFrames` | **绝不阻塞相机线程** | | 心跳 | OkHttp `pingInterval(15s)` | 及时发现半开连接 | | 读超时 | 0(不超时) | WebSocket 长连接 | | 统计 | 发送帧数、丢弃帧数、发送 FPS、RTT、重连次数、最近错误 | 运行页状态指示 | ## 控制帧 - **hello**(连接后立即发):protocol / device / appVersion / cameraFacing / targetFps / resolution - **welcome**(收):记录服务端 sessionId - **config**(收):服务端可下发 mirror / targetFps / upperBodyOnly / resolution, 通过 `onRemoteConfig` 回调 - **stats**(每秒发):fps / dropped / latencyMs / confidenceAvg - **bye**(主动断开时发) ## 验收 `assembleDebug` 通过;状态机与统计逻辑由运行页展示(需真机验证端到端)。