Skip to content

Commit e847c09

Browse files
committed
update: readme
1 parent 503e72f commit e847c09

File tree

1 file changed

+149
-2
lines changed

1 file changed

+149
-2
lines changed

README.md

Lines changed: 149 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 基于openKylin的hid input 设备共享协议
1+
# 赛题要求
22

33
##### 作品完成和提交方式:选择本赛题的参赛队伍需要首先复刻(Fork)本项目,然后在复刻的项目中添加参赛队员、合作完成作品开发即可,无需提交PR到赛题项目。如果作品为文档形式,也请将作品文档提交到项目代码库中。在作品完成过程中,围绕作品的相关讨论等可以以疑修(Issue)形式发布和讨论,也可使用里程碑对整个任务进行规划管理。
44

@@ -16,4 +16,151 @@ [email protected]
1616

1717
### 4. 参考资料
1818
1)https://www.kernel.org/doc/html/latest/usb/usbip_protocol.html
19-
2)https://help.ubuntu.com/community/SynergyHowto
19+
2)https://help.ubuntu.com/community/SynergyHowto
20+
21+
22+
23+
# DeviceShare —— 跨平台多主机输入设备共享
24+
25+
## 项目介绍
26+
![](https://img.qylh.xyz/blog/1723181688963.png)
27+
DeviceShare 是一款跨平台的多主机输入设备共享工具,支持 Windows、Linux、MacOS 等操作系统,支持在Wayland环境下运行。
28+
29+
通过 DeviceShare,您可以在多台主机之间共享鼠标、键盘、剪贴板等输入设备,实现多台主机之间的输入设备共享。
30+
31+
32+
## 功能特性
33+
34+
1. **跨平台支持**:支持 Windows、Linux、MacOS 等操作系统。
35+
2. **多主机支持**:支持多台主机之间的输入设备共享。
36+
3. **鼠标共享**:支持鼠标在多台主机之间的共享。
37+
4. **键盘共享**:支持键盘在多台主机之间的共享。
38+
5. **剪贴板共享**:支持剪贴板在多台主机之间的共享。
39+
6. **屏幕位置配置**:支持配置屏幕位置,方便多台主机之间的切换。
40+
7. **主机发现机制**:支持自动发现局域网内的主机。
41+
8. **安全性**:支持公私钥加密机制,支持对剪贴板内容加密传输。
42+
9. **易用性**:支持一键启动,无需复杂配置。
43+
10. **开源免费**:支持开源免费使用。
44+
45+
**演示环境**
46+
![1719817611466.png](https://img.qylh.xyz/blog/1719817611466.png)
47+
48+
**双机演示**
49+
50+
https://github.com/qy-liuhuo/deviceShare/assets/60374114/6e126292-22e0-4d91-bab9-272470689ecd
51+
52+
53+
**三机演示**
54+
55+
https://github.com/qy-liuhuo/deviceShare/assets/60374114/1b911b8a-976f-4128-9518-9c64c73a7a39
56+
57+
58+
59+
## 使用说明
60+
针对x86架构的Windows、OpenKylin操作系统,我们打包构建了可执行程序,可在Release界面下载合适的版本。
61+
62+
若构建的版本无法支持目标机器,可选择源码运行或自行打包。该方案需具备Python3 环境,具体步骤如下:
63+
1. 获取项目代码
64+
2. 使用`pip install -r requirements.txt`命令安装依赖
65+
3. 执行`python deviceShare.py`启动程序
66+
4. 安装`pyinstaller`: `pip install pyinstaller`
67+
5. 使用`pyinstaller`打包目标程序: `pyinstaller deviceShare.spec`
68+
6. 运行`dist`目录下生成的可执行文件
69+
7.`resources`目录复制到dist目录下
70+
8. 若在Linux下运行,采用脚本`run.sh`启动程序,将`run.sh`复制到dist目录下,执行`sudo chmod 777 run.sh`赋予执行权限,执行`bash run.sh`启动程序,windows下无需执行此步骤,直接运行exe文件即可
71+
72+
6. 注意Kylin操作系统在安装python的evdev依赖时可能出现错误,请选择安装预编译版本evdev-binary,参考 https://python-evdev.readthedocs.io/en/latest/install.html
73+
74+
## 控制原理
75+
76+
1. 主要基于`pynput`进行鼠标和键盘的控制,基于`pyperclip`进行剪切板的控制。
77+
2.`wayland`环境下,基于`evdev``uinput`进行鼠标和键盘的控制,基于`wl-clipboard`进行剪切板的控制。
78+
79+
## 系统架构
80+
81+
![1723181787105.png](https://img.qylh.xyz/blog/1723181787105.png)
82+
83+
项目的整体设计框架如上图所示,整体由四个部分构成:
84+
- 服务端为Hid Input设备的拥有者,可向其他客户端主机共享其拥有的输入设备。
85+
- 客户端可使用主机共享的输入设备。
86+
- 网络通信模块用于服务端和客户端的数据传输。
87+
- 设备控制模块用于读取Hid Input设备信息及控制Hid Input设备。
88+
89+
项目目录结构
90+
```
91+
DeviceShare
92+
├── resources # 资源文件
93+
├── src # 源码
94+
│ ├── communication # 网络通信模块
95+
│ │ ├── client_state.py # 客户端状态
96+
│ │ ├── message.py # 消息定义
97+
│ │ └── my_socket.py # socket封装
98+
│ ├── controller # 设备控制模块
99+
│ │ ├── clipboard_controller.py # 剪切板控制
100+
│ │ ├── keyboard_controller.py # 键盘控制
101+
│ │ └── mouse_controller.py # 鼠标控制
102+
│ ├── gui # GUI界面
103+
│ │ ├── client_gui.py # 客户端GUI
104+
│ │ ├── position.py # 屏幕位置
105+
│ │ ├── screen.py # 屏幕管理
106+
│ │ └── server_gui.py # 服务端GUI
107+
│ ├── utils # 工具模块
108+
│ │ ├── device.py # 设备信息
109+
│ │ ├── device_name.py # 设备名称
110+
│ │ ├── device_storage.py # 设备存储
111+
│ │ ├── key_code.py # 键盘按键
112+
│ │ ├── key_storage.py # 键盘存储
113+
│ │ ├── net.py # 网络工具
114+
│ │ ├── plantform.py # 平台信息
115+
│ │ ├── rsautil.py # RSA加密工具
116+
│ │ └── service_listener.py # 服务监听
117+
│ ├── client.py # 客户端,被控设备
118+
│ └── server.py # 服务端,主控设备
119+
├── deviceShare.py # 启动程序
120+
├── run.sh # linux启动脚本
121+
├── deviceShare.spec # pyinstaller打包配置
122+
├── keys.db # RSA密钥存储,自动生成
123+
├── readme.md # 说明文档
124+
├── requirements.txt # 依赖
125+
└── temp.db # 设备信息存储, 自动生成
126+
```
127+
128+
129+
软件的运行流程如下图所示,客户端与服务端作为两个独立模块单独启动,客户端启动后会向局域网中广播自身信息,
130+
服务端收到广播信息后将其加入主机列表,并配置屏幕间的相对位置信息。当服务端主机的光标移出屏幕范围后,会自动判断接下来被控的主机,
131+
并将本机输入设备产生的输入拦截,通过网络模块转发给客户端,客户端收到输入信息后响应相应的控制信号。当客户端的光标移出范围后向服务端主机发送事件标志,
132+
服务端主机停止控制信号的转发,并恢复输入事件的响应。
133+
134+
![1723181806729.png](https://img.qylh.xyz/blog/1723181806729.png)
135+
136+
服务端为具备Hid Input设备的主机,由以下几个线程构成:
137+
- 主线程:服务注册及启动其他线程
138+
- TCP监听线程:用于监听处理TCP连接,并为每一个连接创建子线程。
139+
- TCP 处理线程,用于处理与客户端的TCP连接
140+
- 消息监听线程:监听客户端消息,主要为心跳信息和剪切板信息
141+
- 设备监听线程:监听Hid Input设备的输入信息和剪切板信息。
142+
- GUI线程: GUI界面的显示和处理。
143+
144+
![1723181908743.png](https://img.qylh.xyz/blog/1723181908743.png)
145+
146+
客户端为需要使用服务主机的Hid Input设备的主机,由以下几个线程构成:
147+
- 主线程:处理服务发现,发起连接请求,启动其他线程。
148+
- 心跳包线程:定期发送心跳包。
149+
- 消息监听线程:用于接收并响应主机传递的控制信息。
150+
- GUI线程: GUI界面的显示和处理。
151+
- 设备监听线程:用于监听鼠标移出事件及剪切板更新事件。
152+
153+
![1723181937936.png](https://img.qylh.xyz/blog/1723181937936.png)
154+
155+
## TODO
156+
- [x] 主机发现机制
157+
- [x] 屏幕位置配置
158+
- [x] 鼠标共享功能
159+
- [x] 键盘共享功能
160+
- [x] 剪切板共享功能
161+
- [x] 剪切板内容加密传输
162+
- [x] 优化屏幕管理功能
163+
- [x] 优化代码质量,提升代码可读性,提升软件性能和稳定性
164+
- [x] 测试更多类型操作系统
165+
- [x] 优化文档
166+
- [ ] 文件拖拽共享功能(实现中)

0 commit comments

Comments
 (0)