213 lines
5.7 KiB
Markdown
213 lines
5.7 KiB
Markdown
# DisplayFlow 架构设计文档
|
||
|
||
本文档详细描述 DisplayFlow 系统的架构设计。
|
||
|
||
## 1. 整体架构
|
||
|
||
DisplayFlow 采用分层架构设计,从下到上分为:
|
||
|
||
1. **传输层(Transport Layer)**:物理网络连接
|
||
- 局域网连接(USB RNDIS、Wi-Fi、以太网)
|
||
- 互联网连接(通过 STUN/TURN/ICE)
|
||
2. **核心层(Core Layer)**:跨平台业务逻辑
|
||
3. **平台适配层(Platform Adapter Layer)**:平台特定实现
|
||
4. **角色层(Role Layer)**:业务角色实现
|
||
5. **应用层(Application Layer)**:用户界面和应用逻辑
|
||
|
||
**网络连接方式:**
|
||
- **局域网直连**:优先使用,延迟最低(< 5ms)
|
||
- **公网直连**:通过 STUN 发现,中等延迟(10-50ms)
|
||
- **TURN 中继**:当直连失败时使用,延迟较高(50-200ms)但最可靠
|
||
|
||
## 2. 核心层设计
|
||
|
||
### 2.1 网络抽象层
|
||
|
||
提供统一的网络接口,屏蔽底层网络差异。
|
||
|
||
**NAT 穿透模块:**
|
||
- **STUN 客户端**:用于 NAT 类型检测和获取公网 IP 地址
|
||
- **TURN 客户端**:当直连失败时,通过 TURN 服务器中继流量
|
||
- **ICE 代理**:实现 ICE (Interactive Connectivity Establishment) 协议
|
||
- 收集候选地址(本地、服务器反射、中继)
|
||
- 执行连接检查
|
||
- 选择最佳连接路径
|
||
- **连接建立**:自动尝试多种连接方式,选择最优路径
|
||
|
||
### 2.2 协议层
|
||
|
||
基于 FlatBuffers 的跨平台序列化协议。
|
||
|
||
### 2.3 会话管理层
|
||
|
||
管理显示会话的生命周期。
|
||
|
||
### 2.4 编解码抽象层
|
||
|
||
统一的编解码器接口,支持多种编解码器。
|
||
|
||
### 2.5 文件传输模块
|
||
|
||
提供设备间文件传输功能:
|
||
- 文件传输协议定义
|
||
- 断点续传机制
|
||
- 多文件并发传输
|
||
- 传输进度跟踪
|
||
- 文件完整性校验
|
||
|
||
## 3. 平台适配层设计
|
||
|
||
### 3.1 Android 适配层
|
||
|
||
- 屏幕捕获:MediaProjection API
|
||
- 摄像头捕获:Camera2 API / NDK Camera API
|
||
- 输入处理:触摸事件
|
||
- 网络:USB RNDIS、Wi-Fi
|
||
|
||
### 3.2 Windows 适配层
|
||
|
||
- 虚拟显示器:IddCx 驱动框架
|
||
- 摄像头捕获:DirectShow / Media Foundation
|
||
- 渲染:DirectX
|
||
- 输入处理:键盘、鼠标
|
||
- 网络:USB RNDIS、Wi-Fi、以太网
|
||
|
||
## 4. 角色层设计
|
||
|
||
### 4.1 Host 角色
|
||
|
||
负责屏幕捕获、编码、发送。
|
||
|
||
### 4.2 Client 角色
|
||
|
||
负责接收、解码、渲染。
|
||
|
||
### 4.3 Peer 角色
|
||
|
||
同时运行 Host 和 Client 逻辑。
|
||
|
||
## 5. 数据流
|
||
|
||
### 5.1 Host -> Client 数据流
|
||
|
||
1. 平台层捕获屏幕帧
|
||
2. 编码器编码视频帧
|
||
3. 协议层序列化
|
||
4. 网络层发送
|
||
5. 客户端网络层接收
|
||
6. 协议层反序列化
|
||
7. 解码器解码
|
||
8. 平台层渲染
|
||
|
||
### 5.2 Client -> Host 输入流
|
||
|
||
1. 平台层捕获输入事件
|
||
2. 协议层序列化
|
||
3. 网络层发送
|
||
4. 主机网络层接收
|
||
5. 协议层反序列化
|
||
6. 平台层注入输入事件
|
||
|
||
### 5.3 文件传输流
|
||
|
||
1. 发送端选择文件
|
||
2. 文件分块(Chunk)
|
||
3. 协议层封装文件块
|
||
4. 网络层发送(可靠传输)
|
||
5. 接收端接收并重组
|
||
6. 文件完整性校验
|
||
7. 保存到目标位置
|
||
|
||
### 5.4 远程摄像头流
|
||
|
||
1. Host 端枚举摄像头设备
|
||
2. 选择并启动摄像头
|
||
3. 摄像头捕获视频帧
|
||
4. 编码器编码(复用屏幕共享编码器)
|
||
5. 协议层序列化
|
||
6. 网络层发送
|
||
7. Client 端接收、解码、渲染
|
||
8. 显示摄像头画面(可叠加在屏幕共享上)
|
||
|
||
## 6. 扩展功能设计
|
||
|
||
### 6.1 文件传输模块
|
||
|
||
**架构设计:**
|
||
- 复用现有的网络抽象层和协议层
|
||
- 使用可靠传输协议(TCP 或可靠 UDP)
|
||
- 支持断点续传,记录传输状态
|
||
- 多文件队列管理,支持优先级
|
||
|
||
**协议设计:**
|
||
- 文件元数据(文件名、大小、校验和)
|
||
- 文件块(Chunk)传输
|
||
- 传输控制消息(开始、暂停、恢复、取消)
|
||
- 进度报告机制
|
||
|
||
### 6.2 远程摄像头模块
|
||
|
||
**架构设计:**
|
||
- 复用现有的编码和传输机制
|
||
- 摄像头作为新的视频源类型
|
||
- 支持与屏幕共享同时进行(多路视频流)
|
||
- 摄像头参数控制(分辨率、帧率、对焦、曝光等)
|
||
|
||
**实现方式:**
|
||
- Android:使用 Camera2 API 或 NDK Camera API
|
||
- Windows:使用 DirectShow 或 Media Foundation
|
||
- 视频流复用屏幕共享的编码和传输通道
|
||
- 在协议中区分视频源类型(屏幕/摄像头)
|
||
|
||
### 6.3 NAT 穿透模块(TURN/STUN)
|
||
|
||
**架构设计:**
|
||
- 集成到网络抽象层,对上层透明
|
||
- 支持局域网、公网直连、TURN 中继三种连接方式
|
||
- 自动选择最佳连接路径
|
||
- 支持自定义 STUN/TURN 服务器配置
|
||
|
||
**连接建立流程:**
|
||
|
||
1. **候选地址收集**
|
||
- 收集本地网络接口地址
|
||
- 通过 STUN 服务器获取服务器反射地址
|
||
- 通过 TURN 服务器获取中继地址
|
||
|
||
2. **ICE 连接检查**
|
||
- 向所有候选地址发送连接检查
|
||
- 等待对端响应
|
||
- 测量延迟和带宽
|
||
|
||
3. **路径选择**
|
||
- 优先选择局域网直连(延迟最低)
|
||
- 其次选择公网直连(通过 STUN)
|
||
- 最后选择 TURN 中继(最可靠但延迟较高)
|
||
|
||
4. **连接建立**
|
||
- 使用选定的路径建立连接
|
||
- 开始数据传输
|
||
|
||
**协议支持:**
|
||
- STUN (Session Traversal Utilities for NAT) - RFC 5389
|
||
- TURN (Traversal Using Relays around NAT) - RFC 5766
|
||
- ICE (Interactive Connectivity Establishment) - RFC 8445
|
||
|
||
**配置选项:**
|
||
- STUN 服务器地址和端口
|
||
- TURN 服务器地址、端口、用户名、密码
|
||
- ICE 连接超时时间
|
||
- 候选地址收集超时时间
|
||
|
||
**使用场景:**
|
||
1. **局域网场景**:自动检测并使用局域网直连(最快)
|
||
2. **互联网场景**:通过 STUN/TURN 服务器建立连接
|
||
3. **混合场景**:优先尝试局域网,失败后自动切换到互联网连接
|
||
|
||
**集成方式:**
|
||
- NAT 穿透模块集成到网络抽象层
|
||
- 对上层应用完全透明
|
||
- 自动选择最佳连接路径
|
||
- 支持连接方式动态切换
|
||
|