Files
DisplayFlow/docs/ARCHITECTURE.md
2025-12-11 22:58:25 +08:00

5.7 KiB
Raw Permalink Blame History

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 穿透模块集成到网络抽象层
  • 对上层应用完全透明
  • 自动选择最佳连接路径
  • 支持连接方式动态切换