v1.1.0 · FT-710 电台在线运行

Headless FT8 服务器
真实 DSP · 真实 QSO

MRRC-FT8 将 WSJT-X 3.0.2 Improved DSP 核心(FT8/FT4 解码与编码)运行在 受监督的独立 Worker 中,配合 Python FastAPI 控制面、rigctld 电台控制和 横屏移动 Web 驾驶舱。打开浏览器——解码波段、选定电台、由 sequencer 自动完成一场标准 QSO。

在线驾驶舱 了解功能 GitHub

加入 MRRC-HAM 微信群

微信扫码加入 MRRC-HAM 同好群。

MRRC-HAM 同好群微信二维码

该二维码 7 天内(8 月 29 日前)有效,重新进入将更新。

Windows 桌面安装包

Windows 11/10 x64 —— 内置 Python 运行时 + WSJT-X FT8 解码/编码库 + Hamlib rigctld,无需手动安装 Python 或 Node.js。首次运行自动生成 自签 HTTPS 证书;默认密码 abcd1234;支持局域网/远程 HTTPS 访问。

MRRC_FT8-Setup.exe — v1.1.0 稳定版

60 MB · Windows 11/10 x64
SHA-256: ee866947731ac2318f4c1c7dc14511ba8a67b67ffbb68a2f32c8d9a3f68318b2

MRRC-FT8 整台站:FastAPI 服务器 + FT8 DSP(解码/编码)+ rigctld + Web/桌面客户端。Windows 构建 832 项测试通过;安装包启动与提供服务 已验证。电台/音频的射频验收仍需在实体电台侧进行。

下载 Windows 安装包 带版本号 v1.1.0

WSJT-X DSP,服务器级

你熟悉的 Improved 解码器,封装进 headless 服务器,配以安全、确定的时隙调度。

WSJT-X 3.0.2 Improved DSP

将精选的 Improved ft8var 源码编译为 C ABI 共享库。 FT8 标准 + Improved 解码,OpenMP Auto/1–12 分带;FT4 在 FT8 验收后加入。

  • 可重定位构建——生产环境无需 vendor 源码树
  • OpenMP 分带间确定性、无重叠分配
  • FT8 174-bit 消息,精确 LDPC 编解码

受监督 DSP Worker

Fortran/OpenMP 状态只存在于独立 Worker 进程、经监督 IPC 访问。 所有 DSP 调用走单一 binding 锁——没有跨线程 packjt77 竞态, OpenMP 线程绝不回调 Python。

  • 崩溃自动重启监督,状态干净恢复
  • 全局 DSP 锁串行化所有 ctypes 调用
  • 进程边界隔离原生内存

UTC 时隙纪律

每个调度决策都使用 floor(epoch/TRperiod)——唯一的时隙身份规则。 RX、TX、解码与编排全部对齐同一绝对 UTC 时隙网格。

  • UtcRing 按绝对采样序号寻址
  • 无漂移、无驱逐错位
  • FT8 15 秒 / FT4 7.5 秒周期

Sequencer + PTT 安全

操作者选定目标——sequencer 在正确的对侧 TX 时隙自动完成一场标准 QSO, 配手动回复决策窗口、fit guard 与中央 PTT 安全控制器。

  • 对侧相位由解码时隙奇偶计算
  • Fit guard:12.64 秒波形适配 15 秒时隙
  • 任何已认证会话可立即 STOP TX

rigctld 电台控制

串口只有一个 owner:rigctld。服务器经 loopback TCP 走 CAT—— 频率、模式、PTT——任何模块都不得直接打开串口设备。

  • 单一串口 owner——无 CAT 交错损坏
  • Loopback TCP / unix socket
  • 经 rigctl / hamlib 指令 PTT

持久化 QSO 日志 + ADIF

每场完成的 QSO 落入 canonical SQLite 存储,sequencer 完成时捕获 起始/波段上下文,并可导出 ADIF 交给你的日志软件。

  • SQLite canonical QSO/审计/历史记录
  • 拨号频率 → ADIF 波段名映射
  • on_qso 在完成时只触发一次,而非每段

DXCC 实时视图

在驾驶舱直接追踪已通联实体:全屏统计弹层解析内置 cty.dat(精确 / 数字替换 / 最长前缀匹配),汇总 总数 / 每实体 / 每波段——仅在 QSO 写入后重算,打开即用缓存。

  • 真实 1 万行日志 → 186 个实体
  • 写入前缓存,无需推送/轮询
  • 新 DXCC 的 CQ 紫色高亮

新 DXCC 自动呼叫

