11# DeviceShare —— 跨平台多主机输入设备共享
22
33## 项目介绍
4-
4+ ![ ] ( https://img.qylh.xyz/blog/1723181688963.png )
55DeviceShare 是一款跨平台的多主机输入设备共享工具,支持 Windows、Linux、MacOS 等操作系统,支持在Wayland环境下运行。
66
7+
78通过 DeviceShare,您可以在多台主机之间共享鼠标、键盘、剪贴板等输入设备,实现多台主机之间的输入设备共享。
89
910
@@ -35,34 +36,105 @@ https://github.com/qy-liuhuo/deviceShare/assets/60374114/1b911b8a-976f-4128-9518
3536
3637
3738## 使用说明
38- 针对x86架构的Windows、Kylin、Debian操作系统以及MacOS系统 ,我们打包构建了可执行程序,可在Github Release界面下载合适的版本 。
39+ 针对x86架构的Windows、OpenKylin操作系统 ,我们打包构建了可执行程序,可在Release界面下载合适的版本 。
3940
4041若构建的版本无法支持目标机器,可选择源码运行或自行打包。该方案需具备Python3 环境,具体步骤如下:
41421 . 获取项目代码
42432 . 使用` pip install -r requirements.txt ` 命令安装依赖
43443 . 执行` python deviceShare.py ` 启动程序
45+ <<<<<<< HEAD
44464 . 安装` pyinstaller `
45475 . 使用` pyinstaller ` 打包目标程序
48+ =======
49+ 4 . 安装` pyinstaller ` : ` pip install pyinstaller `
50+ 5 . 使用` pyinstaller ` 打包目标程序: ` pyinstaller deviceShare.spec `
51+ 6 . 运行` dist ` 目录下生成的可执行文件
52+ 7 . 将` resources ` 目录复制到dist目录下
53+ 8 . 若在Linux下运行,采用脚本` run.sh ` 启动程序,将` run.sh ` 复制到dist目录下,执行` sudo chmod 777 run.sh ` 赋予执行权限,执行` bash run.sh ` 启动程序,windows下无需执行此步骤,直接运行exe文件即可
54+ >>>>>>> dev
4655
47566 . 注意Kylin操作系统在安装python的evdev依赖时可能出现错误,请选择安装预编译版本evdev-binary,参考 https://python-evdev.readthedocs.io/en/latest/install.html
4857
58+ ## 控制原理
59+
60+ 1 . 主要基于` pynput ` 进行鼠标和键盘的控制,基于` pyperclip ` 进行剪切板的控制。
61+ 2 . 在` wayland ` 环境下,基于` evdev ` 和` uinput ` 进行鼠标和键盘的控制,基于` wl-clipboard ` 进行剪切板的控制。
4962
5063## 系统架构
5164
52- ![ 1718631831164 .png] ( https://img.qylh.xyz/blog/1718631831164 .png )
65+ ![ 1723181787105 .png] ( https://img.qylh.xyz/blog/1723181787105 .png )
5366
5467项目的整体设计框架如上图所示,整体由四个部分构成:
5568- 服务端为Hid Input设备的拥有者,可向其他客户端主机共享其拥有的输入设备。
5669- 客户端可使用主机共享的输入设备。
5770- 网络通信模块用于服务端和客户端的数据传输。
5871- 设备控制模块用于读取Hid Input设备信息及控制Hid Input设备。
5972
73+ 项目目录结构
74+ ```
75+ DeviceShare
76+ ├── resources # 资源文件
77+ ├── src # 源码
78+ │ ├── communication # 网络通信模块
79+ │ │ ├── client_state.py # 客户端状态
80+ │ │ ├── message.py # 消息定义
81+ │ │ └── my_socket.py # socket封装
82+ │ ├── controller # 设备控制模块
83+ │ │ ├── clipboard_controller.py # 剪切板控制
84+ │ │ ├── keyboard_controller.py # 键盘控制
85+ │ │ └── mouse_controller.py # 鼠标控制
86+ │ ├── gui # GUI界面
87+ │ │ ├── client_gui.py # 客户端GUI
88+ │ │ ├── position.py # 屏幕位置
89+ │ │ ├── screen.py # 屏幕管理
90+ │ │ └── server_gui.py # 服务端GUI
91+ │ ├── utils # 工具模块
92+ │ │ ├── device.py # 设备信息
93+ │ │ ├── device_name.py # 设备名称
94+ │ │ ├── device_storage.py # 设备存储
95+ │ │ ├── key_code.py # 键盘按键
96+ │ │ ├── key_storage.py # 键盘存储
97+ │ │ ├── net.py # 网络工具
98+ │ │ ├── plantform.py # 平台信息
99+ │ │ ├── rsautil.py # RSA加密工具
100+ │ │ └── service_listener.py # 服务监听
101+ │ ├── client.py # 客户端,被控设备
102+ │ └── server.py # 服务端,主控设备
103+ ├── deviceShare.py # 启动程序
104+ ├── run.sh # linux启动脚本
105+ ├── deviceShare.spec # pyinstaller打包配置
106+ ├── keys.db # RSA密钥存储,自动生成
107+ ├── readme.md # 说明文档
108+ ├── requirements.txt # 依赖
109+ └── temp.db # 设备信息存储, 自动生成
110+ ```
111+
112+
60113软件的运行流程如下图所示,客户端与服务端作为两个独立模块单独启动,客户端启动后会向局域网中广播自身信息,
61114服务端收到广播信息后将其加入主机列表,并配置屏幕间的相对位置信息。当服务端主机的光标移出屏幕范围后,会自动判断接下来被控的主机,
62115并将本机输入设备产生的输入拦截,通过网络模块转发给客户端,客户端收到输入信息后响应相应的控制信号。当客户端的光标移出范围后向服务端主机发送事件标志,
63116服务端主机停止控制信号的转发,并恢复输入事件的响应。
64- ![ 1718631845356.png] ( https://img.qylh.xyz/blog/1718631845356.png )
65117
118+ ![ 1723181806729.png] ( https://img.qylh.xyz/blog/1723181806729.png )
119+
120+ 服务端为具备Hid Input设备的主机,由以下几个线程构成:
121+ - 主线程:服务注册及启动其他线程
122+ - TCP监听线程:用于监听处理TCP连接,并为每一个连接创建子线程。
123+ - TCP 处理线程,用于处理与客户端的TCP连接
124+ - 消息监听线程:监听客户端消息,主要为心跳信息和剪切板信息
125+ - 设备监听线程:监听Hid Input设备的输入信息和剪切板信息。
126+ - GUI线程: GUI界面的显示和处理。
127+
128+ ![ 1723181908743.png] ( https://img.qylh.xyz/blog/1723181908743.png )
129+
130+ 客户端为需要使用服务主机的Hid Input设备的主机,由以下几个线程构成:
131+ - 主线程:处理服务发现,发起连接请求,启动其他线程。
132+ - 心跳包线程:定期发送心跳包。
133+ - 消息监听线程:用于接收并响应主机传递的控制信息。
134+ - GUI线程: GUI界面的显示和处理。
135+ - 设备监听线程:用于监听鼠标移出事件及剪切板更新事件。
136+
137+ ![ 1723181937936.png] ( https://img.qylh.xyz/blog/1723181937936.png )
66138
67139## TODO
68140- [x] 主机发现机制
@@ -75,5 +147,9 @@ https://github.com/qy-liuhuo/deviceShare/assets/60374114/1b911b8a-976f-4128-9518
75147- [x] 优化代码质量,提升代码可读性,提升软件性能和稳定性
76148- [x] 测试更多类型操作系统
77149- [x] 优化文档
150+ <<<<<<< HEAD
78151- [ ] 解耦各设备共享模块,支持用户自定义开关相关功能
79152- [ ] 文件拖拽共享功能
153+ =======
154+ - [ ] 文件拖拽共享功能(实现中)
155+ >>>>>>> dev
0 commit comments