Skip to main content
This guide walks you through opening the included example flowgraph, connecting your SDR, and observing decoded ADS-B messages from aircraft overhead.
GNU Radio Companion is launched from the terminal with the command gnuradio-companion.

Receive aircraft

1

Open GNU Radio Companion

Launch GNU Radio Companion from your terminal:
gnuradio-companion
2

Open the example flowgraph

In GNU Radio Companion, go to File → Open and navigate to:
gr-adsb/examples/adsb_rx.grc
This flowgraph contains a pre-configured receive chain: an SDR source block, magnitude operation, and the three gr-adsb blocks (Framer → Demod → Decoder) connected in sequence.
3

Configure the SDR source block

Double-click the SDR source block and set it to match your hardware.
RTL-SDR dongles are the most accessible starting point — they are inexpensive, widely available, and work out of the box with GNU Radio via the osmocom source block. HackRF and USRP are also supported.
Common SDR source device strings:
HardwareDevice string
RTL-SDRrtl=0
HackRFhackrf=0
USRPuhd
4

Set the center frequency to 1090 MHz

In the SDR source block (or the flowgraph variables), set the center frequency to 1090e6 Hz. ADS-B transmissions are standardized on 1090 MHz worldwide.
5

Set the sample rate

Set the sample rate to 2e6 (2 Msps) or another integer multiple of 2 Msps such as 4e6 or 6e6. The Framer and Demod blocks require the sample rate to be an integer multiple of 2 Msps.
6

Run the flowgraph

Click the Run button (or press F6). If aircraft are within range and transmitting, decoded messages will appear in the terminal within a few seconds.

Reading the output

Brief mode

The Brief print level (the default) renders a live terminal table with one row per tracked aircraft, updated as new messages arrive:
  Time    ICAO  Callsign  Alt  Climb Speed Hdng   Latitude    Longitude  Msgs
                            ft  ft/m    kt   deg         deg         deg     
00:55:55 a03816          12425  2112   316    -7  39.0346566 -76.8112793   10
00:55:55 aa7df3 SWA398    1950  -128   167    11  39.1743622 -76.8109131   28
Each row shows the last-known state for one aircraft. Fields remain blank until enough messages have been received to decode that value. The Msgs column shows how many messages have been received from that aircraft.

Verbose mode

To see every decoded field for every message, open the ADS-B Decoder block parameters and change Print Level to Verbose. Each message produces a block like this:
[INFO] ----------------------------------------------------------------------
[INFO] Datetime: 2019-07-31 00:43:37.784807 UTC
[INFO] SNR: 21.87 dB
[INFO] Downlink Format (DF): 17 Extended Squitter
[INFO] CRC: Passed
[INFO] Capability (CA): 5 Level 2 or Above Transponder, Can Set CA 7, In Air
[INFO] Address Announced (AA): ac53a4
[INFO] Callsign: EDV5271
[INFO] Type Code (TC): 19 Airborne Velocity
[INFO] Subtype (ST): 1 Ground Velocity
[INFO] Intent Change (IC): 1 No Change in Intent
[INFO] Speed: 267 kt
[INFO] Heading: 173 deg (W)
[INFO] Climb: 2816 ft/min
[INFO] Climb Source: 0 Geometric Source (GNSS or INS)
Verbose mode is useful for debugging or for understanding the full content of each Mode S message type.

View aircraft on a map

gr-adsb includes a Flask-based webserver that displays decoded aircraft positions on Google Maps in real time.
1

Enable the ZeroMQ block

In the adsb_rx.grc flowgraph, make sure the ZeroMQ sink block is enabled. The webserver receives data through this ZMQ socket.
2

Start the webserver

Open a new terminal and run:
cd gr-adsb/web/
./webserver.py
Or equivalently:
python3 webserver.py
The webserver can be started before or after the flowgraph is running.
3

Open the map in your browser

Open a web browser and navigate to:
http://localhost:5000
Aircraft positions and flight paths will appear on the map as messages are decoded.
The webserver requires the optional Python packages zmq, flask, flask-socketio, gevent, and gevent-websocket. See the installation guide for the install commands.

Build docs developers (and LLMs) love