I finally got around to cleaning up my Mode S receiver enough for public
release. The following is a short description of the software:
The Gnuradio Mode S project implements a Mode S/ADS-B receiver. Mode S
is the latest aircraft transponder technology, primarily used in
commercial aircraft. Probably 30% of those aircraft currently broadcast
their position via ADS-B (more in Europe, less in the US), which is a
protocol that uses Mode S extended squitters as the transport layer. By
2020 all aircraft operating in controlled US airspace will be required
to broadcast ADS-B.
The receiver demodulates and decodes the 1090MHz PPM-modulated Mode S
transmissions using industry-standard techniques to mitigate FRUIT
(transmissions on top of one another) and correct multiple bit errors.
Using a USRP with a DBSRX + LNA + SAW filter, ranges of 220 miles have
been regularly seen. The WBX should allow similar ranges without the
filter and LNA, although I haven’t really tested WBX much. It is of
course line-of-sight, making antenna site selection important.
TL;DR: Follow airplanes around from 200 miles with your USRP.
The receiver allows interfacing to a number of output formats, including
KML for Google Earth. Screenshots of the Google Earth interface can be
There is also a TCP port 30003 interface to use with PlanePlotter, a
third-party application to view aircraft data. PlanePlotter isn’t free,
and I haven’t tested it at all, so while it should work, YMMV. If you do
test it, let me know.
There are definitely still bugs in it – one thing that comes to mind is
that a very few aircraft seem to produce data which uses correct headers
for position packets but which contains non-position data. This causes
“impossible” aircraft positions. Luckily it seems to be pretty rare.
Future developments for the receiver include implementation of networked
multilateration using the VRT timestamps of USRP2. Multilateration
allows the time-based triangulation of aircraft which use Mode S but
which do not broadcast ADS-B. Three or more networked USRP2s should
allow position determination to a reasonable degree of accuracy.
Clone the Git repository to build the software with the usual
bootstrap/configure/make/make install rigmarole; it should compile on
anything you have Gnuradio installed on, although with a 4Msps data rate
it does require a bit of CPU power. In order to use the KML output you
will have to have libsqlite3 and python-sqlite installed, although since
those are Python dependencies it will still compile without them. I
think that’s it for the dependencies. Oh, it uses UHD, so you should
finally get around to building UHD and gr-uhd to use this software.
git clone git://github.com/bistromath/gr-air-modes.git
There is also a CGRAN page with corresponding SVN repo, which is a
mirror of the Github repo:
The Python executable is src/python/uhd_modes.py.