ESC
开源 2 分钟阅读

VoCat:开源的Quectel EC20/EC25系列蜂窝调制解调器Web控制面板与工程工具包

VoCat是一个开源项目,为Quectel EC20/EC25系列蜂窝调制解调器提供统一的Web控制面板和工程工具包。它集成了调制解调器发现、实时无线状态、AT与USSD终端、短信、WiFi通话、eSIM管理、网络选择、代理路由、通知、审计日志及发布自动化等功能。后端采用Go编写,前端使用React和TypeScript,单个可执行文件即可部署,支持Linux多架构和Docker。

来源:GitHub

Vocat

VoCat

Go React TypeScript Vite Tailwind CSS SQLite

Linux Docker WiFi Calling eSIM Telegram GitHub Actions

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与eUICCeUICC发现、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-64vocat-linux-amd64
Linux x86 32位vocat-linux-386
Linux ARM64vocat-linux-arm64
Linux AArch64vocat-linux-aarch64
Linux ARMv7vocat-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_ADDR0.0.0.0:7575HTTP监听地址。
VOCAT_DATABASE_PATH./data/vocat.dbSQLite数据库路径。
VOCAT_ADMIN_USERNAMEadmin初始管理员用户名。
VOCAT_ADMIN_PASSWORDadmin初始管理员密码。在暴露服务前请修改。
VOCAT_SESSION_TTL24h身份认证会话有效期。
VOCAT_SECURE_COOKIESfalse使用HTTPS时将会话cookie标记为安全。
VOCAT_SHUTDOWN_TIMEOUT10s优雅关闭超时时间。
VOCAT_MAX_REQUEST_BODY_BYTES1048576最大API请求体大小。
VOCAT_REPOMengMengCode/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

致谢

请我喝咖啡

网络地址
USDT-TRON (TRC20)TQQAbboBoU8h5xX4YCA1rqWJU2WjK3seSg
USDT-BSC (BEP20)0xdbfcd4a462550d6ff06d09cbd89026c6b145d9c4
USDT-Polygon0xdbfcd4a462550d6ff06d09cbd89026c6b145d9c4

许可证

参见LICENSE。