# RemotePad **Repository Path**: annanxue/remote-pad ## Basic Information - **Project Name**: RemotePad - **Description**: 远程触摸板+鼠标+键盘 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-21 - **Last Updated**: 2026-04-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Remote Touchpad 一个跨平台的远程触摸板应用程序,允许您通过手机或平板电脑控制计算机的鼠标和键盘。 ## 功能特性 - 🖱️ **远程鼠标控制** - 通过触摸屏控制鼠标移动、点击和滚动 - ⌨️ **虚拟键盘** - 支持文本输入和媒体控制键 - 📱 **多平台支持** - 支持 Windows、Linux (X11/Wayland) 和 Flatpak - 🔒 **安全连接** - 基于 HMAC-SHA256 的身份验证机制 - 🖼️ **实时屏幕截图** - 自动推送屏幕截图到客户端 - 🌐 **Ngrok 集成** - 支持通过 Ngrok 隧道实现外网访问 - 📐 **响应式设计** - 适配桌面、平板和手机屏幕 ## 项目结构 ``` RemotePad/ ├── main.go # 应用程序入口和 WebSocket 服务器 ├── webdata.go # 静态资源嵌入 ├── webdata/ # 前端资源 │ ├── index.html # 主页面 │ ├── main.css # 样式文件 │ ├── icon.woff # 图标字体 │ └── app/ # JavaScript 模块 │ ├── main.mjs # 主入口 │ ├── ui.mjs # UI 控制器 │ ├── touchpad.mjs # 触摸板逻辑 │ ├── mouse.mjs # 鼠标控制 │ ├── keyboard.mjs # 键盘控制 │ ├── socket.mjs # WebSocket 连接 │ └── inputcontroller.mjs # 输入控制接口 ├── inputcontrol/ # 输入控制实现 │ ├── controller.go # 控制器接口定义 │ ├── windows_controller.go # Windows 实现 │ ├── x11_controller.go # Linux X11 实现 │ ├── portal_controller.go # Linux Wayland (xdg-desktop-portal) │ ├── uinput_controller.go # Linux uinput 实现 │ └── null_controller.go # 空实现 ├── screenshot/ # 屏幕截图功能 │ └── screenshot.go # 截图实现(支持光标检测) ├── host/ # 主机信息 │ └── host.go # 主机名/IP 获取 ├── terminal/ # 终端工具 │ ├── terminal.go # 终端控制 │ ├── qr.go # 二维码生成 │ └── terminal_*.go # 平台特定实现 ├── utils/ # 工具函数 │ └── logger.go # 日志系统 ├── ngrok/ # Ngrok 集成测试 ├── web_e2e_test.go # Playwright E2E 测试 ├── go.mod # Go 模块定义 └── .env.example # 环境变量示例 ``` ## 技术栈 ### 后端 - **Go 1.25** - 主要编程语言 - **WebSocket** - 实时双向通信 (golang.org/x/net/websocket) - **嵌入式静态资源** - 使用 `//go:embed` 嵌入前端文件 - **HMAC-SHA256** - 客户端身份验证 ### 前端 - **原生 JavaScript (ES Modules)** - 无框架依赖 - **Touch Events** - 触摸板手势支持 - **Pointer Lock API** - 鼠标捕获 - **Fullscreen API** - 全屏支持 ### 输入控制 - **Windows** - SendInput API - **Linux X11** - XTest 扩展 - **Linux Wayland** - xdg-desktop-portal - **Linux** - uinput 内核接口 ## 快速开始 ### 安装依赖 ```bash # 克隆仓库 git clone cd RemotePad # 安装 Go 依赖 go mod download # 安装 Playwright 浏览器(用于 E2E 测试) go run github.com/playwright-community/playwright-go/cmd/playwright install chromium ``` ### 运行应用 ```bash # 基本运行 go run . # 指定绑定地址 go run . -bind :8080 # 指定密钥 go run . -secret mysecret # 启用 TLS go run . -cert server.crt -key server.key # 启用 Ngrok(需要设置 NGROK_AUTH_TOKEN 环境变量) go run . -ngrok # 查看所有选项 go run . -help ``` ### 环境变量 创建 `.env` 文件: ```env NGROK_AUTH_TOKEN=your_ngrok_token ``` ## 命令行参数 | 参数 | 默认值 | 描述 | |------|--------|------| | `-bind` | `:0` | 服务器绑定地址 `[HOSTNAME]:PORT` | | `-secret` | 随机生成 | 客户端认证密钥 | | `-cert` | - | TLS 证书文件 | | `-key` | - | TLS 私钥文件 | | `-update-rate` | 30 | 每秒更新次数 | | `-move-speed` | 1.0 | 触摸板移动速度倍数 | | `-scroll-speed` | 1.0 | 触摸板滚动速度倍数 | | `-mouse-move-speed` | 1.0 | 鼠标移动速度倍数 | | `-mouse-scroll-speed` | 1.0 | 鼠标滚动速度倍数 | | `-log-level` | 1 | 日志级别: 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR | | `-log-dir` | `logs` | 日志目录 | | `-ngrok` | true | 启用 Ngrok 隧道 | | `-ngrok-token` | - | Ngrok 认证令牌 | | `-version` | - | 显示版本号 | ## WebSocket 协议 ### 认证流程 1. 服务器发送随机挑战消息 2. 客户端使用 HMAC-SHA256(secret, message) 计算响应 3. 服务器验证响应,通过后发送配置信息 ### 消息格式 ```json // 配置消息(服务器 → 客户端) { "type": "config", "payload": { "updateRate": 30, "moveSpeed": 1.0, "scrollSpeed": 1.0, "mouseMoveSpeed": 1.0, "mouseScrollSpeed": 1.0 } } // 截图消息(服务器 → 客户端) { "type": "screenshot", "payload": { "image": "base64_encoded_webp_image", "cursorType": "arrow" } } // 命令消息(客户端 → 服务器) { "type": "command", "payload": { "action": "m", "data": "10;20" } } ``` ### 命令类型 | 命令 | 格式 | 描述 | |------|------|------| | `m` | `m;` | 相对鼠标移动 | | `a` | `a;` | 绝对鼠标移动 | | `b` | `b