Skip to main content
Automatic Dependent Surveillance-Broadcast (ADS-B) is a surveillance technology in which aircraft periodically broadcast their state — including ICAO address, callsign, position, altitude, and velocity — without requiring interrogation from ground stations. Receivers on the ground and in other aircraft can passively receive these broadcasts on 1090 MHz. The “automatic” and “dependent” qualifiers reflect two key properties: transmissions are automatic (no external trigger needed) and the position data is dependent on the aircraft’s own navigation system (GNSS or inertial).

Mode S transponders and Extended Squitter

Mode S (Mode Select) is the underlying transponder standard that ADS-B builds upon. Mode S transponders do two things:
  1. Reply to interrogations — ground radar interrogates individual aircraft using a 24-bit ICAO address, and the transponder replies with altitude, identity, or other data.
  2. Spontaneously broadcast — a subset of Mode S transmissions, called Extended Squitter (ES), are sent without interrogation. These are the ADS-B messages.
The specific standard used for civil aviation ADS-B is 1090ES (1090 MHz Extended Squitter), defined in ICAO Annex 10 and DO-260B. The 1090 MHz frequency is shared with legacy secondary surveillance radar (SSR), so ADS-B receivers must coexist with older Mode A/C/S traffic.

Message structure

Every Mode S message begins with a common header. The first 5 bits identify the Downlink Format (DF), which determines both the total message length and how the remaining bits are interpreted.

Short messages — 56 bits

Used by DF 0, 4, 5, and 11. Contain a 32-bit data payload followed by a 24-bit parity/address field.

Long messages — 112 bits

Used by DF 16, 17, 18, 19, 20, and 21. Contain an 88-bit data payload followed by a 24-bit parity/address field.
Within the data payload, every message carries the aircraft’s ICAO 24-bit address (also called AA, Address Announced). This is a globally unique identifier assigned to each aircraft by its country of registration and is the primary key used to track individual aircraft across multiple messages. The DF 17 Extended Squitter payload also contains a 56-bit Message Extended Squitter (ME) field. The first 5 bits of the ME field are the Type Code (TC), which identifies what kind of ADS-B data follows — identification, surface position, airborne position, velocity, or status.

CRC-24 parity

Each Mode S message ends with a 24-bit field used for error detection. Its role differs by message type:
  • DF 11, 17, 18, 19 — The final 24 bits are a Parity/Interrogator ID (PI) field. A valid message has PI equal to the CRC computed over the preceding bits. This is a straightforward CRC check.
  • DF 0, 4, 5, 16, 20, 21 — The final 24 bits are an Address/Parity (AP) field. This field holds the CRC XOR’d with the transmitting aircraft’s ICAO address. A receiver can recover the ICAO address by computing AP XOR CRC(message). A message is accepted only if the recovered address matches a previously seen aircraft in the receiver’s plane dictionary.
The CRC polynomial used in gr-adsb is:
0xFFFA048 = 1 + x + x² + x³ + x⁴ + x⁵ + x⁶ + x⁷ + x⁸ + x⁹ + x¹⁰ + x¹¹ + x¹² + x¹⁴ + x²¹ + x²⁴
Because DF 0/4/5/16/20/21 require a known ICAO address to verify parity, gr-adsb will only accept these message types for aircraft it has already seen via a DF 11 or DF 17 message.

Compact Position Reporting (CPR)

ADS-B position messages (TC 9–18 for barometric altitude, TC 20–22 for GNSS height) do not transmit raw latitude and longitude. Instead, they use Compact Position Reporting (CPR), a scheme that encodes position at high resolution using only 17 bits per coordinate by taking advantage of the Earth’s geometry. CPR requires two consecutive messages — one even frame and one odd frame — to unambiguously resolve a global position. Each message carries a 1-bit frame flag indicating which type it is.
1

Receive even frame

An airborne position message arrives with frame_bit = 0. The receiver stores the 17-bit CPR latitude and longitude along with a timestamp.
2

Receive odd frame

A subsequent airborne position message arrives with frame_bit = 1. The receiver stores its CPR values.
3

Decode global position

Using both the even and odd CPR values, the receiver solves for the latitude zone index and computes decimal latitude and longitude. The most recently received frame is used for the final coordinate.

CPR timeout

CPR data becomes stale as the aircraft moves. gr-adsb uses a 30-second timeout (CPR_TIMEOUT_S = 30 in decoder.py): if the even and odd frame timestamps are more than 30 seconds apart, the stored CPR data is discarded and the position cannot be decoded until a fresh pair of frames is received.
If you only receive one frame type (e.g., only even frames), or if both frames are not received within 30 seconds of each other, position decoding will fail silently. This is a fundamental property of CPR, not a bug.
ADS-B at 1090 MHz operates alongside two related systems that gr-adsb may also encounter:
TIS-B rebroadcasts radar-derived traffic information for aircraft that are not themselves ADS-B equipped. These messages are transmitted by ground stations on 1090 MHz using DF 18 with certain CF field values (CF = 2, 3, or 5 in the CF field lookup table). gr-adsb recognizes these messages but TIS-B payload decoding is noted as not yet fully implemented.
ACAS (also known as TCAS) uses Mode S interrogations and replies to detect and resolve potential mid-air conflicts. ACAS-related messages include DF 0 (Short Air-Air Surveillance) and DF 16 (Long Air-Air Surveillance). These are 56-bit and 112-bit messages respectively and are fully decoded by gr-adsb when the aircraft’s ICAO address is already known.

Build docs developers (and LLMs) love