KB9IQX RX-only APRS iGate using RTL-SDR

I wanted to build an iGate base station that would not tie up a radio... and I had SDRs lying around...

The ultimate goal was to be as low power as possible, thus I started with the RaspPi Zero W. TL;DR this didn't work so I moved up models and settled on the standard 3B+ because that's what worked.



Other sites with installation instructions that I referenced before wandering off on my own.


TL;DR download and run my script:

sudo ./setup-rxaprsigate

More detailed, manual version:

0. Read over the references below. They are good. These instructions are basically a synthesis of those.

1. Install an image. I used Raspbian Stretch (9) because that's what I had lying around on my desktop.

2. Log into or SSH into your machine.

3. Install and build Osmocom RTL-SDR At this other page you will find great,detailed instructions... don't worry that it's ADS-B not APRS, the basic drivers are the same.

4a. Install and build WB2OSZ Direwolf if that is the method you want to use to log in to APRS (this is what I did). Instructions are on the GitHub page. Annoyingly, this puts the configuration files in your user home directory, which you may be fine with. This annoys me, so my aforementioned script moves the conf files to /usr/local/etc where the gods intended them to be installed.

4b. Install and build Elias Oenal's multimon-ng if you do not want to use Direwolf. I don'trecommend this route for logging into APRS because you'll have to install another python app that's built on top of this one. HOWEVER, go ahead an build this app because it is a nice one for local monitoring and testing.

Install and build asdil12's pymultimonaprs. Follow the instructions in the README file.

Configure /etc/pymultimonaprs file per instructions in the README.

5. Calibrate your SDR to find the PPM offset. This is a good idea. For the life of me I could not get kalibrate-rtl to compile. So I am just running on luck.

Maybe this this one will work?

Or maybe this one...

wget -qO - https://github.com/asdil12/kalibrate-rtl/tarball/arm_memory | tar zxvf -
cd asdil12-kalibrate-rtl-b3060b5
./configure --prefix=/usr/local
sudo make install

6. Test and then run the whole chain of things as explained below.


You have two choices...

1. Direwolf

To use direwolf for demodulating/decoding and sending to APRS-IS, do the following.

The following command line works well for testing. Although you can also run your iGate perfectly fine this way. There will be an endlessly open terminal and occasionally scrolling packets for your monitoring pleasure. :) Be aware that if your terminal closes for whatever reason, your iGate will go down with it.

rtl_fm -f 144.39M - | direwolf -c /path/to/sdr.conf -r 24000 -D 1 -

The sdr.conf controls some parameters, such as credentials for properly iGateing to APRS-IS.

For a permanent and automated station, you'll probably want to run this as a service that starts on bootup. You can do this using the standard (e.g. systemd) that your system uses to run services -or- you can put this command in your /etc/rc.local script -or- you can run the dw-start.sh command via crontab.

2. MultimonNG + PyMultimonAPRS

For testing, the following command lines use multimonNG for demodulating/decoding. It is handy for testing, troubleshooting, and local monitoring as it echoes a neat, clean one-liner per APRS packet. Note that the following does not forward anything to the APRS gateway; it is local.

This runs it in "APRS mode": neat, crisp, one-line sentences that are suitable for iGate-ing

rtl_fm -f 144.390M -s 22050 | multimon-ng -t raw -a AFSK1200 -A -

This runs it in some kind of other business: more verbose, probably for human-eyeball reading and not suitable for iGate-ing

rtl_fm -f 144.390M -s 22050 | multimon-ng -t raw -a AFSK1200 -f alpha -

You should see decoded signals coming in on the screen. This means your SDR is receiving packets from other stations.

Next, run the following, which runs the above and chains that to the final piece: logging into APRS.IS and sending your received packets to the network map. You should see your own packet and others' scrolling by.
pymultimonaprs -v

To run for realz, follow the instructions in the pymultimonaprs README to run this as a system service. The install script should install the system service script in the correct place. You will have to tell systemctl to reload so that it rereads the newly installed script.

sudo systemctl daemon-reload

Finally, tell the service to start, properly.

sudo systemctl start pymultimonaprs

Things should be running properly. You can check the status via systemctl. In the output, you will see that the commands above used for manual testing will be running automatically invoked by the pymultimonaprs service:

user@hostname:/ $ sudo systemctl status pymultimonaprs.service 
* pymultimonaprs.service - PyMultimonAPRS
   Loaded: loaded (/usr/lib/systemd/system/pymultimonaprs.service; disabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-10-24 02:36:34 PDT; 1min 52s ago
 Main PID: 3915 (pymultimonaprs)
   CGroup: /system.slice/pymultimonaprs.service
           |-3915 /usr/bin/python /usr/local/bin/pymultimonaprs --syslog
           |-3920 rtl_fm -f 144390000 -s 22050 -p0 -g 0 -E none -d 0 -
           |-3921 multimon-ng -a AFSK1200 -A -t raw -

Oct 24 02:36:34 node514263 systemd[1]: Started PyMultimonAPRS.
Oct 24 02:36:35 node514263 pymultimonaprs[3915]: Starting pymultimonaprs
Oct 24 02:36:35 node514263 pymultimonaprs[3915]: connecting... ('', 14580):14580
Oct 24 02:36:35 node514263 pymultimonaprs[3915]: connected
Oct 24 02:36:35 node514263 pymultimonaprs[3915]: # aprsc 2.1.4-g408ed49
Oct 24 02:36:35 node514263 pymultimonaprs[3915]: login YOURCALLSIGN (PyMultimonAPRS 1.3.2)
Oct 24 02:36:35 node514263 pymultimonaprs[3915]: # logresp YOURCALLSIGN verified, server T2USANW


Finally finally, to tell the service to start everytime the machine boots, do the following:

sudo systemctl enable pymultimonaprs.service

Note: The /etc/pymultimonaprs file contains static lat/lon position for the iGate. This means that you will have to edit this if you move your iGate to a new position.


From http://www.aprs.org/aprs11/SSIDs.txt
SSID RECOMMENDATIONS:  It is very convenient to other mobile 
operators or others looking at callsigns flashing by, to be able to 
recognize some common applications at a glance.  Here are the 
recommendations for the 16 possible SSID's (the limit of 16 comes 
from the 4 bits available in the AX.25 protocol.  Note, The SSID of 
zero is dropped by most display applications.  So a callsign with no 
SSID has an SSID of 0.

-0 Your primary station usually fixed and message capable
-1 generic additional station, digi, mobile, wx, etc
-2 generic additional station, digi, mobile, wx, etc
-3 generic additional station, digi, mobile, wx, etc
-4 generic additional station, digi, mobile, wx, etc
-5 Other networks (Dstar, Iphones, Androids, Blackberry's etc)
-6 Special activity, Satellite ops, camping or 6 meters, etc
-7 walkie talkies, HT's or other human portable
-8 boats, sailboats, RV's or second main mobile
-9 Primary Mobile (usually message capable)
-10 internet, Igates, echolink, winlink, AVRS, APRN, etc
-11 balloons, aircraft, spacecraft, etc
-12 APRStt, DTMF, RFID, devices, one-way trackers*, etc
-13 Weather stations
-14 Truckers or generally full time drivers
-15 generic additional station, digi, mobile, wx, etc

* One-way trackers should best use the -12 one-way SSID indicator
because the -9's usually mean a ham in full APRS communication
both message and voice.  The -9's can be contacted by APRS message
or by Voice on his frequency included in his beacon, or on Voice
Alert if he is in simplex range.  The -12's are just moving Icons
on the map and since they have no 2 way communication for ham radio
they are not generally of routine interest to other operators.