打开 Auto-call 开关后,服务器在空闲时自动 safety-arm 并通联第一个 新 DXCC 的 CQ——无需控制租约、绝不打断进行中的 QSO,已通联实体 自然不再触发。

  • 纯函数候选过滤 + 审计记录
  • interlock 拒绝时跳过而不崩溃
  • 设置服务端持久化

3 kHz 瀑布图

FT8 通带约 0–3 kHz,因此频谱帧只输出 3 kHz 跨度——没有空白半画布、 载荷减半,客户端把每个 bin 映射到整个瀑布图。

  • 显示带宽可配置
  • 校验保持在 0..rate/2 内
  • 波段选择:7/14/21/28 MHz

横屏移动驾驶舱

为横放在电台旁的手机打造的移动优先 PWA:横屏完整控制, 竖屏降级为观察者/STOP 视图。无构建步骤——纯 vanilla JS 模块。

  • 多观察者会话共享一个控制租约
  • 5 秒心跳 / 15 秒 TTL 租约续期
  • WebSocket secure-cookie 认证,Caddy TLS 边缘

FT-710 电台实战

v1.1.0 正在真实 FT-710 电台上运行。2026-08-03 实战闭环了 RX/TX 根因—— UTC-ring 驱逐错位、Replay 对侧时隙相位、手动回复决策窗口—— 真实 FT8 QSO 已通过移动驾驶舱持续完成。2026-08-04 补齐了 FT-710 电台控制:滤波器带宽与 ATT / PREAMP / AGC / RF 增益现改走原始 CAT 帧 (hamlib 的 FT-710 电平路径不可靠,且 AGC AUTO 编码有误), 已在站内电台实机验证。v1.1.0 新增 DXCC 实时视图(cty.dat 实体统计, QSO 写入前走缓存)、新 DXCC 自动呼叫开关(空闲时自动通联首个新实体 CQ)、以及 JTDX ADIF 自动同步 + 7 天 LOG 窗口。

MRRC-FT8 驾驶舱实况——20 米波段 14.074 MHz 的 FT8 频带活动与实时解码,含发射状态与时隙计时

驾驶舱实况:20 米波段 14.074 MHz 的 FT8 频带活动与实时解码,含发射状态与时隙计时。

打开在线驾驶舱 源码

在线边缘:https://radio.vlsc.net:9988——Caddy TLS 配 acme.sh DNS-01 证书;FastAPI 与 rigctld 保持仅本机监听。

五步构建并运行

macOS 或 Linux。DSP 核心需要 gfortran-mp-13 + FFTW3f,服务器本体一个 Python venv 即可。

1 · 构建 DSP 核心

CMake 将 Fortran shim + 精选 Improved 源码编译为 wsjt_core

cmake -S dsp -B dsp/build -DCMAKE_Fortran_COMPILER=gfortran-mp-13 && cmake --build dsp/build -j

2 · 安装 Python 环境

Editable 安装拉取 FastAPI、uvicorn、numpy 与测试依赖。

python3 -m venv venv && venv/bin/pip install -e '.[dev]'

3 · 设置 OMP_STACKSIZE

Improved sync8var 在线程栈分配大型工作数组——10 MB,须在 NumPy/OpenMP 加载前设置。

export OMP_STACKSIZE=10M

4 · 配置并启动

设置 MRRC_FT8_* 环境变量(密码哈希用 --hash-password 生成、呼号、网格、音频设备、允许主机)。

venv/bin/python -m server.main

5 · 浏览器打开

打开驾驶舱、登录、选定电台并完成一场 QSO。完整部署模板(Caddy、LaunchAgent、systemd)在 deploy/

https://your-host:9988 → 登录 → 选波段 → 开打

生产部署指引

应用只绑定回环地址,公网入口由 Caddy 承担。macOS LaunchAgent、Linux systemd 单元与 Caddy 配置都在 deploy/

1 · 生成密码哈希

MRRC_FT8_PASSWORD_HASH 生成 Argon2id 哈希——交互式提示,密码不落入 shell 历史。

venv/bin/python -m server.main --hash-password

2 · 配置密钥

.env(或服务环境文件)须定义哈希、呼号与网格;允许主机与音频设备可选。缺前三项服务拒绝启动。

MRRC_FT8_PASSWORD_HASH=… MRRC_FT8_MY_CALL=YOURCALL MRRC_FT8_MY_GRID=…

3 · 以服务方式运行

macOS:复制 deploy/com.mrrc.ft8.plist~/Library/LaunchAgents/ 并 bootstrap。Linux:安装 deploy/mrrc-ft8.service、创建 /etc/mrrc-ft8.envsystemctl enable --now mrrc-ft8

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.mrrc.ft8.plist

