GSW - APRS Forwarder

Usage

Currently the APRS Forwarder supports two modes, single and multi. The forwarder parses APRS packets, so use a program such as DireWolf for reading packets through audio and printing the packets to standard input. DireWolf output should be piped to the forwarder which will send GPS data (currently latitude, longitude and altitude but more data can be sent in the future). 

Example Usages:

direwolf | python forwarder.py -s IP:PORT CALLSIGN
direwolf | python forwarder.py -m IP PORT:CALLSIGN PORT:CALLSIGN ... (as many port callsign pairs the user wants)

direwolf | python forwarder.py -s IP:PORT KD2YIE-1
direwolf | python forwarder.py -m IP 8080:KD2YIE-1 8081:KD2YIE-2 8082:KD2WSM-11 8083:KD2CH3 ... (as many port callsign pairs the user wants)

Implementation

Currently, the data is forwarded through a struct packet in big endian. The program uses regex to determine a valid APRS packet and then parses it. Certain data is extracted from the parsed data and is thrown into the struct packet to be sent out.

Link to Repo

https://github.com/AarC10/APRS-Forwarder

Other Notes

  • BigRedBee requires lock before valid data can be transmitted and not garbage characters
  • SSID should be specified too. If Direwolf reads KD2YIE-1 and the user specifies KD2YIE in the prompt, the program will ignore what Direwolf received
  • Make sure your radio's battery didn't die while using the program

Motivation

The ground infrastructure currently requires that all telemetry data come in as a UDP packet over the network, so all data sources from the vehicle need a way to be sent over a standard network. For SRAD boards on the rocket (e.g. SPICA, NIGEL), we get data over 900MHz RF through the XBees and have a special piece of hardware that converts XBee packets to Ethernet/UDP packets and sends them over the network to the ground station. Some COTS tracking solutions, like the BigRedBee, don't use 900MHz and currently we don't have a way to get that data to the ground station. The BigRedBee uses AFSK modulation to send AX.25 frames containing APRS packets. We have a tool that runs on a standard PC that will demodulate the AFSK output from our radios and unpack AX.25 frames, displaying only APRS information. We need a program that can read in APRS packets and convert them to UDP packets to send to the ground station.

Specifications

Write a program that:

  • reads APRS packets in ASCII format over standard input
  • sends parsed APRS data over UDP as soon as it's available, data of interest includes
    • latitude
    • longitude
    • altitude
    • GPS time
    • any other provided information (GPS fix, satellite number, etc.), the more the better
  • must send to a variable IPv4 address and UDP port
    • destination address and port will be provided over command line
  • must run on Ubuntu 18.04 ground computers, some things to note:
    • Using Python or C/C++ is preferable, Java runtime is currently NOT installed and I'd prefer to not have to install it on all the ground machines. Let me know if there's a language you would prefer to use and I'll see if it's something we can reasonably install.
  • executed in the following format:
    • ./aprs_fwd ip:port callsign
    • 'ip' is the IPv4 address of the ground station (this will likely be a multicast address, which doesn't make a different to the sender but that's why it needs to be configurable)
    • 'port' is the destination port for the UDP packets (e.g. the port the ground station will listen to)
    • 'callsign' is the callsign the APRS packets should be coming from, any APRS packets not from this callsign should be ignored
  • accounts for non-APRS data being sent to it
    • the program that will pass this application input will have some startup messages that need to be ignored, look for a newline followed by the callsign to signify the start of an APRS packet

Helpful Materials

Here is a sample output that will be passed to this program (note that it doesn't include some information like altitude, a better output will be generated soon). It does include the startup messages that should be ignored.

Here is the APRS reference protocol, it may also be easier to use Wikipedia for some info.