# WebRTC 控制端 (webrtc_controller_flutter)

将原生 Android 项目 **WebRTCController** 的功能移植到 Flutter，使用**跨平台**依赖，可同时运行于 **Android** 与 **iOS**。

## 功能

对应原 Android 控制端（WebRTCController）的能力：

- 通过 WebSocket 连接信令服务器并注册为 `CONTROLLER` 设备
- 创建 WebRTC 连接（仅接收远端视频 `recvonly` + 一条控制用 DataChannel）
- 显示被控端画面（远端视频流）
- 通过触摸 / 滑动 / 物理按键采集输入，转换为相对坐标（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**。

## 运行依赖（跨平台）

| 包 | 用途 |
| --- | --- |
| `flutter_webrtc` | WebRTC（Android + iOS 统一封装） |
| `web_socket_channel` | 信令 WebSocket |
| `dio` | HTTP API（登录 / 刷新 / 绑定列表 / TURN 凭证） |
| `flutter_riverpod` | 状态管理 |
| `go_router` | 路由 |
| `freezed` + `json_serializable` | 不可变数据模型与 JSON 序列化 |
| `flutter_secure_storage` | 令牌安全存储（Keychain / EncryptedSharedPreferences） |

## 目录结构

```
lib/
├── 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
```

## 运行

```bash
flutter pub get
flutter run          # 默认运行到已连接设备
flutter run -d android
flutter run -d ios   # 需 macOS + Xcode
```

### iOS 注意事项

- 本项目已补齐 `ios/Podfile`（基于当前 Flutter 版本官方模板）。
  在 macOS 上首次构建会自动执行 `pod install` 拉取 `flutter_webrtc`。
- 为支持开发环境的 `ws://` 明文信令，`ios/Runner/Info.plist` 已添加
  `NSAppTransportSecurity -> NSAllowsArbitraryLoads = true`（生产环境建议改用 `wss://`）。

### Android 注意事项

- `android/app/src/main/AndroidManifest.xml` 已添加 `INTERNET` 权限与
  `android:usesCleartextTraffic="true"`（支持 `ws://`）。

## 对接说明

- **信令服务器**：需与 WebRTCControlled 项目共用同一套信令协议
  （REGISTER / OFFER / ANSWER / ICE_CANDIDATE，payload 为 JSON 字符串）。
- **被控端**：使用 WebRTCControlled（Android）接收 OFFER 并回传 ANSWER，
  其 `InputCommandHandler` 解析 TOUCH / SWIPE / KEY 指令。
- **ICE 服务器**：见 `lib/app/constants/ice_servers.dart`，请按需替换为自己的 TURN 凭据。
