Files
DisplayFlow/docs/ARCHITECTURE.md

213 lines
5.7 KiB
Markdown
Raw Normal View History

2025-12-11 22:58:25 +08:00
# 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 穿透模块集成到网络抽象层
- 对上层应用完全透明
- 自动选择最佳连接路径
- 支持连接方式动态切换