APRS iGate alongside a webSDR receiver
Archive post.
Translated from Ukrainian.
Note (2026): the sdr.ur5zhf.com webSDR receiver was shut down long ago and the address no longer works. The post stays as a setup archive.
Back then a 2-meter band webSDR receiver was running in Mykolaiv at sdr.ur5zhf.com. It ran on OpenWebRX. Setup details are on the source code site: https://github.com/simonyiszk/openwebrx
What I’m after is using one SDR receiver for several tasks without taking the webSDR site down. Today we’ll try to build an APRS iGate.
Luckily, the OpenWebRX folks did it right: the application has a microservice architecture. In short, the program starts a server that connects to the SDR receiver over USB and uses netcat to serve the raw data on 127.0.0.1:4951. Then each client gets its own connection, where the stream is decoded into audio.
The server side is a bash command that listens on port 4951 on the local address.
The client side is more involved:
nc -v 127.0.0.1 4951 | csdr convert_u8_f | csdr shift_addition_cc --fifo /tmp/openwebrx_pipe_140160755639360_shift_pipe | csdr fir_decimate_cc 181 0.000828675 HAMMING | csdr bandpass_fir_fft_cc --fifo /tmp/openwebrx_pipe_140160755639360_bpf_pipe 0.0289618970043 HAMMING | csdr squelch_and_smeter_cc --fifo /tmp/openwebrx_pipe_140160755639360_squelch_pipe --outfifo /tmp/openwebrx_pipe_140160755639360_smeter_pipe 5 1 | csdr fmdemod_quadri_cf | csdr limit_ff | csdr old_fractional_decimator_ff 1.00217687075 | csdr deemphasis_nfm_ff 11025 | csdr fastagc_ff 1024 | csdr convert_f_s16 | csdr encode_ima_adpcm_i16_u8
But the idea is simple: nc -v 127.0.0.1 4951 opens a connection to the local address, and then a pipe chains filters from the DSP library that decodes the raw data. The commands are documented at https://github.com/simonyiszk/csdr
All that’s left is to write a command that connects to the raw data server the same way, turns it all into NFM audio and passes it on to an APRS program. In our case that’s DireWolf.
But first we need to create the sdr.conf file that direwolf will read its configuration from. I saved it in my home directory:
#
# Sample configuration for SDR read-only IGate. #
# We might not have an audio output device so set to null.
# We will override the input half on the command line. ADEVICE null null
ADEVICE stdin null
ADEVICE - null
CHANNEL 0
# Put your callsign in place of xxx below.
MYCALL YOUR_CALL
# Pick appropriate servers for your geographical region. #
# noam.aprs2.net
# soam.aprs2.net
# euro.aprs2.net
# asia.aprs2.net
# aunz.aprs2.net
#
# Change the following line if you are not in North America.
IGSERVER euro.aprs2.net
# You also need to specify your login name and passcode.
# This is the same passcode you would use with any other IGate # application. Contact the author if you can't figure out
# how to generate the passcode.
IGLOGIN YOUR_CALL 123456
# That's all you need for a receive only IGate which relays
# messages from the local radio channel to the global servers.
And here’s the command that will listen to the air and pass APRS traffic on to the internet:
nc -v 127.0.0.1 4951 | csdr convert_u8_f | csdr shift_addition_cc 0.1 | csdr fir_decimate_cc 181 0.000828675 HAMMING | csdr fmdemod_quadri_cf | csdr limit_ff | csdr deemphasis_nfm_ff 11025 | csdr fastagc_ff | csdr convert_f_s16 | direwolf -c sdr.conf -r 11025 -D 1 -
Running DireWolf
Now you can transmit an APRS beacon from the radio in your car on 144.800 MHz and see a picture like this on http://aprs.fi or any other APRS packet tracking service.