Skip to content

mhostetter/gr-adsb

Repository files navigation

gr-adsb

A GNU Radio out-of-tree (OOT) module to demodulate and decode Automatic Dependent Surveillance Broadcast (ADS-B) messages.

Clone for specific GNU Radio version

To clone the version of gr-adsb that is compatible with GNU Radio 3.10 (for example), run this command.

$ git clone -b maint-3.10 https://github.com/mhostetter/gr-adsb

Features

  • Supports many SDRs through GNU Radio and OsmoSDR (USRP, RTL-SDR, HackRF, BladeRF, etc)
  • Supports various sample rates (2 Msps, 4 Msps, 6 Msps, etc). NOTE: Currently the sample rate must be an integer multiple of twice the symbol rate (2 Msym/s)
  • Decoding of messages:
    • DF 0: Short Air-Air Surveillance (ACAS)
    • DF 4: Surveillance Altitude Reply
    • DF 5: Surveillance Identity Reply
    • DF 11: All-Call Reply
    • DF 16: Long Air-Air Surveillance (ACAS)
    • DF 17: ADS-B Extended Squitter
    • DF 18: CF=0,1,6 ADS-B Extended Squitter from Non-Mode S Transponders
    • DF 19: AF=0 Military ADS-B Extended Squitter
    • DF 20: Comm-B Altitude Reply
    • DF 21: Comm-B Identity Reply
  • "Brief" stdout printing
  • "Verbose" stdout printing

Usage

GNU Radio

There is an example GNU Radio Companion (.grc) flowgraph located at gr-adsb/examples/adsb_rx.grc. To use it, first open GNU Radio Companion $ gnuradio-companion and then open the .grc file.

ADS-B Receiver Flowgraph

Example "Brief" output:

  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
00:55:55 abb19c SWA513   16050  2112   386  -148  39.1567166 -77.2299194   28
80:55:55 a4fbb4 AWI4868  17125  1152   361   -23  38.9627838 -76.7352627   66
00:55:55 a8ab3c          36975 -3008   472    48                            4
30:55:55 a34729 DAL1299  13100  3968   338   169  39.2229767 -77.1123206   70
10:55:55 a9b088 AAL9616   9000  -768   276  -133  39.0424347 -76.8132417   28
30:55:55 a24031           9925   -64   288   -63  39.2082964 -76.6861572   25
00:55:55 a01f73          12975  2240   339   -47  39.0163879 -76.8472754   38

Example "Verbose" Output:

[INFO] ----------------------------------------------------------------------
[INFO] Datetime: 2019-07-31 00:43:30.944816 UTC
[INFO] SNR: 19.90 dB
[INFO] Downlink Format (DF): 0 Short Air-Air Surveillance (ACAS)
[INFO] CRC: Passed Recognized AA from AP
[INFO] Address Announced (AA): ac53a4
[INFO] Callsign: EDV5271 
[INFO] Vertical Status (VS): 0 In Air
[INFO] Reply Information (RI): 3 Reserved for ACAS
[INFO] Altitude: 7025 ft
[INFO] Crosslink Capability (CC): Does Support Crosslink Capability
[INFO] ----------------------------------------------------------------------
[INFO] Datetime: 2019-07-31 00:43:32.114965 UTC
[INFO] SNR: 21.85 dB
[INFO] Downlink Format (DF): 4 Surveillance Altitude Reply
[INFO] CRC: Passed Recognized AA from AP
[INFO] Address Announced (AA): ac53a4
[INFO] Callsign: EDV5271 
[INFO] Flight Status (FS): 0 No Alert, No SPI, In Air
[INFO] Downlink Request (DR): 0 No Downlink Request
[INFO] IIS: 0
[INFO] IDS: 0 No Information
[INFO] Altitude: 7075 ft
[INFO] ----------------------------------------------------------------------
[INFO] Datetime: 2019-07-31 00:43:36.695273 UTC
[INFO] SNR: 22.41 dB
[INFO] Downlink Format (DF): 11 All-Call Reply
[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] ----------------------------------------------------------------------
[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)
[INFO] ----------------------------------------------------------------------
[INFO] Datetime: 2019-07-31 00:43:40.305197 UTC
[INFO] SNR: 24.35 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): 11 Airborne Position
[INFO] Surveillance Status (SS): 0 No Condition Information
[INFO] Time: 0 Not Synced to 0.2s UTC Epoch
[INFO] Latitude: 39.20978610798464 N
[INFO] Longitude: -76.8250732421875 E
[INFO] Altitude: 7450 ft

Webserver

To view the decoded planes and flight paths live in Google Maps, a webserver is included. The webserver can be started before or after the GRC flowgraph, but the webserver must be running to view the Google Maps webpage. The ZeroMQ block in the example flowgraph is required when using the webserver. Before running the webserver, be sure to install its dependencies.

  1. Open a terminal
  2. $ cd gr-adsb/
  3. $ cd web/
  4. $ ./webserver.py or $ python3 webserver.py
  5. Open a web browser
  6. Browse to localhost:5000

Example Google Maps Webpage

SQLite Playback

Users can optionally record demodulated bursts to a SQLite database for storing or later replaying. This option depends on my other project gr-sqlite. Follow these instructions to install gr-sqlite.

To record bursts, enable the SQLite Sink in the adsb_rx.grc flowgraph. To replay those demodulated bursts later, run the adsb_playback.grc flowgraph.

ADS-B Playback Flowgraph

Installation

GNU Radio is a dependency for gr-adsb. I recommend installing it with PyBOMBS.

Source Build

Build gr-adsb manually from source using the following procedure.

Python dependencies:

$ pip3 install --user colorama

Source build:

$ cd gr-adsb/
$ mkdir build
$ cd build/
$ cmake ../  # or cmake -DCMAKE_INSTALL_PREFIX=<path_to_install> ../
$ make
$ sudo make install
$ sudo ldconfig

Webserver Dependencies

If using the built-in Google Maps webserver, you'll need to install the following Python packages.

$ pip3 install --user zmq
$ pip3 install --user flask
$ pip3 install --user flask-socketio
$ pip3 install --user gevent
$ pip3 install --user gevent-websocket