From hardware connection to software configuration, set up a complete remote transceiver control system in 5 minutes
| Device | Specifications | Notes |
|---|---|---|
| Transceiver | CAT-capable amateur radio | IC-7100, FT-991A, IC-R9000, etc. |
| Computer | macOS or Linux | 8GB+ RAM recommended, USB ports |
| USB Sound Card | 16kHz sample rate support | USB Audio CODEC recommended |
| Serial Cable | USB-to-Serial (RS-232) | For transceiver control |
| Audio Cables | 3.5mm audio cables | Transceiver audio in/out |
| Device | Purpose |
|---|---|
| ATR-1000 Tuner | Automatic tuner, power/SWR monitoring |
| RTL-SDR | Spectrum display |
| NanoVNA | Antenna analysis |
βββββββββββββββ USB Serial ββββββββββββ
β Transceiver ββββββββββββββββββββββΊβ Computer β
β (IC-7100) β USB Audio β (macOS) β
ββββββββ¬ββββββββββββββββββββββββββββΊββββββ¬ββββββ
β β
β RF β Network
β β
ββββββββΌβββββββ ββββββΌββββββ
β Antenna β βMobile/Tabβ
βββββββββββββββ ββββββββββββ
10.15+ (Catalina and later)
RecommendedUbuntu 20.04+, Debian 10+
Supported| Software | Min Version | Purpose | Install Command |
|---|---|---|---|
| Python | 3.9+ | Backend runtime | brew install python@3.12 |
| Hamlib | 4.0+ | Transceiver control | brew install hamlib |
| PyAudio | 0.2.11+ | Audio capture | pip3 install pyaudio |
| Tornado | 6.0+ | Web server | pip3 install tornado |
git clone https://github.com/cheenle/UHRR_mac.git
cd UHRR_mac
# Install Homebrew (if not installed)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Install dependencies
brew install python@3.12 hamlib portaudio ffmpeg
# Install Python packages
pip3 install pyaudio tornado numpy sounddevice soundfile
# Download WDSP source
cd /tmp
git clone https://github.com/g0orx/wdsp.git
cd wdsp
make
# Install library
sudo cp libwdsp.dylib /usr/local/lib/
# For Linux
# sudo cp libwdsp.so /usr/local/lib/ && sudo ldconfig
π‘ WDSP provides professional NR2 spectral noise reduction, significantly improving receive audio quality
Edit MRRC.conf file:
# Transceiver configuration
[HAMLIB]
rig_pathname = /dev/cu.usbserial-230 # Modify as needed
rig_model = IC_M710 # Transceiver model
rig_rate = 4800 # Baud rate
stop_bits = 2
# Audio devices
[AUDIO]
outputdevice = USB Audio CODEC
inputdevice = USB Audio CODEC
# Server configuration
[SERVER]
port = 8877
certfile = certs/fullchain.pem
keyfile = certs/radio.vlsc.net.key
# IC-7100 example
rigctld -m 3070 -r /dev/cu.usbserial-230 -s 4800 -C stop_bits=2
# Or use control script
./mrrc_control.sh start-rigctld
π Common transceiver model codes: IC-7100=3070, FT-991A=1035, IC-R9000=30003
[SERVER]
port = 8877 # Web server port
certfile = certs/fullchain.pem # TLS certificate path
keyfile = certs/radio.vlsc.net.key # TLS private key path
auth = FILE # Auth method: FILE/PAM
db_users_file = MRRC_users.db # User database
debug = False # Debug mode
[AUDIO]
outputdevice = USB Audio CODEC # Audio output device
inputdevice = USB Audio CODEC # Audio input device
sample_rate = 48000 # Sample rate
buffer_size = 256 # Buffer size
[HAMLIB]
rig_pathname = /dev/cu.usbserial-230 # Transceiver serial device
rig_model = IC_M710 # Transceiver model code
rig_rate = 4800 # Baud rate
data_bits = 8
stop_bits = 2
serial_handshake = None
[CTRL]
interval_smeter_update = 0.5 # S-meter update interval (seconds)
[PANADAPTER]
sample_rate = 960000
center_freq = 68330000
gain = 10
[WDSP]
enabled = True
sample_rate = 48000
buffer_size = 256
nr2_enabled = True # Spectral noise reduction
nb_enabled = True # Noise blanker
anf_enabled = False # Auto notch filter
agc_mode = 3 # AGC mode
bandpass_low = 300.0 # Low cut frequency
bandpass_high = 2700.0 # High cut frequency
python3 -c "
import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
info = p.get_device_info_by_index(i)
print(f'{i}: {info[\"name\"]} (in:{info[\"maxInputChannels\"]}, out:{info[\"maxOutputChannels\"]})')
p.terminate()
"
# Start all services
./mrrc_control.sh start
# Check status
./mrrc_control.sh status
# View logs
./mrrc_control.sh logs 50
# 1. Start rigctld
rigctld -m 3070 -r /dev/cu.usbserial-230 -s 4800
# 2. Start MRRC main service
python3 ./MRRC
# 3. Start ATR-1000 proxy (optional)
./mrrc_control.sh start-atr1000
# Use install script
./mrrc_setup.sh install
# Or use launchd
launchctl load ~/Library/LaunchAgents/com.user.mrrc.plist
launchctl start com.user.mrrc
MRRC supports running multiple independent instances on a single server, each connecting to different transceivers/sound cards.
# Create new instance (auto-generates config file)
./mrrc_multi.sh create radio1
# Configure instance parameters
# Edit MRRC.radio1.conf to set audio devices, serial port, etc.
# Start specific instance
./mrrc_multi.sh start radio1
# Stop specific instance
./mrrc_multi.sh stop radio1
# View all instance status
./mrrc_multi.sh status
# View instance logs
./mrrc_multi.sh logs radio1 50
# List all instances
./mrrc_multi.sh list
| Instance Name | Web Port | rigctld Port | Socket Path |
|---|---|---|---|
| radio1 | 8891 | 4531 | /tmp/mrrc_radio1.sock |
| radio2 | 8892 | 4532 | /tmp/mrrc_radio2.sock |
| radio3 | 8893 | 4533 | /tmp/mrrc_radio3.sock |
π Each instance has independent ATU learning parameters stored in atr1000_tuner.json
# Build image
docker-compose build
# Start service
docker-compose up -d
# View logs
docker-compose logs -f
# Use multi-instance config
docker-compose -f docker-compose.multi.yml up -d
devices: - /dev/cu.usbserial-230:/dev/ttyUSB0Symptom: Page shows "Disconnected"
Solution:
./mrrc_control.sh logsSymptom: Frequency/mode cannot be changed
Solution:
ls /dev/cu.*ps aux | grep rigctldrigctl -m 3070 fSymptom: Cannot hear receive audio
Solution:
./dev_tools/test_audio.pySymptom: Press transmit button, no response
Solution:
./mrrc_control.sh logs | grep PTT# Test audio
python3 dev_tools/test_audio.py
# Test connection
python3 dev_tools/test_connection.py
# Debug audio page
open dev_tools/debug_audio.html
Check technical documentation or join community discussion