adsb_deku 0.7.0

Decoder for ADS-B(Automatic Depedent Surveillance-Broadcast) - written with deku

adsb_deku library

Minimum required rust version: 1.64.

Add the following lines to your Cargo.toml file:

adsb_deku = "0.7.0"


Downlink Format support

DF Name Section
0 Short Air-Air Surveillance
4 Surveillance Altitude Reply
5 Surveillance Identity Reply
11 All Call Reply
16 Long Air-Air Surveillance
17 Extended Squitter(ADS-B)
18 Extended Squitter(TIS-B)
19 Extended Squitter(Military)
20 Comm-B Altitude Reply
21 Comm-B Identity Reply
24 Comm-D

Comm-B support

BDS Name Table
(0,0) Empty
(1,0) Data Link Capability A-2-16
(2,0) Aircraft Identification A-2-32

ME support for ADSB Messages

ME(Type Code) Name
0 NoPosition
1..=4 AircraftIdentification
5..=8 SurfacePosition
9..=18 AirbornePositionBaroAltitude
19 AirborneVelocity
20..=22 AirbornePositionGNSSAltitude
23 Reserved0
24 SurfaceSystemStatus
25..=27 Reserved1
28 AircraftStatus
29 TargetStateAndStatusInformation
30 AircraftOperationalCoordination
31 AircraftOperationStatus


The following example shows off reading from ADS-B bytes from a demodulation server into our Frame struct and then executing the fmt::Display Trait for display of information.

use hexlit::hex;
use adsb_deku::Frame;
use adsb_deku::deku::DekuContainerRead;

let bytes = hex!("8da2c1bd587ba2adb31799cb802b");
let frame = Frame::from_bytes((&bytes, 0)).unwrap().1;
        r#" Extended Squitter Airborne position (barometric altitude)
  Address:       a2c1bd (Mode S / ADS-B)
  Air/Ground:    airborne
  Altitude:      23650 ft barometric
  CPR type:      Airborne
  CPR odd flag:  even
  CPR latitude:  (87769)
  CPR longitude: (71577)

Build the docs(> cargo doc), or see for complete public API documentation.



Test data was generated using a rtl-sdr with dump1090-fa.

> cargo test

For testing this library, you can run our app 1090 with the following options for exiting program on missing fmt::Display or bytes protocol decode.

> cd ../apps
> cargo r --release --bin 1090 -- --debug --disable-airplanes --panic-decode --panic-display

This library is also fuzzed, ensuring no panic when parsing from demodulated bytes.

> cargo fuzz run fuzz_target_1


> cargo +nightly fmt


Benchmarking is done against a file containing 215606 ADS-B messages: lax-messages.txt. Quick math (215606 / 692.80) says the average speed of decoding is ~311.21 ms a message. A ~3% speedup can be gained on some systems by using RUSTFLAGS="-C target-cpu=native"

> cargo bench
lax_messsages           time:   [680.70 ms 692.82 ms 704.99 ms]


Derived from Aeronautical Telecommunications Volume IV: Surveillance and Collision Avoidance Systems, Fifth Edition and ICAO 9871.

no_std support

Add the following to your Cargo.toml file to enable no_std code only:

default-features = false
features = ["alloc"]