当前版本 V6.1.18(文中 V5.x / V6.0.x 为历史版本,保留原样)
Deep dive into every core feature of MRRC, unleash the full potential of amateur radio
| Metric | Traditional Solution | MRRC Optimized |
|---|---|---|
| TX→RX Switch | 2-3 seconds | <100ms |
| PTT Reliability | 95% | 99%+ |
| Audio Bandwidth | 256kbps | 128kbps |
Integrates Warren Pratt's Digital Signal Processing library, the high-performance DSP library from the OpenHPSDR project, widely used in Thetis, piHPSDR and other professional amateur radio software.
Spectral subtraction based noise reduction, 15-20dB depth, extremely high speech fidelity, specifically optimized for SSB voice
Eliminates impulse interference, effectively suppresses electrical sparks, lightning and other burst noise
Automatically eliminates single-tone interference, suitable for CW tones, carrier interference scenarios
4 selectable modes: LONG/SLOW/MED/FAST, adapts to different signal environments
| Feature | WDSP (NR2) | RNNoise |
|---|---|---|
| Noise Reduction Depth | 15-20 dB | 10-15 dB |
| Speech Fidelity | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| SSB Optimization | ✅ Specifically Optimized | ❌ General Voice |
| Latency | < 20ms | 30-50ms |
Communication Protocol: WebSocket + JSON
Data Frame Format: FF CMD LEN DATA...
Response Example: ff050701031b1e000e01
→ SW=CL, IND=30(0.3uH), CAP=27(270pF)
V5.1 introduced a complete Web Audio API-based transmit audio processing chain — studio-grade speech optimization for amateur radio.
| Stage | Parameter | Value | Purpose |
|---|---|---|---|
| 4-Band EQ | Low-Cut / Mid-Cut / Presence / High-Cut | 150Hz / -2dB@500Hz / +3dB@2.4kHz / 3kHz | Shape voice for SSB clarity |
| Dynamic Compressor | Ratio / Attack / Release | 3:1 / 5ms / 50ms | Consistent modulation level |
| Noise Gate | Threshold | -50dB | Silence background when not speaking |
For simple 3-band EQ (legacy mode):
| Preset | Low (<100Hz) | Mid (1500Hz) | High (>2700Hz) | Use Case |
|---|---|---|---|---|
| HF Voice | -20dB | +6dB | -20dB | Standard SSB communication |
| Mobile Optimized | -15dB | +8dB | -24dB | Phone microphone |
| Weak Signal | -20dB | +10dB | -25dB | DX / contest |
V5.3 introduced live network bandwidth and latency monitoring, giving operators full visibility into connection quality.
Three-layer TX protection architecture designed to prevent the most dangerous failure mode in remote radio operation: a stuck transmitter. Each layer provides independent protection with redundant fallback paths.
Finger slides off TX button → immediate PTT release via touchmove/touchcancel handlers
Page goes to background or window loses focus while TX is active → forces PTT release. Prevents up to 30s of unintended transmission
Hardware watchdog: if TX state stays active >30s without confirmation, forces release
Processing lock held >3s → auto-released to prevent silent stop-failure leaving TX stuck
| Mechanism | Description |
|---|---|
| ACK Retry | After sending setPTT:false, waits up to 1s for server confirmation. If unconfirmed, retransmits up to 3 times |
| Redundant Audio-Path Fallback | On each retry, also sends s: via TX audio WebSocket as a redundant release path — works even if control WebSocket is half-open |
| Connection Death Trigger | After 3 failed ACK retries, forces full control-channel reconnect via onControlConnectionDead() |
| Mechanism | Description |
|---|---|
| 120s TOT Hard Limit | Time-Out Timer: PTTSafetyMonitor thread enforces absolute 120s maximum TX duration |
| Persistent Retry | PTT release retried every 2s until hardware confirms state change |
| Broadcast on Failure | pttError:release_failed or pttError:tot_timeout broadcast to all connected clients |
Follow the installation guide to set up a complete remote transceiver control system in 5 minutes
Shipped from V6.1.0, validated end-to-end on a real Windows machine in V6.1.18. The launcher checks a SHA256-pinned manifest at startup and downloads the new installer in the background (without interrupting your listening), then waits for you:
U and press Enter.Then: one UAC prompt → silent install → automatic restart onto the new version. The new version confirms the upgrade itself, so "did it work?" is a recorded fact rather than a guess, and Roll back to the previous version is one click too.
Console processes have no message loop (so the installer's RestartManager cannot close them);
an elevated process re-launching via runas can hang forever on a non-interactive window
station; the console code page is GBK (an emoji in a log line kills the log-forwarding thread); and
threading.Lock is per-process — with two launcher instances both download the same
temporary file. All ten of these traps were found by real-machine acceptance testing and are fixed;
the full case study is RC-002 (docs).
Menu → 🐞 Something went wrong collects what a maintainer actually needs:
launcher/server output, state.json, installer logs, the audio-device report,
performance sampling and a redacted config (whitelist only; secrets replaced;
certificates and the user database are never packaged), plus an automatic health summary
(IOLoop watchdog, TX init timing, audio health, ATR freshness). One click to upload to the
maintainer endpoint — or keep it local.
Device Config no longer hard-codes a model list: rig_models.py enumerates the
312 models of the locally installed hamlib at runtime and writes both keys the
stack reads ([HAMLIB] rig_model and [INSTANCE_SETTINGS] instance_rigctl_model),
flagging in the UI when they disagree with what rigctld reports.
MRRC is maintained as a product, not a zip file. Five stages form one loop — and you can see the last one for yourself at /answers/. The full table (what happens / how it is judged / what it produces / where the details live) is on Product Support Lifecycle:
| Stage | What happens |
|---|---|
| Release | Unit tests + an inline-JS syntax guard + an artifact-level hotfix
acceptance run (3/3) gate every build; the site carries latest.json (upgrade) and
patch.json (hotfix), and the published bytes are verified by SHA256 on the server. |
| Upgrade | One click (or U) → download + SHA256 → one UAC →
silent install → automatic restart; success is recorded as lastResult = ok by the new
version itself; one-click rollback to the previous version. |
| Diagnose | Menu → 🐞 Something went wrong builds a redacted bundle with an automatic health summary (startup count vs crashes, audio health, IOLoop, TX init, ATR freshness). |
| AI triage | A scheduled job fetches new reports, digests them, and asks the project's AI with a triage skill (evidence-first rules, conservative verdicts) for a structured conclusion. |
| Answer | The conclusion is published as a searchable card on the public answers page (find it by report id or keyword) — so most users solve it themselves. If it is a defect: workaround first, then hotfix (restart, no reinstall) or release. |
Hotfix channel: fixes in www/**, the loose app modules
(upgrade_core.py, support_bundle.py, …) and vendor ship
without repackaging — the app applies them on the next start.