A Text Overview
The actual APRS protocol is text based, though using a compact representation. For example over the APRS connection you could receive messages like the following:
LFNW>APRS,TCPIP*,qAC,GLIDERN5:/183804h4254.53NI00203.90E&/A=001000
LFNW>APRS,TCPIP*,qAC,GLIDERN5:>183804h v0.2.6.ARM CPU:0.7 RAM:505.3/889.7MB NTP:0.4ms/+7.7ppm +0.0C 0/0Acfts[1h] RF:+69-4.0ppm/+1.77dB/+3.5dB@10km[184484]/+11.2dB@10km[1/1]
FLRDDE626>APRS,qAS,EGHL:/074548h5111.32N/00102.04W'086/007/A=000607 id0ADDE626 -019fpm +0.0rot 5.5dB 3e -4.3kHz
FLRDDE626>APRS,qAS,EGHL:/074557h5111.32N/00102.01W'086/006/A=000607 id0ADDE626 +020fpm +0.3rot 5.8dB 4e -4.3kHz
FLRDDE626>APRS,qAS,EGHL:/074559h5111.32N/00102.00W'090/006/A=000607 id0ADDE626 +020fpm -0.7rot 8.8dB 0e -4.3kHz
FLRDDE626>APRS,qAS,EGHL:/074605h5111.32N/00101.98W'090/006/A=000607 id0ADDE626 +020fpm +0.0rot 5.5dB 1e -4.2kHz
# aprsc 2.0.14-g28c5a6a 29 Jun 2014 07:46:15 GMT GLIDERN1 37.187.40.234:14580
The first 2 lines is a beacon from a receiver (receiver beacon), it contains information as to where the receiver is located and in the free form fields some information about the receiver itself:
LFNW>APRS,TCPIP*,qAC,GLIDERN5:/183804h4254.53NI00203.90E&/A=001000
LFNW>APRS,TCPIP*,qAC,GLIDERN5:>183804h v0.2.6.ARM CPU:0.7 RAM:505.3/889.7MB NTP:0.4ms/+7.7ppm +0.0C 0/0Acfts[1h] RF:+69-4.0ppm/+1.77dB/+3.5dB@10km[184484]/+11.2dB@10km[1/1]
The next lines are position reports from an aircraft (aircraft beacons)
FLRDDE626>APRS,qAS,EGHL:/074548h5111.32N/00102.04W'086/007/A=000607 id0ADDE626 -019fpm +0.0rot 5.5dB 3e -4.3kHz
The APRS symbols are the ones used to separate the altitude of the longitude (for example / on the above lines) and the symbol used to separate the longitude from the course/speed (for example ' on the above lies)
This is the APRS symbol table:
static const char *AprsIcon[16] = // Icons for various FLARM acftType's
{
"/z", // 0 = ?
"/'", // 1 = (moto-)glider (most frequent)
"/'", // 2 = tow plane (often)
"/X", // 3 = helicopter (often)
"/g" , // 4 = parachute (rare but seen - often mixed with drop plane)
"\\^", // 5 = drop plane (seen)
"/g" , // 6 = hang-glider (rare but seen)
"/g" , // 7 = para-glider (rare but seen)
"\\^", // 8 = powered aircraft (often)
"/^", // 9 = jet aircraft (rare but seen)
"/z", // A = UFO (people set for fun)
"/O", // B = balloon (seen once)
"/O", // C = airship (seen once)
"/'", // D = UAV (drones, can become very common)
"/z", // E = ground support (ground vehicles at airfields)
"\\n" // F = static object (ground relay ?)
} ;
in C++ format.
And the last line is a keep alive from the APRS server. The leading hash symbol indicates a comment
# aprsc 2.0.14-g28c5a6a 29 Jun 2014 07:46:15 GMT GLIDERN1 37.187.40.234:14580
OGN-specific beacons
Aircraft Beacons
After the standard APRS information is some information that is OGN specific:
id0ADDE626 -019fpm +0.0rot 5.5dB 3e -4.3kHz
The first field combines the FLARM/ICAO/OGN address, adresse type, aircraft type and privacy flags.
It is meant to be unique in the network. It is, except for rare cases. Its form is
idXXYYYYYY
where X and Y stand for hexadecimal digits. YYYYYY is the address.
XX encodes stealth mode S, no-tracking flag T, aircraft type tttt and address type aa as follows:
STttttaa
S, T, tttt, aa stand for 8 bits from most to least significant. Note that no messages with
the no-tracking set flag should ever appear on the public APRS network.
Sample: id06DF0A52
0x06 = 0b00 0001 10: sender details (2 digit hex number encoding 8 bits)
0b0 = false: stealth mode boolean (should never be "1")
0b0 = false: no-tracking boolean (must ignore if "1")
0b0001 = 1: sender (aircraft) type ("GLIDER")
0b10 = 2: address type ("FLARM")
DF0A52: sender address
Sample: id0D3E0F90
0x0D = 0b00 0011 01: sender details (2 digit hex number encoding 8 bits)
0b0 = false: stealth mode boolean (should never be "1")
0b0 = false: no-tracking boolean (must ignore if "1")
0b0011 = 3: sender (aircraft) type ("Helicopter")
0b01 = 1: address type ("ICAO")
3E0F90: sender address
Aircraft Category Type table Hexadecimal valueas assigned by FLARM. Range: from 0 to F:
0 = (reserved)
1 = glider/motor glider (turbo, self-launch, jet) / TMG
2 = tow plane/tug plane
3 = helicopter/gyrocopter/rotorcraft
4 = skydiver, parachute (Do not use for drop plane!)
5 = drop plane for skydivers
6 = hang glider (hard)
7 = paraglider (soft)
8 = aircraft with reciprocating engine(s)
9 = aircraft with jet/turboprop engine(s)
A = unknown
B = balloon (hot, gas, weather, static)
C = airship, blimp, zeppelin
D = unmanned aerial vehicle (UAV, RPAS, drone)
E = (reserved)
F = static obstacle
Address Type:
0b00 -> Unkown
0b01 -> ICAO
0b10 -> Flarm
0b11 -> OGN tracker
Next;
-019fpm
+0.0rot
5.5dB
SNR can change as a function of many factors: distance, aircraft orientation, obstacles, …
3e
-4.3kHz
!W52!
As from v0.2.5 there are additional fields available in the aircraft beacon:
example:
ICA4B4E68>APRS,qAS,Letzi:/152339h4726.50N/00814.20E'260/059/A=002253 !W65! id054B4E68 -395fpm -1.5rot 16.5dB 0e -14.3kHz gps1x2 s6.05 h4C rDF0CD1 +4.5dBm
description will follow shortly..
Receiver beacons
TODO To be updated. There are changes since v.0.2.7 - Receivers transport now two types of beacons (status & metrics)
Each receiver transmits a beacon every 5 minutes. This beacon contains location information for the receiver and some metrics on how it is performing.
CPU:0.8 - **load average**
RAM:211.1/458.7MB - **free and total ram**
NTP:0.2ms/-29.3ppm - **offset from NTP reference and rate at which it is being adjusted**
+45.5C - **only on some boxes (notably PI) temperature**
RF:+62-0.8ppm/+4.1dB - **RTLSDR information, +62 => manually configured adjustment, -0.8ppm adjustment based on GSM / +4.1db is how much louder is noise vs internal reference. **
Receiver status beacon:
OGN3FC859>OGNTRK,qAS,LZHL:>093215h h00 v00 9sat/1 164m 1002.6hPa +20.2degC 0% 3.34V 14/-110.5dBm 1/min
Description:
h00 = hardware version (not being filled yet)
v00 = software version (not being filled yet)
9sat/1 = GPS status: 9 satellites, FixQuality=1 (GPS)
164m = altitude by GPS
1002.6hPa = pressure
+20.2degC = temperature by baro, if not present then by CPU (but not very accurate then)
0% = humidity, no sensor yet…
3.34V = battery voltage, here battery divider not installed thus simply the 3.3V VCC, subject to innacuracies due to Vref of the CPU.
14/-110.5dBm = receiver noise level
1/min = number of packets received per minute (gives an idea of (radio) traffic intensity)
External Links
- Original APRS specification
- APRS Spec Addendum 1.2 Proposals (includes high precision !DAO! datum extension)
- OGN flavoured APRS-protocol documentation by svoop