docs(webrtc_controller_flutter): 更新项目文档以反映重构后的架构

AGENTS.md 与 README.md 同步更新:根据实际代码结构重写目录树、技术栈、架构分层及编码规范,移除旧版内联示例并补充新的开发约定与代码生成命令。
This commit is contained in:
2026-08-03 16:12:44 +08:00
parent 1918e5738e
commit d5e66a1777
51 changed files with 4711 additions and 1458 deletions

View File

@@ -9,8 +9,23 @@
- 通过 WebSocket 连接信令服务器并注册为 `CONTROLLER` 设备
- 创建 WebRTC 连接(仅接收远端视频 `recvonly` + 一条控制用 DataChannel
- 显示被控端画面(远端视频流)
- 通过触摸 / 滑动 / 物理按键采集输入转换为相对坐标0.0~1.0)经 DataChannel 发送控制指令TOUCH / SWIPE / KEY
- 通过触摸 / 滑动 / 物理按键采集输入转换为相对坐标0.0~1.0)经 DataChannel 发送控制指令TOUCH / SWIPE / KEY / MOTION_EVENT
- 实时显示连接统计(分辨率、帧率、延迟、解码格式)
- 支持自编码(自建 MediaCodec 解码)与 WebRTC 全托管两种串流模式
- 支持远程视频录制MP4 保存到 app 专属目录)
## 架构
采用 **特性优先Feature-First** + **整洁架构Clean Architecture** 分层:
| 层 | 目录 | 职责 |
| --- | --- | --- |
| 全局 | `lib/app/` | 入口、路由GoRouter、主题、常量 |
| 共享 | `lib/core/` | 网络dio、Protobuf 协议、存储、工具、共享组件 |
| 认证 | `lib/features/auth/` | 登录 / 令牌 / 绑定列表data / domain / presentation |
| 连接 | `lib/features/connection/` | 信令、WebRTC、控制面板data / domain / presentation |
状态管理使用 **Riverpod**`@riverpod` 注解 + 代码生成),路由使用 **go_router**,网络使用 **dio**,数据模型使用 **freezed**
## 运行依赖(跨平台)
@@ -18,22 +33,41 @@
| --- | --- |
| `flutter_webrtc` | WebRTCAndroid + iOS 统一封装) |
| `web_socket_channel` | 信令 WebSocket |
| `uuid` | 生成本机设备 ID |
> 以上包均支持 Android 与 iOS无需编写任何平台原生代码。
| `dio` | HTTP API登录 / 刷新 / 绑定列表 / TURN 凭证) |
| `flutter_riverpod` | 状态管理 |
| `go_router` | 路由 |
| `freezed` + `json_serializable` | 不可变数据模型与 JSON 序列化 |
| `flutter_secure_storage` | 令牌安全存储Keychain / EncryptedSharedPreferences |
## 目录结构
```
lib/
├── config/ice_servers.dart # ICE/TURN/STUN 配置与默认信令地址
├── models/signal_message.dart # 信令消息模型
├── signaling/signaling_client.dart# WebSocket 信令客户端
├── webrtc/webrtc_controller.dart # WebRTC 连接 / DataChannel / 视频渲染 / 统计
├── controller/remote_controller.dart # 编排:信令 + WebRTC 流程
├── utils/control_commands.dart # 控制指令 JSON 构造
├── widgets/remote_touch_view.dart # 触摸/按键采集(纯 Flutter跨平台
└── main.dart # UI设置面板 + 控制面板)
├── main.dart # 入口ProviderScope + runApp
├── app/
│ ├── app.dart # CupertinoApp.router
│ ├── router/app_router.dart # GoRouter/ = 设置页,/control = 控制页)
│ ├── theme/app_theme.dart # 全局主题
│ └── constants/ # 全局常量、ICE 配置
├── core/
│ ├── network/ # dio、ApiException
│ ├── proto/ # Protobuf 生成代码
│ ├── storage/ # 令牌安全存储
│ ├── utils/ # 控制指令、设备工具
│ └── widgets/ # RemoteTouchView 触摸层
├── features/
│ ├── auth/ # 登录 / 令牌
│ └── connection/ # 信令 / WebRTC / 控制面板
└── l10n/ # 国际化(.arb
```
## 代码生成
新增或修改 freezed 模型 / Riverpod 控制器后:
```bash
dart run build_runner build --delete-conflicting-outputs
flutter gen-l10n
```
## 运行
@@ -63,4 +97,4 @@ flutter run -d ios # 需 macOS + Xcode
REGISTER / OFFER / ANSWER / ICE_CANDIDATEpayload 为 JSON 字符串)。
- **被控端**:使用 WebRTCControlledAndroid接收 OFFER 并回传 ANSWER
`InputCommandHandler` 解析 TOUCH / SWIPE / KEY 指令。
- **ICE 服务器**:见 `lib/config/ice_servers.dart`,请按需替换为自己的 TURN 凭据。
- **ICE 服务器**:见 `lib/app/constants/ice_servers.dart`,请按需替换为自己的 TURN 凭据。