|
1 | | -# 基于openKylin的hid input 设备共享协议 |
| 1 | +# 赛题要求 |
2 | 2 |
|
3 | 3 | ##### 作品完成和提交方式:选择本赛题的参赛队伍需要首先复刻(Fork)本项目,然后在复刻的项目中添加参赛队员、合作完成作品开发即可,无需提交PR到赛题项目。如果作品为文档形式,也请将作品文档提交到项目代码库中。在作品完成过程中,围绕作品的相关讨论等可以以疑修(Issue)形式发布和讨论,也可使用里程碑对整个任务进行规划管理。 |
4 | 4 |
|
|
16 | 16 |
|
17 | 17 | ### 4. 参考资料 |
18 | 18 | 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 | + |
| 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 | + |
| 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 | + |
| 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 | + |
| 135 | + |
| 136 | +服务端为具备Hid Input设备的主机,由以下几个线程构成: |
| 137 | +- 主线程:服务注册及启动其他线程 |
| 138 | +- TCP监听线程:用于监听处理TCP连接,并为每一个连接创建子线程。 |
| 139 | +- TCP 处理线程,用于处理与客户端的TCP连接 |
| 140 | +- 消息监听线程:监听客户端消息,主要为心跳信息和剪切板信息 |
| 141 | +- 设备监听线程:监听Hid Input设备的输入信息和剪切板信息。 |
| 142 | +- GUI线程: GUI界面的显示和处理。 |
| 143 | + |
| 144 | + |
| 145 | + |
| 146 | +客户端为需要使用服务主机的Hid Input设备的主机,由以下几个线程构成: |
| 147 | +- 主线程:处理服务发现,发起连接请求,启动其他线程。 |
| 148 | +- 心跳包线程:定期发送心跳包。 |
| 149 | +- 消息监听线程:用于接收并响应主机传递的控制信息。 |
| 150 | +- GUI线程: GUI界面的显示和处理。 |
| 151 | +- 设备监听线程:用于监听鼠标移出事件及剪切板更新事件。 |
| 152 | + |
| 153 | + |
| 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