v1.0 · 正式发布

口袋里的
SunSDR2 DX 电台

原生 iOS SwiftUI 应用,iPhone 远程操控 SunSDR2 DX 收发信机。 实时频谱瀑布图、低延迟音频、DSP 降噪、一键 PTT —— 完整替代 Web 前端。

GitHub 探索功能 加入微信群

加入讨论

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

MRRC-HAM 同好群微信二维码

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

完整的电台操控体验

从频谱瀑布到 DSP 降噪,从频道记忆到 PTT 发射 —— 所有功能都经过精心设计,专为 iPhone 触摸交互优化。

实时频谱瀑布

512-bin FFT 实时频谱,与 Web 前端匹配的颜色渐变。自适应噪声基底,可配置增益/偏置对比度拉伸。

  • 动态频率刻度(39k/78k/156k/312k IQ 带宽)
  • 点击瀑布图直接跳频
  • 5 帧累积 + 10fps 节流,零主线程开销

低延迟音频

RX:Int16 PCM 48kHz 通过 AVAudioPlayerNode 播放。TX:麦克风采集 → 降采样 → Int16 PCM → WebSocket。

  • RX 48kHz 高清音频回放
  • TX 16kHz 单声道采集
  • 实时 RMS 电平表
  • 一键静音

频率 & 模式控制

超大 56pt 等宽频率显示,步进调谐,12 个业余波段预设,USB/LSB/CW/AM/FM/WFM 六种模式。

  • 56pt 数字频率显示,点击输入
  • 5 档步进:1K/5K/10K/50K/100K
  • 160m–2m 共 12 个波段预设
  • CW/SSB/Wide/AM/FM 滤波器预设

DSP 降噪面板

完整的 WDSP 数字信号处理控制:NR2 降噪、NB 噪声消除、ANF 自动陷波、AGC 自动增益。

  • NR2 降噪 + 电平调节
  • NB / ANF / NF 独立开关
  • AGC:关 / 慢 / 中 / 快
  • 手动陷波列表(添加/删除)

频道记忆

3×3 网格频率预设,始终可见。一键切换频率和模式。空槽位显示占位符,随时快速保存。

  • 9 个频道槽位,3×3 网格布局
  • UserDefaults JSON 持久化
  • 滑动删除,快速保存
  • 点击即调谐频率+模式

系统设置

服务器地址配置、IQ 采样率选择(39k/78k/156k/312k)、Keychain 自动登录、连接状态诊断。

  • 4 档 IQ 采样率可切换
  • Keychain 安全存储密码
  • 4 路 WebSocket 连接状态指示
  • 收藏频道管理

精密的工程架构

4 路 WebSocket 连接、零第三方依赖、纯 Apple 框架构建。

SunsdrMobile iOS App SwiftUI · Combine AVAudioEngine sunmrrc Server FastAPI / Python radio.vlsc.net:8889 192.168.16.100 SunSDR2 DX 192.168.16.200 Port 50001/50002 HTTPS / WSS 4 WebSocket 连接 UDP /WSCTRX 双向 文本 · cmd:val /WSaudioRX 下行 二进制 · PCM/Opus /WSaudioTX 上行 二进制 · PCM /WSspectrum 下行 二进制 · 512 uint8
双向 文本
/WSCTRX
Bidirectional Text
cmd:val 协议 — 频率、模式、PTT、DSP
下行 二进制
/WSaudioRX
Server → Client
1B 标签 + Int16 PCM / Opus
上行 二进制
/WSaudioTX
Client → Server
Int16 PCM 16kHz 单声道
下行 二进制
/WSspectrum
Server → Client
512 × uint8 dB (0=-120dB, 255=0dB)

专为 iPhone 触摸交互设计

每个像素都经过精心布局,信息密度与操作便利性的最佳平衡。

CTRL RX TX FFT USB S7 23ms 14.074.000 20m ▼ 1K ▼ S-meter S7 -30k -20k -10k 14.074 +10k +20k +30k 🔊 45 AF RF SQL USB SSB 20m 14.074 40m 7.074 --- --.--- --- --.--- 10m 28.074 --- --.--- --- --.--- --- --.--- --- --.--- TX HeaderView 56pt 频率 WaterfallView 3×3 频道网格 96pt PTT

RX 主界面

频谱瀑布 + S 表 + 音频电平 + 增益滑块 + 模式选择 + 频道网格 + PTT

SMeterViewWaterfallView ModeSelectorFavoritesGrid PTTButtonGainSlider

DSP 面板

WDSP 总开关、NR2 降噪(带电平表和强度滑块)、NB/ANF/NF 开关、AGC 模式选择、手动陷波管理

NotchChartViewNR2 Card AGC ButtonGroupNotch List

设置

快速保存、收藏管理(滑动删除)、服务器配置 + 重连、连接状态诊断、IQ 采样率切换

Quick SaveFavorites List Server ConfigStatusLine

零主线程负担

所有繁重计算均在后台线程完成,确保 60fps 流畅滚动。

50%
帧跳过率
减半 dispatch 开销
帧累积
减少瀑布图处理频次
10fps
瀑布图层数上限
UIImage 更新节流
200KB
瀑布图显存
512×100×4 像素缓冲
4
WebSocket 并发连接
URLSessionWebSocketTask
0
第三方依赖
纯 Apple 框架

技术栈

Swift 5.9 SwiftUI Combine AVFoundation AVAudioEngine URLSessionWebSocketTask CGImage / UIKit Keychain UserDefaults XcodeGen iOS 17+

5 分钟上手

克隆、生成 Xcode 项目、构建、连接电台 —— 只需四步。

克隆仓库

从 GitHub 获取最新代码

git clone https://github.com/cheenle/SunsdrMobile.git

生成 Xcode 项目

使用 XcodeGen 从 project.yml 生成 .xcodeproj

cd SunsdrMobile && xcodegen generate

构建 & 运行

在 Xcode 中打开项目,选择 iPhone 真机,Cmd+R 运行

open SunsdrMobile.xcodeproj

连接电台

输入服务器地址和密码,自动登录并建立 4 路 WebSocket 连接

radio.vlsc.net:8889 → Keychain
在 GitHub 上查看

运行环境

iOS 17.0+ Xcode 15.0+ Swift 5.9 iPhone 真机 sunmrrc v3.4+ 自签名 TLS 证书

模拟器不支持完整的 AVAudioEngine 麦克风功能,需要物理 iPhone 设备

分工与沉淀契约

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

01 · 编辑前加载
加载 CLAUDE.md,无注册表
工作区 CLAUDE.md 在编辑前加载。本工程没有机器可读约束注册表,因此 Agent 只按成文契约执行,不声称存在自动门禁。
02 · 人来签字
App Store 发布与真机音频链路
App Store 提交,以及在真机上对音频链路的每一项判断,都由人签字。模拟器输出从不当作上波段的证据。
03 · 沉淀的契约
客户端能力边界
关于客户端能做什么、不能做什么的描述,作为这个 App 与电台之间的契约留存在此。