MRRC 软件设计方案 (SDD)
Mobile Remote Radio Control - Software Design Description
文档版本: V1.0
日期: 2026-03-15
状态: 正式发布
项目: MRRC (Mobile Remote Radio Control)
方法论: IBM Team Solution Design (TeamSD) v2.3.2
目录
- 执行摘要
- 业务方向 (BUS 411)
- 项目定义 (ENG 343)
- 系统上下文 (APP 011)
- 非功能需求 (ART 0507)
- 用例模型 (ART 0508)
- 主题域模型 (APP 408)
- 架构决策 (ART 0513)
- 架构概览 (ART 0512)
- 服务模型 (ART 0582)
- 组件模型 (ART 0515)
- 运营模型 (ART 0522)
- 可行性评估 (ART 0530)
- 版本历史
1. 执行摘要
1.1 项目概述
MRRC (Mobile Remote Radio Control) 是一款专为移动端优化的业余电台远程控制系统。该系统允许业余无线电爱好者通过现代Web浏览器(尤其是移动设备)随时随地远程控制电台设备,进行语音通话和参数调节。
1.2 设计目标
| 目标 |
指标 |
| 移动端优先 |
触摸屏优化,PWA支持,单手操作 |
| 超低延迟 |
TX/RX切换 < 100ms |
| PTT可靠性 |
99%+ 按下即发射成功率 |
| 专业降噪 |
WDSP NR2 频谱降噪 15-20dB |
| 实时音频 |
端到端延迟 < 100ms |
1.3 核心功能
- 远程电台控制: 频率、模式、VFO切换、PTT控制
- 实时音频流: TX/RX双向音频,Int16/Opus编码
- DSP数字处理: WDSP库集成,NR2/NB/ANF/AGC
- ATR-1000集成: 实时功率/SWR显示,智能学习,快速调谐
- AI语音助手: Whisper识别 + Qwen3-TTS合成
- CW实时解码: ONNX前端推理
- 多实例支持: 单服务器多电台独立控制
1.4 技术架构
┌─────────────────────────────────────────────────────────────────────────┐
│ 客户端层 (Client Layer) │
│ 移动端浏览器 │ 桌面浏览器 │ 外部软件 │
├─────────────────────────────────────────────────────────────────────────┤
│ 服务层 (Service Layer) │
│ MRRC主程序 (Tornado) │ ATR-1000 API │ 语音助手服务 │
├─────────────────────────────────────────────────────────────────────────┤
│ 控制层 (Control Layer) │
│ Hamlib/rigctld │ PyAudio │ WDSP │
├─────────────────────────────────────────────────────────────────────────┤
│ 设备层 (Device Layer) │
│ 电台设备 │ 音频设备 │ ATR-1000天调 │
└─────────────────────────────────────────────────────────────────────────┘
2. 业务方向 (BUS 411)
2.1 愿景 (Vision)
成为全球领先的移动端业余电台远程控制解决方案,让业余无线电爱好者随时随地畅享通联乐趣。
2.2 使命 (Mission)
通过创新的Web技术和专业DSP处理,为HAM提供低延迟、高可靠性的远程电台控制体验。
2.3 目标 (Goals)
| 目标 |
描述 |
| G1 |
成为移动端HAM Radio远程控制的首选方案 |
| G2 |
提供业界领先的TX/RX切换延迟 (<100ms) |
| G3 |
实现99%+的PTT可靠性 |
| G4 |
集成专业级DSP降噪 (WDSP NR2) |
2.4 目的 (Objectives)
| 目的 |
指标 |
目标值 |
| O1 |
TX/RX切换延迟 |
< 100ms |
| O2 |
PTT可靠性 |
≥ 99% |
| O3 |
降噪深度 |
≥ 15dB |
| O4 |
移动端用户满意度 |
≥ 4.5/5 |
| O5 |
系统可用性 |
≥ 99.5% |
2.5 策略 (Strategies)
| 策略 |
描述 |
| S1 |
移动优先设计 - 所有功能先考虑移动端体验 |
| S2 |
性能极致优化 - 持续优化延迟和可靠性 |
| S3 |
DSP深度集成 - 集成专业WDSP库 |
| S4 |
开源生态 - 基于开源项目,持续回馈社区 |
2.6 战术 (Tactics)
| 战术 |
描述 |
| T1 |
AudioWorklet低延迟播放 |
| T2 |
PTT预热帧机制 |
| T3 |
WDSP NR2频谱降噪 |
| T4 |
多实例部署支持 |
3. 项目定义 (ENG 343)
3.1 项目概述
| 属性 |
值 |
| 项目名称 |
MRRC (Mobile Remote Radio Control) |
| 项目类型 |
远程电台控制系统 |
| 目标用户 |
业余无线电爱好者 |
| 部署平台 |
macOS/Linux/Windows |
| 用户平台 |
Web浏览器 (移动端/桌面端) |
3.2 项目范围
3.2.1 范围内 (In Scope)
- 移动端Web界面开发
- 后端Tornado服务器开发
- 音频流处理 (TX/RX)
- DSP降噪集成 (WDSP)
- ATR-1000天调集成
- AI语音助手集成
- CW解码功能
- 多实例部署支持
3.2.2 范围外 (Out of Scope)
- 电台硬件开发
- 移动端原生App开发
- 云端部署服务
- 商业SaaS平台
3.3 成功标准
| 标准 |
描述 |
| SC1 |
TX/RX切换延迟 < 100ms |
| SC2 |
PTT可靠性 ≥ 99% |
| SC3 |
音频延迟 < 100ms |
| SC4 |
支持iOS Safari和Android Chrome |
| SC5 |
WDSP降噪效果 ≥ 15dB |
3.4 主要里程碑
| 里程碑 |
日期 |
交付物 |
| M1: 概念验证 |
2024-10 |
基础TX/RX功能 |
| M2: 移动端优化 |
2024-12 |
mobile_modern.html |
| M3: DSP集成 |
2026-03 |
WDSP NR2降噪 |
| M4: V4.9发布 |
2026-03-14 |
语音助手/CW/多实例 |
4. 系统上下文 (APP 011)
4.1 用户与系统交互
┌─────────────────────────────────────────────────────────────────────────┐
│ 用户 (Users) │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ HAM Operator │ │ HAM Operator │ │ External App │ │
│ │ (移动端) │ │ (桌面端) │ │ (JTDX/WSJT) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ MRRC System │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Web Browser │ │ WebSocket │ │ REST API │ │ │
│ │ │ (UI Layer) │ │ (Audio/Ctrl)│ │ (:8080) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
└───────────────────────────────┼─────────────────────────────────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Radio Device │ │ ATR-1000 │ │ rigctld │
│ (IC-M710等) │ │ (天调设备) │ │ (Hamlib) │
└───────────────┘ └───────────────┘ └───────────────┘
4.2 外部系统接口
| 接口 |
协议 |
描述 |
| Web UI |
HTTPS/WSS |
浏览器客户端接口 |
| REST API |
HTTP |
外部应用集成 (:8080) |
| ATR-1000 |
WebSocket |
天调设备通信 (:60001) |
| rigctld |
TCP |
电台控制 (:4532) |
4.3 数据流
| 流 |
方向 |
描述 |
| TX Audio |
Client → Radio |
麦克风 → 编码 → 电台 |
| RX Audio |
Radio → Client |
电台 → 采集 → 降噪 → 解码 → 扬声器 |
| Control |
Client ↔ Radio |
频率/模式/PTT控制命令 |
| Meter Data |
Radio → Client |
S表/功率/SWR数据 |
4.4 边界描述
| 边界 |
描述 |
| 客户端边界 |
浏览器Web应用,PWA离线包 |
| 服务边界 |
Tornado WebSocket服务器 |
| 设备边界 |
电台、ATR-1000、音频设备 |
5. 非功能需求 (ART 0507)
5.1 性能需求
| 需求ID |
需求描述 |
目标值 |
优先级 |
| NFR-001 |
TX/RX切换延迟 |
< 100ms |
关键 |
| NFR-002 |
PTT响应时间 |
< 50ms |
关键 |
| NFR-003 |
音频端到端延迟 |
< 100ms |
关键 |
| NFR-004 |
功率显示延迟 |
< 200ms |
高 |
| NFR-005 |
界面响应时间 |
< 200ms |
中 |
| NFR-006 |
并发客户端数 |
≥ 10 |
中 |
5.2 可用性需求
| 需求ID |
需求描述 |
目标值 |
优先级 |
| NFR-010 |
系统可用性 |
≥ 99.5% |
关键 |
| NFR-011 |
故障恢复时间 |
< 30s |
高 |
| NFR-012 |
自动重连 |
支持 |
高 |
| NFR-013 |
PTT可靠性 |
≥ 99% |
关键 |
5.3 安全性需求
| 需求ID |
需求描述 |
目标值 |
优先级 |
| NFR-020 |
传输加密 |
TLS 1.2+ |
关键 |
| NFR-021 |
用户认证 |
支持 |
高 |
| NFR-022 |
访问控制 |
基于角色 |
中 |
| NFR-023 |
审计日志 |
操作记录 |
中 |
5.4 可扩展性需求
| 需求ID |
需求描述 |
目标值 |
优先级 |
| NFR-030 |
多实例部署 |
支持 |
高 |
| NFR-031 |
模块化设计 |
松耦合 |
中 |
| NFR-032 |
新电台支持 |
可扩展 |
中 |
5.5 兼容性需求
| 需求ID |
需求描述 |
目标值 |
优先级 |
| NFR-040 |
移动浏览器 |
iOS Safari, Android Chrome |
关键 |
| NFR-040 |
桌面浏览器 |
Chrome, Firefox, Safari, Edge |
高 |
| NFR-041 |
电台设备 |
Hamlib支持的所有设备 |
高 |
5.6 容量需求
| 需求ID |
需求描述 |
目标值 |
优先级 |
| NFR-050 |
网络带宽 |
< 100kbps (控制) + 256kbps (音频) |
中 |
| NFR-051 |
内存占用 |
< 200MB |
中 |
| NFR-052 |
CPU占用 |
< 30% (单客户端) |
中 |
6. 用例模型 (ART 0508)
6.1 参与者 (Actors)
| 参与者 |
描述 |
| HAM Operator |
业余无线电爱好者,通过浏览器控制电台 |
| External App |
外部软件 (JTDX, flrig等) |
| System Admin |
系统管理员 (部署维护) |
6.2 用例 (Use Cases)
6.2.1 核心用例
┌─────────────────────────────────────────────────────────────────────────┐
│ UC-001: 远程发射 (TX) │
├─────────────────────────────────────────────────────────────────────────┤
│ 参与者: HAM Operator │
│ 目标: 通过浏览器麦克风发射语音到电台 │
│ 前置条件: 已连接WebSocket,电源已开启 │
│ 后置条件: 音频成功传输到电台 │
│ │
│ 基本流: │
│ 1. 用户按下PTT按钮 │
│ 2. 系统发送PTT命令到电台 │
│ 3. 用户开始说话,浏览器采集音频 │
│ 4. 音频编码 (Int16/Opus) │
│ 5. 通过WebSocket传输到服务器 │
│ 6. 服务器解码并播放到电台 │
│ 7. 用户松开PTT │
│ 8. 系统停止发射 │
│ │
│ 备选流: │
│ 2a. PTT命令失败: 重试3次,每次间隔50ms │
│ 4a. 音频编码失败: 切换到PCM原始格式 │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ UC-002: 远程接收 (RX) │
├─────────────────────────────────────────────────────────────────────────┤
│ 参与者: HAM Operator │
│ 目标: 接收电台音频并播放到浏览器 │
│ 前置条件: 已连接WebSocket,电源已开启 │
│ 后置条件: 音频成功播放到浏览器 │
│ │
│ 基本流: │
│ 1. 系统从电台采集音频 (PyAudio) │
│ 2. 音频处理 (WDSP降噪) │
│ 3. 编码 (Int16) │
│ 4. 通过WebSocket传输到浏览器 │
│ 5. 浏览器解码 │
│ 6. AudioWorklet播放 │
└─────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ UC-003: 电台参数控制 │
├─────────────────────────────────────────────────────────────────────────┤
│ 参与者: HAM Operator │
│ 目标: 控制电台频率、模式等参数 │
│ 前置条件: 已连接rigctld │
│ 后置条件: 参数成功设置 │
│ │
│ 基本流: │
│ 1. 用户调整频率/模式 │
│ 2. 发送控制命令到MRRC │
│ 3. MRRC转发到rigctld │
│ 4. rigctld控制电台 │
│ 5. 返回执行结果 │
│ 6. 更新界面显示 │
└─────────────────────────────────────────────────────────────────────────┘
6.2.2 扩展用例
| 用例ID |
用例名称 |
描述 |
| UC-004 |
天调控制 |
ATR-1000功率/SWR显示和调谐 |
| UC-005 |
语音助手 |
AI语音识别和控制 |
| UC-006 |
CW解码 |
摩尔斯电码实时解码 |
| UC-007 |
音频录制 |
QSO录音和回放 |
| UC-008 |
多实例管理 |
多电台独立控制 |
6.3 用例关系图
┌─────────────────┐
│ HAM Operator │
└────────┬────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ UC-001 TX │ │ UC-002 RX │ │ UC-003 Control│
│ 远程发射 │ │ 远程接收 │ │ 电台控制 │
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
└────────────────────┼────────────────────┘
│
┌────────┴────────┐
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ UC-004 │ │ UC-005 │
│ 天调控制 │ │ 语音助手 │
└──────────┘ └──────────┘
7. 主题域模型 (APP 408)
7.1 核心实体
┌─────────────────────────────────────────────────────────────────────────┐
│ 核心实体关系图 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Client │────────▶│ Session │◀────────│ Radio │ │
│ │ 客户端 │ │ 会话 │ │ 电台 │ │
│ └──────────┘ └────┬─────┘ └──────────┘ │
│ │ │
│ │ 1:N │
│ ▼ │
│ ┌──────────────┐ │
│ │ AudioFlow │ │
│ │ 音频流 │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────────────┼──────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │TXAudio │ │RXAudio │ │MeterData │ │
│ │发射音频 │ │接收音频 │ │仪表数据 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
7.2 实体定义
| 实体 |
属性 |
描述 |
| Client |
id, type, platform, browser |
客户端连接 |
| Session |
id, client_id, start_time, auth_token |
会话管理 |
| Radio |
id, model, rigctld_host, audio_device |
电台设备 |
| AudioFlow |
session_id, direction, codec, sample_rate |
音频流 |
| TXAudio |
flow_id, samples, timestamp |
发射音频数据 |
| RXAudio |
flow_id, samples, timestamp |
接收音频数据 |
| MeterData |
freq, mode, power, swr, smeter |
仪表数据 |
| TunerRecord |
freq, sw, ind, cap, swr, timestamp |
天调学习记录 |
8. 架构决策 (ART 0513)
8.1 技术选型决策
AD-001: Web框架选型
| 属性 |
值 |
| 决策ID |
AD-001 |
| 类型 |
Architectural |
| 主题 |
Web框架选择 |
| 决策 |
采用Tornado作为后端Web框架 |
问题描述: 需要选择支持WebSocket的Python异步Web框架
替代方案:
- A1: Flask + SocketIO - 同步框架,性能较低
- A2: Django Channels - 过于重量级
- A3: FastAPI - 新兴框架,生态较新
决策理由:
- Tornado原生支持WebSocket
- 成熟稳定,社区活跃
- 与PyAudio事件循环兼容
影响:
- 需要使用Tornado的IOLoop进行异步处理
- 与PyAudio集成时需要特殊处理
AD-002: 音频编码方案
| 属性 |
值 |
| 决策ID |
AD-002 |
| 类型 |
Architectural |
| 主题 |
音频编码选择 |
| 决策 |
采用Int16作为主要编码,Opus作为可选编码 |
问题描述: 需要选择低延迟、高质量的音频编码方案
替代方案:
- A1: AAC - 延迟较高,专利问题
- A2: MP3 - 延迟较高,不适合实时
- A3: Opus - 低延迟,高质量,Web原生支持
决策理由:
- Opus是WebRTC标准,浏览器原生支持
- 低延迟 (20ms帧长)
- 高压缩率 (48kbps达到CD音质)
影响:
- TX端使用Opus编码
- RX端需要支持多种解码格式
AD-003: DSP降噪方案
| 属性 |
值 |
| 决策ID |
AD-003 |
| 类型 |
Architectural |
| 主题 |
DSP降噪选择 |
| 决策 |
集成WDSP库,使用NR2频谱降噪 |
问题描述: 需要为SSB语音通信选择专业降噪方案
替代方案:
- A1: RNNoise - 通用神经网络降噪,SSB效果一般
- A2: WebAudio滤波器 - 效果有限
- A3: WDSP NR2 - 专门针对SSB优化
决策理由:
- WDSP是OpenHPSDR项目专业DSP库
- NR2频谱降噪专门针对SSB优化
- 15-20dB降噪深度,语音保真度高
影响:
- 需要安装WDSP库 (libwdsp)
- 48kHz采样率处理
AD-004: 多实例部署架构
| 属性 |
值 |
| 决策ID |
AD-004 |
| 类型 |
Architectural |
| 主题 |
多实例支持 |
| 决策 |
使用独立配置文件 + 独立Unix Socket |
问题描述: 需要支持单服务器运行多个MRRC实例
替代方案:
- A1: Docker容器隔离 - 需要额外学习成本
- A2: 端口区分 - 音频设备共享问题
- C: 配置文件 + Unix Socket隔离
决策理由:
- 配置文件独立,配置简单
- Unix Socket隔离避免端口冲突
- 复用现有代码,改动最小
影响:
- 每个实例需要独立配置文件
- 每个实例需要独立Unix Socket路径
8.2 架构决策汇总
| 决策ID |
类型 |
主题 |
状态 |
| AD-001 |
Architectural |
Tornado Web框架 |
已实施 |
| AD-002 |
Architectural |
Int16/Opus编码 |
已实施 |
| AD-003 |
Architectural |
WDSP NR2降噪 |
已实施 |
| AD-004 |
Architectural |
多实例部署 |
已实施 |
| AD-005 |
Management |
PTT可靠性机制 |
已实施 |
| AD-006 |
Operational |
音频缓冲区策略 |
已实施 |
9. 架构概览 (ART 0512)
9.1 企业视图
┌─────────────────────────────────────────────────────────────────────────┐
│ MRRC 企业架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ Internet │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Mobile User │ │Desktop User │ │External App │ │ │
│ │ │ (iPhone) │ │ (PC) │ │ (JTDX) │ │ │
│ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │
│ └─────────┼─────────────────┼─────────────────┼──────────────────┘ │
│ │ │ │ │
│ │ HTTPS/WSS │ HTTPS/WSS │ HTTP │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ DMZ / 防火墙 │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ TLS Termination / 证书 │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ MRRC Server │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Web Server │ │ WebSocket │ │ REST API │ │ │
│ │ │ (:443/8877)│ │ Server │ │ (:8080) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │ │ │ │
│ │ └────────────────┼────────────────┘ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────────────────┐ │ │
│ │ │ Audio & Control Manager │ │ │
│ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │
│ │ │ │ PyAudio │ │ WDSP │ │ Hamlib │ │ │ │
│ │ │ │ Interface│ │ Processor │ │ Wrapper │ │ │ │
│ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │
│ │ └─────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────┼───────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Radio Device │ │ ATR-1000 │ │ rigctld │ │
│ │ (IC-M710等) │ │ (天调设备) │ │ (Hamlib) │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
9.2 服务视图
┌─────────────────────────────────────────────────────────────────────────┐
│ MRRC 服务架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 服务层 Services Layer │ │
│ ├──────────────┬──────────────┬──────────────┬────────────────────┤ │
│ │ │ │ │ │ │
│ │ ┌────────┐ │ ┌────────┐ │ ┌────────┐ │ ┌────────┐ │ │
│ │ │ Web UI │ │ │Audio │ │ │Control │ │ │ ATR │ │ │
│ │ │ Service│ │ │ Stream │ │ │ Service│ │ │ Proxy │ │ │
│ │ │ │ │ │ Service│ │ │ │ │ │ Service│ │ │
│ │ └────────┘ │ └────────┘ │ └────────┘ │ └────────┘ │ │
│ │ │ │ │ │ │ │ │ │ │
│ │ └──────┴──────┴───────┴──────┴──────┘ │ │ │
│ │ │ │ │ │
│ └─────────────────────┼────────────────────────────┼──────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 支撑层 Support Layer │ │
│ ├──────────────────────┬───────────────────────────────────────────┤ │
│ │ ┌────────────────┐ │ ┌────────────────────────────────────┐ │ │
│ │ │ User Auth │ │ │ WDSP DSP Processing │ │ │
│ │ │ Service │ │ │ NR2/NB/ANF/AGC │ │ │
│ │ └────────────────┘ │ └────────────────────────────────────┘ │ │
│ │ ┌────────────────┐ │ ┌────────────────────────────────────┐ │ │
│ │ │ Session │ │ │ Audio Encoding/Decoding │ │ │
│ │ │ Manager │ │ │ Int16/Opus/ADPCM │ │ │
│ │ └────────────────┘ │ └────────────────────────────────────┘ │ │
│ └──────────────────────┴───────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
9.3 技术视图
┌─────────────────────────────────────────────────────────────────────────┐
│ MRRC 技术架构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ 前端 Frontend │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │HTML5/CSS3│ │Vanilla JS│ │Web Audio │ │WebSocket │ │ │
│ │ │ │ │ │ │ API │ │ API │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ │ │ │ │ │ │
│ │ └─────────────┴─────────────┴─────────────┘ │ │
│ │ │ │ │
│ └─────────────────────────┼─────────────────────────────────────────┘ │
│ │ WSS/HTTPS │
│ ┌─────────────────────────┼─────────────────────────────────────────┐ │
│ │ 后端 Backend │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ Tornado │ │ PyAudio │ │ WDSP │ │ Hamlib │ │ │
│ │ │ WebSocket│ │ (Port) │ │ (DSP) │ │ (rigctld)│ │ │
│ │ │ Server │ │ │ │ │ │ │ │ │
│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │
│ │ │ │ │ │ │ │
│ │ └─────────────┴─────────────┴─────────────┘ │ │
│ │ │ │ │
│ └─────────────────────────┼─────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────┼───────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Radio │ │ATR-1000 │ │ rigctld │ │
│ │ Device │ │ Tuner │ │ (Hamlib) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
10. 服务模型 (ART 0582)
10.1 服务组合
| 服务 |
类型 |
描述 |
| WebUIService |
核心 |
Web用户界面服务 |
| AudioStreamService |
核心 |
实时音频流服务 |
| ControlService |
核心 |
电台控制服务 |
| DSPProcessingService |
核心 |
WDSP数字信号处理 |
| ATRProxyService |
支撑 |
ATR-1000代理服务 |
| AuthService |
支撑 |
用户认证服务 |
| SessionService |
支撑 |
会话管理服务 |
| APIService |
扩展 |
REST API服务 |
| VoiceAssistantService |
扩展 |
AI语音助手服务 |
| CWDecoderService |
扩展 |
CW实时解码服务 |
10.2 服务层次
┌─────────────────────────────────────────────────────────────────────────┐
│ 服务层次结构 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 用户服务层 User Services │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Web UI │ │ Voice │ │ CW Decoder │ │ │
│ │ │ Interface │ │ Assistant │ │ Interface │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 业务服务层 Business Services │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Audio Stream│ │ Radio │ │ ATR │ │ │
│ │ │ Management │ │ Control │ │ Management │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ DSP │ │ Session │ │ │
│ │ │ Processing │ │ Management │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ 基础设施服务层 Infrastructure Services │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ WebSocket │ │ Audio I/O │ │ Network │ │ │
│ │ │ Transport │ │ (PyAudio) │ │ Communication│ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Hamlib │ │ File │ │ │
│ │ │ Integration │ │ Storage │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
10.3 服务依赖
┌─────────────────────────────────────────────────────────────────────────┐
│ 服务依赖关系 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ VoiceAssistant ─────┐ │
│ │ │ │
│ CWDecoder ──────────┼────▶ AudioStream ◀──┐ │
│ │ │ │ │ │
│ WebUI ──────────────┘ │ │ │
│ │ │ │
│ RadioControl ◀──────────────┴─────────────┼────────────────┐ │
│ │ │ │ │
│ ATRProxy ◀─────────────────────────────────┘ │ │
│ │ │ │
│ Session ◀──────────────────────────────────────────────────┘ │
│ │ │ │
│ Auth ◀──────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
11. 组件模型 (ART 0515)
11.1 组件清单
| 组件 |
类型 |
职责 |
| MRRCServer |
核心 |
Tornado主服务器,WebSocket处理 |
| AudioCapture |
核心 |
PyAudio音频采集 |
| AudioPlayer |
核心 |
PyAudio音频播放 |
| WDSPProcessor |
核心 |
WDSP DSP处理 (NR2/NB/ANF/AGC) |
| AudioEncoder |
核心 |
音频编码 (Int16/Opus/ADPCM) |
| AudioDecoder |
核心 |
音频解码 |
| HamlibClient |
核心 |
rigctld通信客户端 |
| ControlHandler |
核心 |
控制命令处理 |
| SessionManager |
支撑 |
会话管理 |
| AuthManager |
支撑 |
用户认证 |
| ATRProxyClient |
支撑 |
ATR-1000 Unix Socket客户端 |
| RESTAPIHandler |
扩展 |
REST API处理器 |
| VoiceAssistantClient |
扩展 |
语音助手客户端 |
| CWDecoder |
扩展 |
CW ONNX解码器 |
11.2 组件接口
┌─────────────────────────────────────────────────────────────────────────┐
│ 组件接口定义 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ │
│ │ MRRCServer │ │
│ ├─────────────────┤ │
│ │ +start() │ │
│ │ +stop() │ │
│ │ +handle_ws() │ │
│ │ +handle_http() │ │
│ └────────┬────────┘ │
│ │ │
│ ┌────────┼────────────────────────────────────────┐ │
│ │ ▼ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌──────────┐ │ │
│ │ │AudioCapture│ │AudioPlayer │ │Control │ │ │
│ │ │+start() │ │+play() │ │+setFreq()│ │ │
│ │ │+stop() │ │+stop() │ │+setMode()│ │ │
│ │ │+read() │ │+flush() │ │+setPTT() │ │ │
│ │ └──────┬──────┘ └──────┬──────┘ └────┬────┘ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌─────────────┐ ┌───────────────────────┐ │ │
│ │ │AudioEncoder│ │ WDSPProcessor │ │ │
│ │ │+encode() │ │+process() │ │ │
│ │ └──────┬──────┘ │+setNR2() │ │ │
│ │ │ │+setAGC() │ │ │
│ │ │ └───────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │HamlibClient │ │ATRProxyClient│ │ │
│ │ │+send_cmd() │ │+connect() │ │ │
│ │ │+get_freq() │ │+send() │ │ │
│ │ │+set_freq() │ │+recv() │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
11.3 组件协作
| 协作 |
描述 |
| TX Audio Path |
Mic → AudioCapture → AudioEncoder → MRRCServer → Radio |
| RX Audio Path |
Radio → PyAudio → WDSPProcessor → AudioDecoder → Browser |
| Control Path |
Browser → MRRCServer → HamlibClient → rigctld → Radio |
| ATR Path |
MRRCServer → ATRProxyClient → ATR-1000 Device |
12. 运营模型 (ART 0522)
12.1 系统拓扑
┌─────────────────────────────────────────────────────────────────────────┐
│ MRRC 系统拓扑 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ Node: MRRC Server │ │
│ │ ┌─────────────────────────────────────────────────────────────┐ │ │
│ │ │ OS: macOS/Linux │ │ │
│ │ │ ┌───────────────────────────────────────────────────────┐ │ │ │
│ │ │ │ Python 3.12+ │ │ │ │
│ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │
│ │ │ │ │ MRRC │ │ rigctld │ │atr1000_ │ │ voice │ │ │ │ │
│ │ │ │ │Server │ │ │ │ proxy │ │assistant│ │ │ │ │
│ │ │ │ │ :8877 │ │ :4532 │ │ :60001 │ │ :9090 │ │ │ │ │
│ │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ └──────────┼───────────┼───────────┘ │ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ │ ┌──────────────┴───────────┴──────────────┐ │ │ │ │
│ │ │ │ │ PyAudio / WDSP / Hamlib │ │ │ │ │
│ │ │ │ └─────────────────────────────────────────┘ │ │ │ │
│ │ │ └───────────────────────────────────────────────────┘ │ │ │
│ │ │ │ │
│ │ └─────────────────────────────────────────────────────────────┘ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────┼──────────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌─────────────┐ │
│ │ Radio Device │ │ ATR-1000 │ │ Audio │ │
│ │ IC-M710 │ │ Tuner │ │ Device │ │
│ │ Serial: │ │ IP: │ │ USB CODEC │ │
│ │ /dev/tty... │ │ 192.168.1.63 │ │ │ │
│ └───────────────┘ └───────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
12.2 节点描述
| 节点 |
类型 |
规格 |
软件 |
| MRRC Server |
应用服务器 |
4+ CPU, 8+ GB RAM |
Python 3.12+, Tornado |
| rigctld |
控制器进程 |
- |
Hamlib |
| ATR-1000 Proxy |
代理进程 |
- |
Python |
| 客户端 |
浏览器 |
Modern Browser |
Chrome/Safari/Edge |
12.3 连接矩阵
| 源 |
目标 |
协议 |
端口 |
| Browser |
MRRC Server |
HTTPS/WSS |
443/8877 |
| MRRC Server |
rigctld |
TCP |
4532 |
| MRRC Server |
ATR-1000 Proxy |
Unix Socket |
/tmp/atr1000_*.sock |
| ATR-1000 Proxy |
ATR-1000 Device |
WebSocket |
60001 |
| MRRC Server |
Voice Assistant |
HTTP |
9090 |
| External App |
REST API |
HTTP |
8080 |
12.4 部署配置
| 环境 |
配置 |
| 开发 |
HTTP, localhost, 单实例 |
| 生产 |
HTTPS (TLS), 域名, 多实例支持 |
13. 可行性评估 (ART 0530)
13.1 风险评估 (Risks)
| ID |
风险 |
概率 |
影响 |
缓解措施 |
| R1 |
音频延迟过高 |
中 |
高 |
AudioWorklet优化,缓冲区调整 |
| R2 |
PTT可靠性不足 |
低 |
高 |
预热帧机制,确认重试 |
| R3 |
WDSP集成困难 |
低 |
中 |
备选RNNoise方案 |
| R4 |
移动端兼容性 |
中 |
中 |
多浏览器测试 |
| R5 |
多实例配置复杂 |
中 |
中 |
标准化配置模板 |
13.2 假设 (Assumptions)
| ID |
假设 |
置信度 |
| A1 |
用户有稳定的互联网连接 |
高 |
| A2 |
电台支持Cat控制 (rigctld) |
高 |
| A3 |
浏览器支持WebSocket |
高 |
| A4 |
用户具备基本网络知识 |
中 |
13.3 问题 (Issues)
| ID |
问题 |
优先级 |
状态 |
| I1 |
多实例Unix Socket配置需要完善 |
高 |
已解决 |
| I2 |
ATR-1000设备连接稳定性 |
中 |
监控中 |
13.4 依赖 (Dependencies)
| ID |
依赖 |
所有者 |
| D1 |
Hamlib/rigctld正常运行 |
用户 |
| D2 |
网络可达性 |
用户 |
| D3 |
TLS证书配置 |
用户 |
13.5 可行性结论
| 维度 |
评估 |
说明 |
| 技术可行 |
✅ 高 |
核心功能已在V4.9实现 |
| 市场可行 |
✅ 高 |
移动端远程控制需求明确 |
| 资源可行 |
✅ 高 |
开源项目,社区支持 |
| 时间可行 |
✅ 高 |
敏捷迭代,持续交付 |
14. 版本历史
| 版本 |
日期 |
作者 |
变更 |
| V1.0 |
2026-03-15 |
MRRC Team |
初始SDD文档 |
本文档遵循IBM Team Solution Design (TeamSD)方法论生成
文档编码: SDD-MRR-2026-001