市面上主流远程控制工具(ToDesk / 向日葵)多为闭源商业软件,存在账号绑定、流量经第三方、定制受限等痛点。本项目目标是自研一套可私有部署、数据不出内网的轻量远程控制工具,将「受控端 + 控制端」整合进单一程序,覆盖远程操控、画面投射、文件互传、剪贴板共享四大场景,并产出标准 Windows 安装包便于分发与批量部署。
- 远程控制:控制端采集鼠标 / 键盘事件经 WebSocket 下发,受控端用 pynput 注入,实现真实操控;
- 画面投射:受控端 mss 抓屏 → H.264 硬件编码(Intel QSV / NVIDIA NVENC / AMD AMF)软件兜底 → 控制端 WebCodecs 解码渲染到 Canvas;
- 文件互传:左「本机」/ 右「远程」双栏,64KB 分块双向传输,大文件走 512KB 分块桥;
- 剪贴板共享:默认开启双向同步,经 pyperclip 读写系统剪贴板(WebView2 下 navigator.clipboard 无权限的 workaround);
- 设备配对:9 位设备代码 + 6 位访问密码,支持 after_each / daily / manual / never 四档轮换;
- 安装分发:Inno Setup 编译标准 Setup.exe(中文安装向导 + /VERYSILENT 静默分发 + ARP 卸载项 + unins000.exe)。
1,采用「受控端 — 中转服务器 — 控制端」三层结构。受控端为 Python 编写的单一 exe(pywebview 承载 Edge WebView2 界面 + 内嵌 Agent),依赖 mss 抓屏、pynput 注入键鼠、pyperclip 剪贴板、PyAV(FFmpeg) 做 H.264 编码;服务端为 Node.js(Express + ws)实现的信令 / 哑中继,只转发不解析业务;控制端复用浏览器或 exe 内嵌 WebView2。二进制通道由首字节标识(0x00 视频帧 / 0x01 文件块 / 0x04–0x05 H.264 帧)。打包走 PyInstaller onedir + Inno Setup,公网部署在腾讯云 Lighthouse(Ubuntu 24.04 + Nginx 反代 + PM2)。
2,- 画面编码由逐帧 JPEG 改为 H.264 + P 帧(帧间预测),端到端实测平均帧字节 3.9KB vs 54.2KB,带宽降至约 1/13;4Mbps 上行从 1~2fps 提升至可持续帧率;
- 通过 PSNR 量化归因把色度采样从 4:2:0 换为 4:4:4,RGB PSNR 33.23 → 52.08dB(+18.9dB),根治「画面发糊」的主观投诉;
- 安装包用 lzma2 固实压缩,从 80MB 压到 ~25MB(旧 PyInstaller 假安装包约 58MB 且易崩);
- 建立「安装包端到端 + 真实启动冒烟」两道验证门禁,自研启动器状态自愈机制 11/11 用例通过。
3,- 画面模糊误判:曾以为是编码器 / 质量档位问题,实测两个不同编码器都撞在 4:2:0 同一天花板(调档仅 +0.05dB),最终靠 PSNR 量化定位根因是色度,换 yuv444p 解决;
- 安装包假 PASS:早期把 Python 写的向导打成 58MB「假安装包」,无 WebView2 环境直接崩溃,废弃后改用 Inno Setup 标准 Setup.exe;
- 验证脚本踩坑:子串匹配误判同机「向日葵」、死链也算 PASS、桌面路径写死导致误删用户 ARP 记录 —— 逐一改为精确匹配 / 解析 .lnk 目标 / 读注册表 User Shell Folders / 只删指向已不存在目录的项;
- 打包资源定位:PyInstaller 6.x 把 data 放进 _internal,VERSION / LICENSE 读不到导致版本号 0.0.0,改为多候选目录探测;
- 部署高频坑:Nginx 的 /ws 反代误指旧 v1 信令 :8765 会导致握手成功但收不到 peer_ready、画面永久卡「正在连接」,已写入部署清单强制复查。