5.7 KiB
5.7 KiB
DisplayFlow 架构设计文档
本文档详细描述 DisplayFlow 系统的架构设计。
1. 整体架构
DisplayFlow 采用分层架构设计,从下到上分为:
- 传输层(Transport Layer):物理网络连接
- 局域网连接(USB RNDIS、Wi-Fi、以太网)
- 互联网连接(通过 STUN/TURN/ICE)
- 核心层(Core Layer):跨平台业务逻辑
- 平台适配层(Platform Adapter Layer):平台特定实现
- 角色层(Role Layer):业务角色实现
- 应用层(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 数据流
- 平台层捕获屏幕帧
- 编码器编码视频帧
- 协议层序列化
- 网络层发送
- 客户端网络层接收
- 协议层反序列化
- 解码器解码
- 平台层渲染
5.2 Client -> Host 输入流
- 平台层捕获输入事件
- 协议层序列化
- 网络层发送
- 主机网络层接收
- 协议层反序列化
- 平台层注入输入事件
5.3 文件传输流
- 发送端选择文件
- 文件分块(Chunk)
- 协议层封装文件块
- 网络层发送(可靠传输)
- 接收端接收并重组
- 文件完整性校验
- 保存到目标位置
5.4 远程摄像头流
- Host 端枚举摄像头设备
- 选择并启动摄像头
- 摄像头捕获视频帧
- 编码器编码(复用屏幕共享编码器)
- 协议层序列化
- 网络层发送
- Client 端接收、解码、渲染
- 显示摄像头画面(可叠加在屏幕共享上)
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 服务器配置
连接建立流程:
-
候选地址收集
- 收集本地网络接口地址
- 通过 STUN 服务器获取服务器反射地址
- 通过 TURN 服务器获取中继地址
-
ICE 连接检查
- 向所有候选地址发送连接检查
- 等待对端响应
- 测量延迟和带宽
-
路径选择
- 优先选择局域网直连(延迟最低)
- 其次选择公网直连(通过 STUN)
- 最后选择 TURN 中继(最可靠但延迟较高)
-
连接建立
- 使用选定的路径建立连接
- 开始数据传输
协议支持:
- 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 连接超时时间
- 候选地址收集超时时间
使用场景:
- 局域网场景:自动检测并使用局域网直连(最快)
- 互联网场景:通过 STUN/TURN 服务器建立连接
- 混合场景:优先尝试局域网,失败后自动切换到互联网连接
集成方式:
- NAT 穿透模块集成到网络抽象层
- 对上层应用完全透明
- 自动选择最佳连接路径
- 支持连接方式动态切换