OGN APRS Protocol

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
is the climb rate in feet-per-minute.
+0.0rot
is the turn-rate as reported by FLARM (or OGN tracker). 1rot is the standard aircraft rotation rate of 1 half-turn per minute.
5.5dB
is the Signal-to-Noise ratio measured upon reception. 4-5dB is about the limit of meaningful reception.
SNR can change as a function of many factors: distance, aircraft orientation, obstacles, …
3e
is the number of bit errors corrected in the packet upon reception. It is recommended that you ignore packets that have a high CRC error rate (>5) as their information may be corrupt. However, starting version 0.1.2 positions are checked for time-position consistency thus false positions should be rare.
-4.3kHz
is the frequency offset measured upon reception. Starting version 0.1.2 this offset is correctly calibrated against the GSM signals thus should be same or close when receiving same aircraft with different receivers. This offset can slowly change as a function of temperature in the glider and/or emitter's unit supply voltage.
!W52!
is a APRS position precision enhancement. "5" is the third decimal digit of latitude minutes, "2" is the added digit of longitude minutes.

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

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License