VoCat
English | 简体中文
Vocat是一个开源的Web控制面板和工程工具包,用于Quectel EC20/EC25系列蜂窝调制解调器。它将调制解调器发现、实时无线状态、AT和USSD终端、短信、WiFi通话、eSIM管理、网络选择、代理路由、通知、审计日志和发布自动化整合在一个自包含的服务中。
后端使用Go编写,界面使用React和TypeScript构建,生产环境前端已嵌入Go二进制文件。单个可执行文件即包含Web应用,并使用SQLite进行持久化状态存储。

特性
| 领域 | Vocat提供的能力 |
|---|---|
| 设备管理 | 自动串口/USB发现、多调制解调器支持、友好设备名称、实时概览更新、模块重启、飞行模式和USB联网模式控制。 |
| 无线与网络 | 注册状态、运营商、信号指标、RSRP/RSRQ/SINR、网络模式、频段、信道、运营商扫描,以及自动或手动网络选择。 |
| AT与USSD | 交互式AT终端、命令历史、原始调制解调器响应、USSD开始/继续/取消流程,以及清晰的调制解调器错误报告。 |
| 短信 | 直接蜂窝和IMS短信传输、入站同步、多部分处理、送达报告、对话历史、未读状态、时间戳和逐条消息送达状态。 |
| WiFi通话 | IKEv2/ePDG隧道建立、EAP-AKA认证、IMS注册、IMS短信、重连控制、状态诊断和每设备路由。 |
| eSIM与eUICC | eUICC发现、EID和生产信息、证书元数据、多eUICC清单、已安装配置文件列表、启用/禁用/切换操作、下载、重命名和删除操作(当卡支持时)。 |
| 卡策略 | 基于ICCID的WiFi通话和飞行模式行为,并即时应用策略。 |
| 代理路由 | 上游SOCKS路由、设备绑定、国家规则、TCP可达性检查,以及用于WiFi通话数据路径的UDP Associate检查。 |
| 通知 | 通过Telegram、Bark、电子邮件、Pushplus和签名webhook转发新入站短信。每条短信作为单独通知投递。 |
| Telegram机器人 | 设备状态、已安装配置文件列表和切换、WiFi通话控制、短信发送、定时拨号并自动挂断、通话状态、接听和挂断命令。敏感操作需要管理员确认。 |
| 运维 | 身份认证、CSRF保护、访问策略、审计事件、实时日志、日志保留、健康检查、响应式布局、深色模式以及中英文应用界面。 |
| 分发 | 静态Linux二进制、systemd安装脚本、带SHA-256验证的自更新、Docker镜像、GHCR发布和GitHub Actions发布构建。 |
支持的硬件
Vocat面向基于高通平台的Quectel模块,这些模块暴露兼容的AT、QMI、串口和USB网络接口,包括:
- Quectel EC20
- Quectel EC25
- Quectel EG25系列
- 兼容的EG600及相关模块
可用功能取决于模块固件、USB组合、SIM/eSIM能力、主机驱动、无线网络和运营商配置。
安装
一键Linux安装
curl -fsSL https://raw.githubusercontent.com/MengMengCode/VoCat/master/scripts/install.sh | sudo bash
安装特定版本:
curl -fsSL https://raw.githubusercontent.com/MengMengCode/VoCat/master/scripts/install.sh -o install.sh
sudo bash install.sh 0.0.2
安装程序会:
- 检测
amd64、386、arm64、aarch64或armv7; - 下载匹配的GitHub Release二进制文件;
- 对照
SHA256SUMS进行验证; - 将Vocat安装到
/opt/vocat; - 创建加固的systemd服务,并授予Vocat所需的硬件和网络访问权限;
- 将运行时配置存储在
/etc/vocat/env; - 首次安装时生成随机初始管理员密码。
安装完成后,打开:
http://<服务器地址>:7575
手动二进制安装
从GitHub Releases下载匹配的二进制文件和SHA256SUMS:
| 平台 | 发布文件 |
|---|---|
| Linux x86-64 | vocat-linux-amd64 |
| Linux x86 32位 | vocat-linux-386 |
| Linux ARM64 | vocat-linux-arm64 |
| Linux AArch64 | vocat-linux-aarch64 |
| Linux ARMv7 | vocat-linux-armv7 |
验证并安装:
sha256sum -c SHA256SUMS --ignore-missing
sudo install -d -m 0755 /opt/vocat/bin /opt/vocat/data
sudo install -m 0755 vocat-linux-amd64 /opt/vocat/bin/vocat
sudo env \
VOCAT_DATABASE_PATH=/opt/vocat/data/vocat.db \
VOCAT_ADMIN_PASSWORD=change-this-password \
/opt/vocat/bin/vocat serve
此手动命令以前台模式运行Vocat。使用vocat serve让进程直接启动服务器;在TTY上以root身份运行不带参数的vocat会打开交互式管理菜单。当需要托管的systemd服务和自动重启时,请使用一键安装程序。
Docker
对于必须发现每个连接的受支持Quectel调制解调器并持续看到USB热插拔事件的Linux主机,请以硬件访问模式运行Vocat:
docker pull ghcr.io/mengmengcode/vocat:latest
docker run -d \
--name vocat \
--restart unless-stopped \
--network host \
--privileged \
--user 0:0 \
-e VOCAT_ADMIN_PASSWORD=change-this-password \
-v vocat-data:/opt/vocat/data \
-v /dev:/dev \
-v /sys:/sys:ro \
ghcr.io/mengmengcode/vocat:latest
容器启动后打开http://<服务器地址>:7575。需要主机网络,以便QMI网络接口对Vocat保持可见,同时需要特权设备访问,以访问串口、QMI控制节点、TUN接口、网络配置以及容器启动后添加的设备。/dev绑定挂载使新的ttyUSB*、ttyACM*和cdc-wdm*节点无需重新创建容器即可可见。
此模式有意授予Vocat对主机设备和网络栈的广泛访问权限。只能在受信任的Linux主机上使用。自动发现目前识别受支持的Quectel USB调制解调器(USB厂商ID 2c7c),而非任意调制解调器品牌。仅使用--device映射单个节点(如/dev/ttyUSB2和/dev/cdc-wdm0)会将容器限制在这些固定节点,无法提供完整的多设备或热插拔发现。
GHCR镜像已发布linux/amd64和linux/arm64版本。
配置
Vocat从VOCAT_CONFIG读取可选的JSON配置文件,然后应用VOCAT_*环境变量。环境变量优先。
| 环境变量 | 默认值 | 描述 |
|---|---|---|
VOCAT_ADDR | 0.0.0.0:7575 | HTTP监听地址。 |
VOCAT_DATABASE_PATH | ./data/vocat.db | SQLite数据库路径。 |
VOCAT_ADMIN_USERNAME | admin | 初始管理员用户名。 |
VOCAT_ADMIN_PASSWORD | admin | 初始管理员密码。在暴露服务前请修改。 |
VOCAT_SESSION_TTL | 24h | 身份认证会话有效期。 |
VOCAT_SECURE_COOKIES | false | 使用HTTPS时将会话cookie标记为安全。 |
VOCAT_SHUTDOWN_TIMEOUT | 10s | 优雅关闭超时时间。 |
VOCAT_MAX_REQUEST_BODY_BYTES | 1048576 | 最大API请求体大小。 |
VOCAT_REPO | MengMengCode/VoCat | 自更新器使用的受信任GitHub仓库,格式为owner/name。 |
GITHUB_TOKEN | 空 | 可选的GitHub令牌,用于私有仓库或更高的API限制。 |
不要将Telegram令牌、SMTP密码、webhook密钥、SIM凭据或其他私有数据存储在仓库中。请通过应用程序设置或受保护的环境文件进行配置。
Telegram机器人
当启用Telegram通知并同时配置了Chat ID和Admin ID时,机器人支持:
/status [device]
/esim <device>
/switch <device> <iccid>
/wfc <device> <status|on|off|reconnect>
/sms <device> <number> <message>
/call <device> <number> <seconds>
/calls <device>
/answer <device>
/hangup <device>
配置文件切换、短信提交和拨号使用一次性确认按钮。定时拨号执行调制解调器通话操作并在1–600秒后自动挂断;它不捕获或处理通话音频。机器人不暴露eSIM下载、删除或重命名命令。
更新
检查是否有更新的GitHub Release:
vocat update --check --repo MengMengCode/VoCat
安装最新版本:
sudo vocat update --repo MengMengCode/VoCat
更新程序会下载与当前Linux架构匹配的二进制文件,使用发布的SHA256SUMS进行验证,原子地替换可执行文件,并在可用时重启vocat systemd服务。
对于Docker安装:
docker pull ghcr.io/mengmengcode/vocat:latest
拉取新镜像后重新创建容器。
开发
要求:
- Go 1.25或更高版本
- Node.js 20或更高版本
- npm
运行前端开发服务器:
cd web
npm install
npm run dev
构建嵌入式前端并启动后端:
cd web
npm run build
cd ..
go run ./cmd/vocat
运行所有测试:
go test ./...
构建生产二进制:
go build -trimpath -ldflags "-s -w" -o vocat ./cmd/vocat
发布自动化
推送版本标签会启动两个GitHub Actions工作流:
release-binaries构建并发布amd64、386、arm64、aarch64和armv7二进制文件及SHA256SUMS。docker构建多架构镜像并发布到GitHub Container Registry。
git tag v0.2.0
git push origin v0.2.0
项目结构
cmd/vocat/ 应用程序入口和CLI
internal/device/ 调制解调器发现和设备控制
internal/modem/ AT会话和响应处理
internal/server/ HTTP API、通知和嵌入式Web服务器
internal/store/ SQLite持久化
internal/update/ GitHub Release自更新器
internal/vowifi/ IKE、EAP-AKA、IMS和WiFi通话运行时
scripts/install.sh Linux安装程序和更新程序
web/src/ React和TypeScript前端
.github/workflows/ 二进制和Docker发布自动化
负责任使用
蜂窝调制解调器和eSIM操作可能影响用户服务、已存储配置文件、网络注册和硬件状态。请保留备份,仔细审查破坏性操作,并且仅在允许操作所连接硬件和网络资源的合法环境中使用本软件。
Vocat不会绕过运营商认证、网络策略、硬件安全或eSIM信任要求。对某项操作的支持意味着Vocat可以向调制解调器或eUICC请求该操作;设备、配置文件、网络或运营商仍可能拒绝它。
贡献
欢迎提交Issue和Pull Request。请保持更改聚焦,在可行时包含测试,避免提交凭据或用户数据,并清晰记录硬件特定行为。
在提交更改之前:
go test ./...
cd web && npm run build
致谢
- Nodeseek.com — 一个专注于服务器的社区
- Linux.do — 一个鼓舞人心的技术社区
- iniwex5 - 样式和功能指南
请我喝咖啡
| 网络 | 地址 |
|---|---|
| USDT-TRON (TRC20) | TQQAbboBoU8h5xX4YCA1rqWJU2WjK3seSg |
| USDT-BSC (BEP20) | 0xdbfcd4a462550d6ff06d09cbd89026c6b145d9c4 |
| USDT-Polygon | 0xdbfcd4a462550d6ff06d09cbd89026c6b145d9c4 |
许可证
参见LICENSE。