USB Relay Console 是一个基于 Vue 3、TypeScript 和 Electron 的 USB 继电器控制台,同时提供:
- Windows 桌面版:通过 Electron 主进程和 Node SerialPort 访问串口。
- 浏览器版:通过 Chromium Web Serial API 访问串口。
- 无需独立后端服务:应用逻辑和串口通信均在本地运行。
项目当前已使用 CH340 和 LCUS-1 单路 USB 继电器完成实机验证。
| 操作 | HEX 指令 | 验证结果 |
|---|---|---|
| Relay 1 ON | A0 01 01 A2 |
继电器吸合 |
| Relay 1 OFF | A0 01 00 A1 |
继电器释放 |
LCUS-1 当前没有经过验证的状态回读协议。界面中的 ON/OFF 表示软件最近一次成功发送的控制命令,不代表已经读取到硬件真实状态。
- 自动扫描串口并识别 CH340 设备
- 支持自动连接和异常断开后的自动重连
- 支持自定义 ON/OFF HEX 指令
- 支持配置波特率、数据位、校验位、停止位和流控
- 桌面版与浏览器版共用同一套 Vue 界面
- 桌面端使用受限 IPC 接口,Renderer 不直接访问 Node.js
- 桌面版配置保存在当前用户目录,无需管理员权限
- 支持旧版配置格式自动迁移
- 提供 Vitest 单元测试和完整 TypeScript 类型检查
桌面版使用 Electron,通过主进程中的 Node SerialPort 访问 Windows COM 端口。
适用场景:
- 不希望依赖浏览器串口授权
- 希望直接安装并运行
- Windows 10/11 x64
浏览器版直接调用 Chromium Web Serial API。
要求:
- Chrome 或 Edge 89+
- 通过
https://或http://localhost访问 - 首次使用时手动授权串口设备
Firefox 和 Safari 当前不支持 Web Serial API。
Vue 3 Dashboard
|
+------------------+------------------+
| |
v v
Electron 桌面版 浏览器版
| |
Renderer <-> IPC <-> Main Web Serial API
| |
+------------- Node SerialPort --------+
|
v
CH340 / LCUS-1
主要安全边界:
contextIsolation: truenodeIntegration: false- 仅通过 preload 和 IPC 白名单暴露串口与配置接口
- Renderer 无法直接访问 Electron、Node.js 或原生模块
请从 GitHub Releases 下载对应版本:
| 文件 | 用途 |
|---|---|
USB-Relay-Console-<version>-x64.exe |
NSIS 安装程序 |
USB-Relay-Console-<version>-x64.zip |
免安装压缩包 |
免安装版解压后运行:
USB Relay Console.exe
当前发行包未配置代码签名。Windows SmartScreen 可能显示“未知发布者”,这不影响程序运行。
- 安装 CH340 驱动并插入 USB 继电器。
- 在设备管理器中确认设备已分配 COM 端口。
- 打开桌面版,或使用 Chrome/Edge 打开浏览器版。
- 扫描并选择目标串口。
- 点击“连接”。
- 使用界面开关发送 ON/OFF 指令。
- 不使用时点击“断开”,释放串口。
同一个 COM 端口不能被多个程序同时打开。使用前请关闭 SSCOM、Arduino 串口监视器以及其他串口工具。
| 参数 | 默认值 |
|---|---|
| 波特率 | 9600 |
| 数据位 | 8 |
| 校验位 | None |
| 停止位 | 1 |
| 流控 | None |
默认参数可以在应用设置页面中修改。
推荐环境:
- Windows 10/11
- Node.js 20 或更高版本
- npm 10 或更高版本
- CH340 驱动
- Chrome 或 Edge 89+(仅浏览器版需要)
安装依赖:
cd D:\GitHub\USB-Relay-Web\frontend
npm cipostinstall 会调用 electron-builder install-app-deps,为当前 Electron 版本重建原生模块。
启动开发环境:
npm run dev该命令会启动 Vite 和 Electron 开发窗口。浏览器版联调地址:
http://localhost:5173
技术栈:
- Vue 3
- TypeScript
- Vite
- Element Plus
- Electron
- Node SerialPort
- Vitest
- electron-builder
| 命令 | 说明 |
|---|---|
npm run dev |
启动 Vite 和 Electron 开发环境 |
npm test |
运行 Vitest 测试 |
npm run typecheck |
检查前端和 Electron TypeScript 代码 |
npm run build |
执行类型检查并生成生产文件 |
npm run preview |
预览 Vite 构建结果 |
npm run clean |
清理构建目录和发布目录 |
npm run dist |
构建 Windows EXE 和 ZIP 发布包 |
npm audit |
检查依赖安全漏洞 |
USB-Relay-Web/
├─ README.md
└─ frontend/
├─ electron/
│ ├─ main/
│ │ ├─ index.ts
│ │ ├─ serial-service.ts
│ │ └─ config-service.ts
│ └─ preload/
│ └─ index.ts
├─ scripts/
│ └─ clean.cjs
├─ src/
│ ├─ api/
│ ├─ components/
│ ├─ services/
│ │ ├─ config/
│ │ ├─ serial/
│ │ ├─ RelayService.ts
│ │ ├─ device-rules.ts
│ │ ├─ errors.ts
│ │ └─ hex.ts
│ ├─ views/
│ ├─ App.vue
│ └─ main.ts
├─ package.json
├─ tsconfig.json
└─ vite.config.ts
关键模块:
src/api/relay.ts:UI 使用的统一服务门面。src/services/RelayService.ts:继电器业务逻辑和指令发送。src/services/serial/WebSerialAdapter.ts:浏览器 Web Serial 适配器。src/services/serial/ElectronSerialAdapter.ts:Electron IPC 串口适配器。electron/main/serial-service.ts:桌面版 Node SerialPort 服务。electron/main/config-service.ts:桌面版配置持久化。
桌面版使用 electron-store,配置保存在当前用户的 Electron 应用数据目录中,不会写入安装目录。
浏览器版使用 localStorage,存储键为:
usb-relay-config
配置内容包括:
- 上次选择的串口
- ON/OFF HEX 指令
- 串口通信参数
- 自动连接和自动重连设置
- 串口设备匹配规则
旧版扁平配置会在加载时自动转换,无需手动迁移。
| 状态 | 含义 |
|---|---|
ON |
软件最近一次成功发送了 ON 指令 |
OFF |
软件最近一次成功发送了 OFF 指令 |
UNKNOWN |
尚未控制、串口已断开或最近一次写入失败 |
关闭应用或浏览器页面不会自动发送 OFF,也不会恢复上次 ON 状态。
LCUS-1 当前不支持已验证的状态回读,因此界面不会声称硬件状态已经确认。
运行完整验证:
cd D:\GitHub\USB-Relay-Web\frontend
npm test
npm run typecheck
npm run build
npm audit --audit-level=high构建 Windows 发布包:
npm run dist输出目录:
frontend/release/
├─ USB-Relay-Console-<version>-x64.exe
├─ USB-Relay-Console-<version>-x64.exe.blockmap
├─ USB-Relay-Console-<version>-x64.zip
└─ win-unpacked/
版本号来自 frontend/package.json 中的 version 字段。
| 错误代码 | 原因 | 处理方式 |
|---|---|---|
WEB_SERIAL_UNSUPPORTED |
浏览器不支持 Web Serial API | 使用 Chrome/Edge 89+,或安装桌面版 |
SERIAL_USER_CANCELLED |
用户取消串口授权 | 重新选择并授权串口 |
SERIAL_PORT_BUSY |
COM 端口被其他程序占用 | 关闭 SSCOM、串口监视器等程序 |
SERIAL_PORT_NOT_FOUND |
串口不存在或设备已移除 | 检查驱动和 USB 连接后重新扫描 |
SERIAL_NOT_CONNECTED |
尚未连接串口 | 先连接目标串口 |
SERIAL_WRITE_FAILED |
USB 被拔出或写入失败 | 检查设备并重新连接 |
electron-builder 会调用 npm list 收集生产依赖。如果 Windows CMD 的 AutoRun 配置了 fastfetch 或其他会输出文本的命令,这些内容可能混入 JSON 并导致构建失败。
处理方式:
- 临时关闭 CMD
AutoRun后重新执行npm run dist。 - 构建完成后恢复原配置。
重新为当前 Electron 版本安装并重建原生依赖:
npm ci
npm run postinstall确认以下程序没有占用目标 COM 端口:
- SSCOM
- Arduino IDE 串口监视器
- PuTTY
- 其他串口调试或自动化程序
- 当前仅验证 CH340 与 LCUS-1 单路继电器。
- LCUS-1 的真实硬件状态无法回读。
- 当前发布包仅提供 Windows x64。
- 应用和安装包尚未配置代码签名。
- 当前使用 Electron 默认应用图标。
继电器可能连接真实负载。接线和通电测试前,请确认:
- 负载电压和电流在设备额定范围内
- 高压与低压部分满足隔离要求
- 接线端子连接牢固
- 测试环境具备必要的过流和断电保护
应用会发送真实的串口控制指令,请勿将本项目用于未经授权或存在安全风险的设备控制。