Skip to content

Commit 3c223fa

Browse files
committed
merge dev
2 parents c73c8a0 + c303a3f commit 3c223fa

27 files changed

+1279
-175
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
./devices.json
44
/dist/
55
/build/
6-
*.spec
76
**/*.key
87
**/*.pyc
98
**/*.db

deviceShare.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77

88
class RoleSelectionDialog(QDialog):
9+
"""
10+
身份选择对话框
11+
"""
912
def __init__(self):
1013
super().__init__()
1114

@@ -31,10 +34,18 @@ def __init__(self):
3134
self.selected_role = None
3235

3336
def select_server(self):
37+
"""
38+
选择主控机
39+
:return:
40+
"""
3441
self.selected_role = "server"
3542
self.accept()
3643

3744
def select_client(self):
45+
"""
46+
选择被控机
47+
:return:
48+
"""
3849
self.selected_role = "client"
3950
self.accept()
4051

@@ -56,5 +67,7 @@ def main():
5667
print(e)
5768
finally:
5869
app.quit()
70+
71+
5972
if __name__ == "__main__":
6073
main()

deviceShare.spec

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# -*- mode: python ; coding: utf-8 -*-
2+
3+
4+
a = Analysis(
5+
['deviceShare.py'],
6+
pathex=[],
7+
binaries=[],
8+
datas=[],
9+
hiddenimports=['zeroconf._utils.ipaddress','zeroconf._handlers.answers'],
10+
hookspath=[],
11+
hooksconfig={},
12+
runtime_hooks=[],
13+
excludes=[],
14+
noarchive=False,
15+
optimize=0,
16+
)
17+
pyz = PYZ(a.pure)
18+
19+
exe = EXE(
20+
pyz,
21+
a.scripts,
22+
a.binaries,
23+
a.datas,
24+
[],
25+
name='deviceShare',
26+
debug=False,
27+
bootloader_ignore_signals=False,
28+
strip=False,
29+
upx=True,
30+
upx_exclude=[],
31+
runtime_tmpdir=None,
32+
console=True,
33+
disable_windowed_traceback=False,
34+
argv_emulation=False,
35+
target_arch=None,
36+
codesign_identity=None,
37+
entitlements_file=None,
38+
icon='resources/devicelink.ico'
39+
)

readme.md

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
# DeviceShare —— 跨平台多主机输入设备共享
22

33
## 项目介绍
4-
4+
![](https://img.qylh.xyz/blog/1723181688963.png)
55
DeviceShare 是一款跨平台的多主机输入设备共享工具,支持 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 环境,具体步骤如下:
4142
1. 获取项目代码
4243
2. 使用`pip install -r requirements.txt`命令安装依赖
4344
3. 执行`python deviceShare.py`启动程序
45+
<<<<<<< HEAD
4446
4. 安装`pyinstaller`
4547
5. 使用`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
4756
6. 注意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

requirements.txt

-8 Bytes
Binary file not shown.

run.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#!/bin/bash
2+
sudo chmod 666 /dev/input/*
3+
sudo chmod 666 /dev/uinput
4+
sudo chmod 777 ./deviceShare
5+
if [ -n "$WAYLAND_DISPLAY" ]; then
6+
echo "is wayland"
7+
PACKAGE="wl-clipboard"
8+
echo "installing wl-clipboard"
9+
sudo apt install wl-clipboard
10+
export DISPLAY=:0
11+
NOWUSER=$USER
12+
sudo touch /home/$NOWUSER/.Xauthority
13+
xauth generate :0 . trusted >/dev/null 2>&1
14+
XAUTHORITY="/home/$USER/.Xauthority" ./deviceShare >/dev/null 2>&1 &
15+
else
16+
./deviceShare >/dev/null 2>&1 &
17+
fi

0 commit comments

Comments
 (0)