Files
opendance-android/tasks/005-websocket-client.md
zijunchiang 264786134c docs: 新增「初次部署(从零跑起来)」;去混淆字符与真实内网信息
- README.md / README.txt 新增初次部署章节:前置条件(JDK 17 / SDK 34 / Gradle 8.9)、
  获取代码与本地配置(local.properties 不入仓)、Debug/Release 构建、装到手机与相机权限、
  连接配置(只连 Windows 客户端,默认 8765 / /pose)、第一次跑通、自检清单、常见问题
- 单测数量按实际(30 项)修正
- 三库同源契约:':=' 写法修回、去掉真实 MariaDB 版本串
- 全文去除易被 Gitea 判为「模棱两可 Unicode」的字符
- 本机 JDK 路径与内网示例地址改占位符 / RFC 5737 文档网段
2026-09-15 21:33:27 +08:00

48 lines
1.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 通过;状态机与统计逻辑由运行页展示(需真机验证端到端)。