Lan Mouse技术深度解析:跨平台键鼠共享架构剖析
Lan Mouse技术深度解析:跨平台键鼠共享架构剖析
【免费下载链接】lan-mousemouse & keyboard sharing via LAN项目地址: https://gitcode.com/gh_mirrors/la/lan-mouse
Lan Mouse是一款基于Rust语言开发的跨平台鼠标键盘共享软件,通过局域网实现多台计算机间的输入设备共享。该项目采用模块化架构设计,支持Wayland、X11、Windows和macOS等多种桌面环境,提供了高性能、安全的软件KVM解决方案。
技术架构与实现原理
核心架构设计
Lan Mouse采用事件驱动的双向通信架构,每个实例既能发送也能接收输入事件。系统架构分为四个核心组件:输入捕获、事件发射器、事件接收器和事件分发器,形成完整的事件处理流水线。
输入组件(Input):负责将不同后端的输入事件转换为标准化格式。每个平台后端(Wayland、X11、Windows、macOS)生成原生事件,输入组件进行统一抽象化处理。
事件发射器(Emitter):序列化标准化事件并通过UDP网络发送到目标客户端。采用异步I/O模型确保低延迟传输。
事件接收器(Receiver):接收网络事件并反序列化为标准化事件格式,处理网络抖动和丢包情况。
事件分发器(Dispatcher):将标准化事件分发给对应平台的后端进行模拟执行,确保事件在目标系统正确执行。
设备状态管理机制
Lan Mouse采用严格的设备状态管理来防止事件循环问题。每个设备只能处于两种状态之一:主动发送事件或被动接收事件。这种设计确保:
- 事件不会形成反馈循环
- 虚拟输入进入其他客户端时,Lan Mouse自动停止接收事件
- 客户端只能被直接控制,不能通过其他客户端间接控制
状态管理实现在src/client.rs中,通过CaptureType枚举定义不同的捕获类型:
Normal:标准输入捕获BeginOnly:仅关注捕获开始事件Disabled:捕获禁用状态
Lan Mouse深色主题界面展示设备连接管理和安全认证机制
多平台后端支持架构
输入捕获后端实现
Lan Mouse支持多种输入捕获后端,根据运行环境自动选择最合适的实现:
Layer-shell后端:针对Wayland环境,利用wlr-layer-shell-unstable-v1协议在显示器边缘创建单像素窗口捕获光标移动。该实现在input-capture/src/layer_shell.rs中定义,特别适合wlroots合成器如Sway、Hyprland。
Libei后端:使用libei库(Input Emulation Interface)提供标准化输入捕获,支持GNOME ≥ 45和KDE Plasma ≥ 6.1。实现在input-capture/src/libei.rs中,提供更统一的Wayland输入处理。
Windows后端:针对Windows系统的原生输入捕获,实现在input-capture/src/windows/目录中,包含显示工具和事件处理线程。
macOS后端:macOS系统的输入捕获实现,位于input-capture/src/macos.rs,处理macOS特有的输入事件模型。
输入模拟后端实现
输入模拟后端负责在接收端执行输入事件,同样支持多平台:
Wlroots后端:使用wlr-virtual-pointer-unstable-v1和virtual-keyboard-unstable-v1协议,适用于大多数wlroots合成器。实现在input-emulation/src/wlroots.rs。
XDP后端:通过freedesktop远程桌面门户实现,支持GNOME和KDE桌面环境。位于input-emulation/src/xdg_desktop_portal.rs。
X11后端:传统X11会话的输入模拟,实现在input-emulation/src/x11.rs。
平台原生后端:Windows和macOS的原生输入模拟分别位于input-emulation/src/windows.rs和input-emulation/src/macos.rs。
条件编译与特性管理
Lan Mouse使用Cargo特性系统实现条件编译,允许用户根据需求定制功能。例如,仅需Sway支持时可使用:
cargo build --no-default-features --features layer_shell_capture,wlroots_emulation特性配置在项目根目录的Cargo.toml中定义,支持的后端特性包括layer_shell_capture、libei_capture、windows_capture、macos_capture等。
安全通信与加密机制
DTLS加密实现
Lan Mouse使用WebRTC.rs库提供的DTLS实现加密所有网络通信。加密机制实现在src/crypto.rs中,采用证书指纹验证机制确保连接安全。
每个设备生成唯一的证书指纹,格式为"aa:bb:cc:dd:..."的十六进制字符串。连接建立时需要双方设备相互授权,防止未授权设备访问。证书指纹显示在图形界面的"General"部分,便于用户验证。
网络通信协议
系统使用UDP端口4242(可配置)进行事件传输,同时监听TCP端口处理连接请求。这种设计平衡了实时性(UDP)和可靠性(TCP)的需求。
连接协议采用简单的请求-响应模型:
- 客户端发送连接请求(包含密钥)
- 服务器响应确认(包含键盘布局信息)
- 建立双向事件流
Lan Mouse浅色主题界面展示相同的功能布局,支持深色/浅色主题切换
配置管理与持久化
配置文件结构
Lan Mouse使用TOML格式配置文件,位置为~/.config/lan-mouse/config.toml。配置文件支持以下主要配置项:
# 释放绑定键配置 release_bind = [ "KeyA", "KeyS", "KeyD", "KeyF" ] # 通信端口(默认4242) port = 4242 # 已授权证书指纹列表 [authorized_fingerprints] "bc:05:ab:7a:a4:de:88:8c:2f:92:ac:bc:b8:49:b8:24:0d:44:b3:e6:a4:ef:d7:0b:6c:69:6d:77:53:0b:14:80" = "iridium" # 客户端定义 [[clients]] position = "right" hostname = "iridium" activate_on_startup = true ips = ["192.168.178.156"] [[clients]] position = "left" hostname = "thorium" ips = ["192.168.178.189", "192.168.178.172"] port = 4242键码映射系统
键码转换实现在input-event/src/scancode.rs中,处理不同平台的键码差异。特别是macOS键码转换(第172-176行),确保跨平台键位一致性。
性能优化与错误处理
异步任务管理
Lan Mouse使用Tokio异步运行时处理并发任务,主要实现在src/capture.rs和src/emulation.rs中。捕获任务采用spawn_local创建,确保UI响应性。
let task = spawn_local(capture_task.run());错误恢复机制
系统实现多层错误恢复:
- 网络连接断开时自动重连
- 后端故障时尝试备用后端
- 输入捕获失败时重新初始化
错误处理集中在input-capture/src/error.rs和input-emulation/src/error.rs中,定义各后端的特定错误类型。
资源管理
使用DropGuard模式确保资源正确释放,特别是在捕获会话结束时:
let _capture_guard = DropGuard::new(|| { // 清理资源 });部署与系统集成
系统服务配置
Lan Mouse支持作为systemd用户服务运行,服务配置文件位于service/lan-mouse.service。配置示例:
[Unit] Description=Lan Mouse Input Sharing Service After=graphical-session.target [Service] Type=simple ExecStart=/usr/bin/lan-mouse daemon Restart=on-failure [Install] WantedBy=default.target防火墙配置
项目提供firewalld服务定义文件firewall/lan-mouse.xml,简化防火墙配置:
sudo cp firewall/lan-mouse.xml /etc/firewalld/services平台特定依赖
不同平台需要特定依赖库:
- Linux:libadwaita、GTK4、libx11、libxtst
- macOS:libadwaita、pkg-config、ImageMagick
- Windows:GTK运行时环境
技术选型对比分析
与同类工具技术对比
Synergy/Input Leap:基于C++开发,使用自定义协议。Lan Mouse采用Rust实现,内存安全性更高,且使用标准DTLS加密。
Barrier:基于Synergy代码库,同样使用C++。Lan Mouse的模块化架构更易于维护和扩展新后端。
Deskflow:相对较新的项目,Lan Mouse在Wayland支持方面更加成熟,特别是对libei的集成。
架构优势
- 模块化设计:前后端分离,易于添加新平台支持
- 异步架构:基于Tokio的异步处理提供更好的性能
- 安全优先:默认启用DTLS加密,证书指纹验证
- 配置驱动:TOML配置文件支持复杂部署场景
性能考量
Lan Mouse针对低延迟场景优化:
- UDP协议减少握手开销
- 事件序列化使用紧凑二进制格式
- 内存池重用减少分配开销
- 零拷贝设计在可能的情况下
常见问题与解决方案
平台兼容性问题
X11限制:目前仅支持输入模拟,不能作为发送端。计划在路线图中实现完整X11输入捕获。
Wayfire配置:需要添加shortcuts-inhibit插件到wayfire配置,否则输入捕获可能失败。
Windows光标可见性:当Windows系统没有连接物理鼠标时,发送输入可能导致光标不可见。
网络连接问题
- 防火墙配置:确保UDP端口4242(或自定义端口)开放
- 多IP地址:客户端可配置多个IP地址,支持有线/无线网络切换
- DNS解析:支持主机名解析,实现在
src/dns.rs中
性能调优建议
- 使用有线网络:相比Wi-Fi提供更稳定的连接和更低延迟
- 合理布局设备:根据物理位置配置客户端位置(left/right/top/bottom)
- 静态IP分配:避免DHCP变化导致的连接中断
- 释放绑定键配置:配置方便的快捷键组合快速释放鼠标控制
开发与贡献指南
项目结构
lan-mouse/ ├── src/ # 核心逻辑 │ ├── capture.rs # 输入捕获管理 │ ├── client.rs # 客户端状态管理 │ ├── crypto.rs # 加密通信 │ └── ... ├── input-capture/ # 输入捕获后端 ├── input-emulation/ # 输入模拟后端 ├── input-event/ # 事件抽象层 ├── lan-mouse-gtk/ # GTK图形界面 └── lan-mouse-cli/ # 命令行界面开发环境设置
项目使用Rust工具链,建议使用最新稳定版。开发依赖包括:
- Rust 1.70+
- Cargo构建系统
- 平台特定开发库
测试框架
项目包含单元测试和集成测试:
capture_test.rs:输入捕获测试emulation_test.rs:输入模拟测试- 使用
cargo test --workspace --all-features运行所有测试
代码质量保证
项目使用Git预提交钩子(.githooks/pre-commit)确保代码质量:
- 自动代码格式化(cargo fmt)
- Clippy静态分析
- 运行所有测试用例
技术展望与路线图
当前开发重点包括:
- X11输入捕获:完整X11支持
- 延迟测量:网络延迟可视化工具
- 带宽监控:网络使用量统计
- 剪贴板共享:跨设备剪贴板同步
Lan Mouse作为开源跨平台输入共享解决方案,通过模块化架构、安全通信和广泛平台支持,为多设备工作环境提供了可靠的技术基础。其Rust实现确保了高性能和内存安全,而活跃的社区开发保证了项目的持续演进。
项目采用Apache 2.0许可证,欢迎开发者通过GitCode仓库参与贡献,共同完善这一跨平台输入共享工具。
【免费下载链接】lan-mousemouse & keyboard sharing via LAN项目地址: https://gitcode.com/gh_mirrors/la/lan-mouse
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
