SDD V3.03 · 2026-10-18

MRRC Modern
软件设计说明书

用于记录多电台(FT-710 / IC-7300 / IC-7300MK2)网页控制系统的架构、接口、运行模型与版本演进,作为实现与设计的一致性基线文档。

SDD 范围

IBM TeamSD 对齐,15 章,内容基于实际代码状态。

属性 值
文档 ID SDD-MRRC-MODERN-2026-001
版本 V3.03
基线日期 2026-10-09
后端运行时 Python 3.12+, FastAPI, Uvicorn, PyAudio, NumPy
前端技术 HTML5, CSS3, 原生 JavaScript, Web Audio API
核心接口 4+1 路 WebSocket(可选 ATR1000)+ 串口 CAT / CI-V + FT4222 SPI / CI-V 0x27 + USB 音频

最新更新

无人值守的盒子不会被日志写满:轮转、journald 上限、录音拒写 (V2.99)

logs/server-stdout.log 是 systemd 的 StandardOutput=append: 目标,而 systemd 与服务端都不轮转 append: 目标——它因此是整个镜像里唯一没有上限的文件。实测:一个每 20 ms 写一条警告的缺陷,在 6.5 GB 的根分区上五小时写了 17 MB。服务层现在安装 /etc/logrotate.d/mrrc(5 MB 触发、留三代、压缩,copytruncate——systemd 持有文件描述符),并自带 mrrc-logrotate.timer:不押注 cron 或发行版的 timer 在跑;journald 上限 128 MB(默认是文件系统的 10%)。

录音拿到的是保留策略里不破坏的那一半:剩余空间低于 MRRC_RECORDINGS_MIN_FREE_MB(200 MB,按默认码率约七小时) 时,新录音会被拒绝并给出两个数字,绝不会先开始。 操作员录下的东西,产品不会为了腾地方删掉。

一个有界的文件 · 一个有界的 journal · 只拒绝,不删除

hub 再也不会钉住一把实例已经换掉的证书;FT8 解码器不再杀掉自己的 worker (V2.98)

sign_for() 现在一个名字只签一次:同名且证书可用(CN/SAN 匹配、距到期 30 天以上、 私钥与证书配对、文件可解析)就复用,而且不重写文件——于是「签了但登记没成功」不会再让 hub 钉住一把、实例服务另一把(现场入口整夜 502 就是这个形态)。轮换成了显式动作(删证书 文件),已经坏掉的实例点一次「连接」即自愈。

FT8 深路径此前每个时隙都杀掉服务器的 DSP worker:原生解码器里的 Fortran stop 会终止它的宿主进程,而 launcher 的启动 tee 在服务器答 HTTP 之后就不再写盘——于是死因一个字都没进日志, 只剩一句 worker_exit。现在 worker 自己的 stdout/stderr 落到 logs/ft8-worker.log(诊断包收集),FFTW 线程初始化改为返回状态码而不再 abort, worker_exit 还会写明第几代、重启过几次。

AD-021 · 登记幂等 · worker 的死因现在可见

发货版盒子不需要初始化:固定口令、Wi-Fi 与公网入口都在同一个页面 (V2.92)

「刷好就发」的镜像(build-image.sh --preflash,默认关)把三条口令、 Asia/Shanghai 与 zh_CN.UTF-8 烤进去,于是一台盒子从插电到浏览器里登录 中间不需要任何步骤。Wi-Fi 面板多了一个可手输的 SSID 框(点扫描结果只是把它带入)与 显示/隐藏密码的按钮——隐藏网络和「扫描返回空表」以前都是死路;新增的「公网入口」面板收一个呼号、 向门户提出申请、并回报入口地址。同一批还修掉一处真缺口:首启探测在此前所有镜像上从未运行过 (包装器带着 MRRC_PRESEED=1 调它,而那个键第一行就返回了),于是「电台比盒子晚插上」 永远不会被发现;现在探测真的会跑,而且每次开机重探到配置定型为止。

AD-027 · NFR-069 · 首启探测这才真的会跑

SDD 15 章

AD-001 ... AD-030

AD-001 FastAPI/Uvicorn AD-002 直连 CAT AD-003 脏字段广播 AD-004 Opus/PCM 标签流 AD-005 scope_pipe 隔离 AD-006 双模式频谱 AD-007 PTT 安全流程 AD-008 音频设备自动检测 AD-009 7 任务轮询 AD-010 JSON 记忆信道 AD-011 48kHz 编解码 + 44.1kHz 桥接 AD-012 Active-VFO 跟踪 AD-013 表头校准 AD-014 CAT 勘误处理 AD-015 优先级 CAT 抢占 AD-016 可插拔电台后端 AD-017 服务端录音 AD-018 Profile 驱动的 Yaesu 核心 AD-019 未验证机型策略 AD-020 一键 CQ 呼叫 AD-021 诊断包与上报闭环 AD-022 更新通道 AD-023 远程会话遥测 AD-024 会话令牌传输 AD-025 频谱带宽档位 AD-026 初始化热点与免口令引导窗口 AD-027 出厂预置(发货版)镜像 AD-028 本地操作台(蓝牙遥控器) AD-029 SDR 接收机(盒子对外发布的 Web 接收器) AD-030 天线诊断台(NanoVNA-H,/Nano)