- 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 文档网段
48 lines
1.7 KiB
Markdown
48 lines
1.7 KiB
Markdown
# 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` 通过;状态机与统计逻辑由运行页展示(需真机验证端到端)。
|