4 · 公网入口(Caddy)

复制 deploy/Caddyfile/etc/caddy/ 并以 LaunchDaemon 运行 Caddy;将 MRRC_FT8_ALLOWED_HOSTS 设为同一域名以通过 Host/Origin 校验。

reverse_proxy 127.0.0.1:8000

5 · 部署网站

本站在仓库内随附——website/deploy.sh 会备份、上传到 www.vlsc.net/mrrc_ft8 并重载 nginx。

cd website && ./deploy.sh

你需要什么

任意带 CAT 的 HF 电台 rigctld(hamlib) macOS / Linux gfortran-mp-13 + FFTW3f Python 3.11+ CMake ≥ 3.16 现代移动浏览器 Caddy TLS 边缘(可选)

分层 · 受监督 · 确定

浏览器 → TLS 边缘 → FastAPI 控制面 → 受监督 DSP Worker → 共享原生库。 每个资源只有一个 owner。

浏览器 横屏移动驾驶舱 瀑布图 · 解码信息流 Vanilla JS · PWA FastAPI 主进程 认证 · 租约 · UTC · 音频 · rig sequencer · PTT 安全 SQLite · ADIF · 瀑布图 DSP Worker 受监督 IPC binding 锁 · packjt77 OpenMP 分带 1–12 HF 电台 FT-710 实战电台 经 rigctld 走 CAT USB 音频 48 kHz HTTPS / WSS Caddy TLS 边缘 受监督 IPC loopback /WScontrol JSON · 选择 / 回复 / CQ /WSstate 解码流 · 波段 · 租约 /WSwaterfall 3 kHz 跨度 bins /WSqso sequencer · QSO 日志事件
DSP 流水线
12 kHz int16 单声道输入
ft8var OpenMP 解码
受监督 Worker → wsjt_core → 解码;TX 波形恒为 48 kHz
UTC 时隙网格
floor(epoch / TRperiod)
绝对时隙身份
UtcRing 按绝对采样序号寻址;无驱逐漂移
控制租约
多观察者,单一控制
5 秒心跳 / 15 秒 TTL
任何已认证会话可 STOP TX;启动 TX 需持有租约
公网边缘
仅 Caddy :80/:443
acme.sh DNS-01 TLS
FastAPI + rigctld 仅本机监听;WebSocket secure-cookie 认证

DSP · 时隙 · 安全——量化一览

12 kHz
解码器输入
int16 单声道——唯一允许的采样率
48 kHz
TX 波形
固定 TX 采样率域
15 s
FT8 时隙周期
floor(epoch/TRperiod) 身份
1–12
OpenMP 分带
确定性分配
3 kHz
瀑布图跨度
FT8 通带,无空白半幅
40
回归测试
ft8sim/ft4sim 合成信号

技术栈

WSJT-X 3.0.2 Improved Fortran + OpenMP FastAPI + Uvicorn asyncio rigctld / hamlib SQLite ADIF Caddy TLS PortAudio 采集 Vanilla JS PWA

SDD 15 章

完整 IBM TeamSD 风格系统设计说明书——需求、架构决策、安全分析与版本演进。

AD-001 … AD-015

AD-001 Headless 分层服务器 AD-002 WSJT-X C ABI AD-003 受监督 DSP Worker AD-004 固定音频采样率域 AD-005 单一 DSP owner + 锁 AD-006 UTC 时隙纪律 AD-007 Sequencer/PTT 安全 AD-008 rigctld 串口 owner AD-009 Caddy 边缘 + Cookie 认证 AD-010 单一控制租约 AD-011 横屏优先驾驶舱 AD-012 人工选台,单场 QSO AD-013 独立有界数据流 AD-014 SQLite + ADIF AD-015 原生服务部署

分工与沉淀契约

本工程环在编辑前加载什么、哪些仍由人签字、事后留下什么可读的东西。

01 · 编辑前加载
AGENTS.md + 14 条注册表(钩子未接线)
AGENTS.mdconstraints.json(14 条)与 prime 步骤在本仓库就绪;编辑前钩子以可安装片段(install_hooks.py)随仓库分发,当前检出并未接线,因此这里不声称存在自动编辑前门禁。
02 · 人来签字
真实波段解码与 UTC 时隙
真实波段条件下的解码保真度,以及 UTC 时隙的时机判断,由台前的人签字。
03 · 沉淀的契约
vendor-readonly 即契约
wsjtx-3.0.2/ 保持只读,改动一律走 dsp/patched/,因此相对厂商树的差异始终可复审。