project: 增加web和adb控制,未测试

This commit is contained in:
2026-07-17 19:17:10 +08:00
parent 5fb7b58fc3
commit b8edd5eff5
49 changed files with 5061 additions and 0 deletions

View File

@@ -0,0 +1,105 @@
# WebRTC 网页远程控制 (WebRTCControllerWeb)
基于 **Vue3 + Vite** 的 WebRTC 网页远程控制端,参考并兼容以下既有项目:
- `WebRTCSignalServer` —— Java/Spring 信令服务器WebSocket端点 `/ws/signal`
- `WebRTCControlled` —— Android 被控端(采集屏幕、接收控制指令)
- `WebRTCController` / `webrtc_controller_flutter` —— Android / Flutter 控制端
本项目的定位是 **网页版控制端 (CONTROLLER)**与原有信令协议、protobuf 控制协议 **完全兼容**
- 通过 WebSocket 连接信令服务器并注册为 `CONTROLLER`
- 作为 OFFER 方创建 WebRTC 连接(仅接收远端视频 `recvonly` + 一条控制用 `DataChannel`
- 在浏览器中显示被控端画面,并通过触摸/鼠标/导航按键采集输入
- 将输入转换为相对坐标 (0.0~1.0) 的 protobuf `ControlMessage`,经 DataChannel 发送给被控端执行
## 目录结构
```
WebRTCControllerWeb/
├── index.html
├── package.json
├── vite.config.js
├── public/
│ └── control_message.proto # 与 Android/Flutter 完全一致的 protobuf 定义
├── server/ # 可选:轻量 Node 信令服务器(与 Spring 版协议一致)
│ ├── index.js
│ └── package.json
└── src/
├── main.js
├── App.vue
├── style.css
├── proto/controlMessage.js # protobufjs 运行时编码
├── services/
│ ├── SignalingClient.js # WebSocket 信令(对应 Android WebSocketClient
│ └── WebRtcController.js # WebRTC + DataChannel对应 WebRtcClient
├── store/controllerStore.js # 全局状态与流程编排(对应 RemoteController
└── components/
├── ConnectionPanel.vue # 信令连接 / 设备列表 / 发起控制
├── RemoteScreen.vue # 远端视频 + 触摸/滑动采集层
├── ControlBar.vue # 主页/返回/多任务/音量/电源等导航键
└── StatsBar.vue # 连接统计(分辨率/帧率/下载速率等)
```
## 运行
### 1. 准备信令服务器(二选一)
**方式 A复用现有 Spring 信令服务器**
直接启动 `WebRTCSignalServer` 即可(默认 `ws://<host>:8088/ws/signal`)。
**方式 B使用本项目自带的 Node 信令服务器**
```bash
cd server
npm install
npm start # 监听 ws://localhost:8088/ws/signal
```
### 2. 启动被控端
在安卓设备安装并运行 `WebRTCControlled`,保持其在线并连接到同一信令服务器。
### 3. 启动网页控制端
```bash
cd WebRTCControllerWeb
npm install
npm run dev # 默认 http://localhost:5173
```
> 浏览器需支持 WebRTC。本地 `http://localhost` 可直接使用;
> 部署到远程地址时建议使用 `https://` 与 `wss://`,否则部分浏览器会拦截。
### 4. 使用
1. 左侧填写信令服务器地址与「本机设备 ID」已自动生成随机 ID
2. 点击「连接信令服务器」,再点击「刷新设备列表」获取在线被控端。
3. 选择目标设备,点击「发起远程控制」。
4. 被控端弹出连接请求并「接受」后,右侧出现屏幕画面。
5. 在画面上 **触摸/滑动** 即可操控;底部按钮对应系统导航键(主页/返回/多任务/菜单/音量/电源)。
## 控制协议要点
- **信令消息**`SignalMessage``type / fromDeviceId / toDeviceId / deviceType / payload(JSON 字符串)`
类型含 `REGISTER / OFFER / ANSWER / ICE_CANDIDATE / DEVICE_LIST` 等。
- **DataChannel** 标签固定为 `control_channel`,创建参数 `ordered:false, maxRetransmits:0`(非可靠、无序,最低延迟)。
- **控制指令**`ControlMessage`protobuf 二进制):
- `TOUCH=1` 单击x,y
- `SWIPE=2` 滑动x1,y1,x2,y2,duration
- `KEY=3` 按键key_code被控端自动完成 按下+抬起)
- `LONG_PRESS=4` 长按x,y
- `MOTION_EVENT=5` 原始指针动作motion_action: 0=DOWN/1=UP/2=MOVEx,y
坐标均为相对屏幕百分比 (0.0~1.0),因此不同分辨率设备间可直接换算。
## 与原有项目的对应关系
| 能力 | Android/Flutter | 本项目 (Vue3) |
| --- | --- | --- |
| 信令注册 | `WebSocketClient.registerDevice()` | `SignalingClient.register()` |
| 创建连接 | `WebRtcClient.createOffer()` | `WebRtcController.createOffer()` |
| 触摸采集 | `RemoteTouchView` | `RemoteScreen.vue`pointer 事件 + 相对坐标映射) |
| 指令构造 | `ControlCommands` | `WebRtcController.sendTouch/...` + `controlMessage.js` |
| 流程编排 | `MainActivity` / `RemoteController` | `controllerStore.js` |
## 备注
- ICE/TURN 配置见 `src/store/controllerStore.js``DEFAULT_ICE_SERVERS`,请按需替换为你自己的 TURN 凭据。
- 本网页端作为 **控制端**,被控端仍为 Android`WebRTCControlled`)。