APRS RX IGate with RTL-SDR and Raspberry Pi


This will determine APRS-IS key, IGate location, and update the configuration file.


APRS-IS requires a passcode for authentication. It is a 5 digit passcode specific to your callsign, regardless of SSID extension. AB1CDE-1 and AB1CDE-5 use the same passcode. The passcode is the same if you’ve obtained it using another APRS-IS enabled service like APRSDroid. To obtain your passcode, enter

cd /home/pi/sources/pymultimonaprs/

python keygen.py YOUR_CALL_SIGN

Replace YOUR_CALL_SIGN to the desired for the IGate. Note the key for your callsign. Keep this safe and do not give it out!


This will change back to the user’s home directory.


Go to http://www.latlong.net/.

Enter the address where the IGate will appear on the APRS map. This should be the location where the IGate will ultimately be installed.  The format for all Google Map searches is

1234 Some Street, City, State Zipcode

Click Search.

The map can be zoomed in and the pin can be dropped by clicking on the map -or- enter an address near the location, search, and drop the pin on the map.

Note the Latitude and Longitude (including any negative signs).


Edit the configuration file by entering

sudo vim /etc/pymultimonaprs.json

If not familiar with VIM commands, pressing [I] will change VIM into insert mode where you can type where the cursor is located. [Backspace] and [Delete] keys remove text. Arrow keys are used to move the cursor around on screen. The [ESC] key exits insert mode.


The configuration file is a JSON data file.

Enter your callsign and SSID. SSID is the “-#” appended to a callsign. List of recommended SSIDs.

Enter the APRS-IS passcode determined by the keygen.py program.

If you are in the western hemisphere, change the order of gateways to North America (noam) first and European (euro) second.

Under the RTL object, set the frequency to 144.390 (APRS in the North America). Check the APRS Wiki for other frequencies.

Enter the PPM setting noted earlier. In this case, 43

For gain enter 48 (value used earlier).

Under the beacon object, enter the latitude and longitude noted from the website earlier.

The comment can be personalized or left alone. I added my website. Add your real callsign if the IGate callsign is not your officially issued callsign.


Under the status object, the text can be personalized or left alone.

Weather station data can be relayed. Check the pymultimonaprs README for details.

The send_every option is the number of seconds between beacon packets sent by this IGate to the APRS-IS network. This number should be 600 (seconds or 10 minutes) or greater.

Ambiguity can hide the exact coordinates (position) of the IGate.  A value between 0 and 4 can be used. Check the pymultimonaprs README for details.

Exit insert mode by pressing [ESC].

Save the file and exit VIM by entering:


Press [Enter].


Check the configuration file and connection to the APRS-IS network by entering

pymultimonaprs -v

This verifies the configuration file syntax is correct, APRS-IS passcode is valid, and you can connect to the APRS-IS network. You should see an info line saying ‘connected,’ another logresp ‘verified,’ two debug messages should be sent with position and comment the second status text. If you see these, pymultimonaprs is configured!

When your beacon packets are sent (to the APRS-IS network) initially, look for ‘rejected’ debug output messages on one or both sent messages.  Rejected messages are usually because of characters in the comment/status message fields the APRS-IS network doesn’t like (“/” are problematic because they are field separators in some cases).  Correct them by changing the message in the configuration file.  There are other reasons for rejected messages from your station too, like beaconing too often.

The IGate may receive RF packets and trigger ‘sending’ debug messages maybe seen.  These are messages sent to the APRS-IS network.  This is because pymultimonaprs has started both rtl_fm and multimon-ng in the background.

Any type-o’s in the configuration file will cause errors like “Invalid control character at: line x column yy (char zz)” due to missing brackets, colons, quotes, etc. Line/column/characters numbers are usually helpful but not always exact.  To restore the file to its original state, go here for a copy of the original, highlight the entire file, copy it to the clipboard, edit the pymultimonaprs.json as shown above, press and hold the [D] key to delete lines until “no lines in buffer” is displayed, press [I] to enter insert mode, then press and hold [SHIFT] and press the [INSERT] key to paste. Cannot connect errors are the result of configuration file for type-o’s for the gateways or a firewall might be blocking the connection.


Go to http://aprs.fi/.

In Track Callsign, enter the callsign and SSID entered in the pymultimonaprs configuration file.

Click Search.

You should now see your new IGate on the map!

Click Info on the popup box. If you don’t see the popup box, click the icon on the map.


Comment and Last Status are messages entered into the pymultimonaprs configuration file.

Last Position should be a recent update (within a couple minutes).

Exit pymultimonaprs by pressing and holding [CTRL] + [C].


With the setup working by testing each component and process individually, the system service can be enabled. A service is a process that starts automatically when the system is booted and runs in the background.

sudo systemctl enable pymultimonaprs

systemctl: a central management tool for controlling the init system (short for initialization, the first process started in a Unix operating system).
enable: tells systemctl to enable the named service to run at startup.
pymultimonaprs: is the name of the service. It was installed and disabled during execution of the setup.py script.

Now reboot:

sudo reboot

If the monitor is plugged in, once the Pi returns to the GUI desktop, the pymultimonaprs service should have started automatically.


Refresh the aprs.fi Station Info page for the IGate. Last Position should have updated again.


After some length of time, “Last heard a station directly” should update. This depends on APRS activity in the area. This DOES NOT mean the IGate is NOT decoding any packets. It DOES mean the IGate was NOT the first relay station to hear the initial transmission. I’ve seen this number go 45 minutes or an hour between updates.

The APRS RX IGate with RTL-SDR and Raspberry Pi is ready for service!

Other bits

The service can be checked at any time by running

sudo systemctl status pymultimonaprs

Should return ‘active (running)’ in green with a bunch of other data.  Any other status (dead) indicates an error with the hardware, supporting programs, configuration files, or a system error… to name a few.

On aprs.fi, the Station Info page has a section titled “Stations heard directly by YOUR_CALL_SIGN-1.”  This is a list of stations which were heard by your IGate and reported to APRS-IS first.  In other words, icons you help put on the map or helped track.

The /home/pi/sources directory can be removed as it is only needed to download source and compile.  Once the programs were installed, it can be removed.

The IGate callsign does not have to be your callsign. For example it could be a city name. This practice is accepted but typically followed when multiple IGates are setup over an area under a single callsign. For the IGate to legally identify, your officially issued callsign MUST BE in the comment line!! in the configuration file.  If you are not in the US, check your local regulations as they maybe different.

If your callsign changes (vanity callsign) the keygen program needs to be run again with the new callsign and configuration file updated.  Also needed if you decide to change the callsign of the IGate for reasons mentioned above.  If you removed the “sources” directory, follow the directions to create it and download pymultimonaprs from git.