# OS-proj **Repository Path**: tom0078/os-proj ## Basic Information - **Project Name**: OS-proj - **Description**: 国科大高级操作系统大作业 - **Primary Language**: C - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-22 - **Last Updated**: 2026-01-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RISC-V openEuler 无线投屏工具开发技术文档 **课程名称:** 高级操作系统教程 **实验名称:** 实验5:RISC-V openEuler 无线投屏工具开发 **小组成员:** 雷昊川,李志明,聂平川 **汇报时间:** 2026年1月22日 --- ## 一、项目介绍 ### 1.1 项目背景 本项目是高级操作系统教程的实验作业,旨在开发基于 openEuler 操作系统的 RISC-V 架构笔记本电脑(RVBook)的无线投屏工具。 ### 1.2 实验目标 开发 openEuler 到安卓系统大屏的无线投屏工具,实现 RVBook(基于 openEuler 操作系统的 RISC-V 架构笔记本电脑)上的屏幕内容、演示文档、图片、视频实时显示在华为智慧屏、其他大屏上或者 Windows 系统电脑。 具体要求包括: - 工具操作简单,提供用户友好的操作界面 - 确保数据安全 - 实现高清、流畅播放 --- ## 二、遇到的问题与尝试 在正式实现之前,我们尝试了多种技术方案,但均遇到了不同程度的问题。 ### 2.1 Miraclecast 方案尝试 我们首先调研了实验文档中提示的 Miraclecast 协议库,参考社区的「miraclecast as source」相关步骤进行配置。 **连接过程:** 1. P2P 扫描成功启动 2. 成功扫描到附近的无线节点 3. 发现 P2P 设备后,将其识别为 peer 对象 4. 尝试使用 PBC(Push Button Configuration)方式建立连接 **失败原因:** Windows 11 的 Miracast 实现不支持 PBC 认证方式,连接请求被拒绝。 ``` DEBUG: supplicant: connect to 5e:b4:7e:98:f0:c6 via pbc TRACE: wpa: raw message: FAIL ``` ### 2.2 RTSP 协议握手尝试 由于 Windows 11 不接受 PBC 请求,我们尝试通过 RTSP 协议进行连接。 **操作步骤:** 1. 确认两台设备可以互相 ping 通 2. 运行 Python 脚本尝试连接 Windows 11 的 7236 端口 **失败原因:** 报错 `[Errno 111] Connection refused`。尽管 Windows 端已打开"连接"应用,但仍未能成功绑定 TCP 监听端口,经分析为网络端口冲突导致。 ### 2.3 Wi-Fi Direct P2P 建组尝试 Miraclecast 的 P2P 扫描模式要求关闭 wpa 协议,在扫描过程中由 Miraclecast 自行建立 wpa 通道进行连接。我们跳过 Miraclecast,直接使用 wpa_supplicant 尝试建立 Wi-Fi Direct 连接。 **结果:** 配置完成后可以发现投屏设备,但 Windows 11 无法响应,强制建组报错 FAIL。 **失败原因:** 经查阅确认,板载网卡驱动被编译为"单接口模式",物理上不支持多角色并发模式。重新烧录系统后依旧如此,我们被迫彻底放弃标准的 Wi-Fi Direct 直连方案。 ### 2.4 Deskreen 方案尝试 我们尝试在 openEuler 的 riscv64 平台上部署 Deskreen。 **遇到的问题:** 1. **Node.js 安装问题:** nvm 在 riscv64 上无法获取官方 Node 二进制,只能走源码编译,触发不兼容的编译选项和 libstdc++ 版本错误。 2. **架构不支持:** Deskreen 依赖的 Electron 和 electron-builder 明确不支持 riscv64 架构: ``` 无效的选项值:选项名称: arch, 传入的值: "riscv64", 可选的值:"ia32", "x64", "armv7l", "arm64", "all" ``` 3. **运行时依赖:** 即使通过更换镜像、跳过构建脚本完成安装,核心 Electron 运行时依然无法工作。 **结论:** Deskreen 的核心问题是当前生态对 riscv64 桌面应用的结构性不支持。 --- ## 三、最终解决方案 经过上述方案的尝试,我们发现对系统环境与硬件能力的依赖较高。在 RISC-V 架构以及 openEuler 系统下,受限于网卡驱动能力和系统的服务支持,传统投屏方案难以稳定实现。 因此,我们决定重新寻找更加灵活与可控的投屏方案,最终选择使用 **FFmpeg** 与 **x11vnc** 两种方案,在对底层依赖较少的情况下,实现了屏幕的实时显示。 ### 3.1 FFmpeg 方案 基于 FFmpeg 的方案主要通过对 RVBook 的桌面进行实时采集和编码,并将编码后的视频流通过 UDP 网络发送到 Windows 端进行播放。 **技术栈架构:** | 层级 | 使用技术/协议 | 关键作用 | |------|--------------|---------| | 交互层 | Qt 5 | 封装复杂指令,提供用户友好的 GUI | | 处理层 | FFmpeg | 屏幕捕获与多线程切片编码 (Slices) | | 编码层 | H.264 (Baseline) | 禁用 B 帧,从编码源头消除解码等待时间 | | 传输层 | UDP | 牺牲可靠性换取毫秒级低延迟 | | 网络层 | Infrastructure (WLAN) | 绕过 Realtek 网卡不支持 P2P 并发的驱动缺陷 | **方案优势:** - 利用 FFmpeg 强大的编解码能力 - UDP 传输实现低延迟 - H.264 Baseline Profile 禁用 B 帧减少延迟 ### 3.2 x11vnc 方案 第二种方案通过 x11vnc 进行远程桌面投屏,RVBook 作为 Server,Windows 设备作为 Viewer,实现完整桌面的实时显示。 **技术栈架构:** | 层级 | 使用技术/协议 | 关键作用 | |------|--------------|---------| | 交互层 | Qt 5 | 封装复杂指令,提供用户友好的 GUI | | 处理层 | X11 + x11vnc | 直接从 X11 Framebuffer 抓取桌面,绕过 Wayland、GPU 与 Chromium 依赖 | | 编码层 | RFB Protocol(Raw / Tight / ZRLE) | 轻量级编码与会话管理,CPU 即可完成,支持 view-only / shared | | 传输层 | TCP | 保证画面完整性与稳定性,避免丢帧导致显示异常 | | 网络层 | Infrastructure WLAN / Ethernet | 完全绕过 Wi-Fi P2P / WPS / DHCP,规避无线驱动缺陷 | **方案优势:** - 部署更加简单 - 稳定性更好 - Windows 端只需通用的 VNC 客户端就可以完成连接 --- ## 四、QT 界面设计 为了封装复杂的配置命令,提供用户友好的操作界面,我们基于 Qt 5 设计了用户管理界面。 ### 4.1 项目结构 ``` UserManager/ ├── main.cpp # 程序入口 ├── mainwindow.h # 主窗口头文件 ├── mainwindow.cpp # 主窗口实现(核心界面逻辑) ├── user.h # 用户/设备抽象类 ├── usermanager.h # 用户管理器头文件 ├── usermanager.cpp # 用户管理器实现 ├── mainwindow.ui # Qt Designer UI 文件 ├── CMakeLists.txt # CMake 构建配置 └── build/ # 构建输出目录 ``` ### 4.2 核心模块说明 #### 4.2.1 MainWindow 类 `MainWindow` 继承自 `QMainWindow`,负责整个用户管理界面的显示以及所有用户交互逻辑的处理。 **主要功能:** - 处理按钮点击事件 - 操作用户数据 - 启动/关闭投屏进程 - 同步 UI 状态 **私有成员:** - 用于管理 Qt Designer 设计的 UI 元素 - 控制投屏的外部进程对象 #### 4.2.2 User 类 `User` 类对一个可投屏的用户或设备进行了抽象,封装了设备的基本信息和连接参数。 #### 4.2.3 UserManager 类 `UserManager` 类封装了各个操作的接口,用于统一管理通过 `User` 抽象出来的所有设备,提供设备的增删改查功能。 --- ## 五、工作流程 ### 5.1 系统工作流程 1. **用户启动应用:** 运行 Qt 界面程序 2. **选择投屏方式:** 用户可选择 FFmpeg 或 x11vnc 方案 3. **配置目标设备:** 输入目标设备的 IP 地址等连接参数 4. **启动投屏:** 点击开始按钮,程序调用相应的投屏进程 5. **win打开接收:** 在下载的ffmpeg的bin目录下打开终端,运行以下命令行.\ffplay.exe -f h264 -fflags nobuffer -flags low_delay -framedrop -strict experimental -probesize 32 -analyzeduration 0 -sync ext -vf "setpts=0" udp://0.0.0.0:20000 6. **实时显示:** 屏幕内容实时传输到目标设备 7. **停止投屏:** 用户点击停止按钮,终止投屏进程 ### 5.2 开发工作流程 1. **需求分析与方案调研:** 研究 Miraclecast、RTSP、Wi-Fi Direct 等方案 2. **问题定位与方案迭代:** 分析各方案在 RISC-V + openEuler 环境下的问题 3. **最终方案确定:** 选择 FFmpeg 和 x11vnc 作为实现方案 4. **界面开发:** 使用 Qt 5 开发用户友好的操作界面 5. **集成测试:** 在 RVBook 上进行完整功能测试 --- ## 六、组内分工 | 成员 | 分工内容 | |------|---------| | 雷昊川 | 前期技术调研,x11vnc 投屏方案的设计与实现,投屏效果优化,技术文档编写 | | 李志明 | 前期技术调研,FFmpeg 投屏方案的设计与实现,投屏效果优化,技术文档编写 | | 聂平川 | 前期技术调研,Qt 用户界面的设计与开发,投屏方案的整合,投屏效果优化,技术文档编写 | --- ## 七、总结 本项目成功实现了基于 RISC-V 架构 openEuler 系统的无线投屏工具。在开发过程中,我们遇到了网卡驱动不支持 P2P 并发模式、Electron 不支持 riscv64 架构等一系列问题。通过不断尝试和方案迭代,最终采用 FFmpeg 和 x11vnc 两种方案,成功实现了 RVBook 到 Windows 设备的实时屏幕投屏功能,并通过 Qt 5 提供了用户友好的操作界面。 ---