依据 Gitea v1.27.3 modules/charset/escape_stream.go 的判定规则 (analyzeDetectResults:仅当左右相邻字符都不是非 ASCII 时才标记, 且 _common 表恒定生效),把说明文档中会被标记的全角标点 (,:;?!() 等)改为半角,并保证成对括号宽度一致。 中文语境中的全角标点(左右均为中文)保持原样,不动代码与契约语义。
1.7 KiB
1.7 KiB
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 通过;状态机与统计逻辑由运行页展示(需真机验证端到端)。