Mapping ADS-B signals
Written by Sil Hamilton in March 2021.

For the last half year, I have been obsessed with tracking planes by way of their ADS-B transmitters.

Most aircraft in Canada (and the rest of the world) are required to equip a certain kind of radio transmitter intended for "Automatic Dependent Surveillance-Broadcast" signals (ADS-B). These signals are a form of automated telemetry for the craft. These transmitters constantly emit unencrypted packets of information at 1090MHz, a Very High Frequency (VHF). The packets variously describe the craft's altitude, track, location, and squawk code. The system is intended to act as a fail-safe for the normal methods with which air traffic controllers track airplanes.

As it turns out, picking up these signals is very easy. The layperson only requires a cheap USB radio dongle and a six centimetre tall antenna. Cooped up in my room over the summer of 2020, I decided to pick up a RTL-SDR starter kit off of Amazon. RTL-SDR is a particular TV tuner dongle (RTL) that has been hacked and repackaged as a tool for picking up frequencies between 26MHz and ~1.6GHz. This is achieved through software-defined radio (SDR). My kit came with this tuner in an aluminum case, together with a few starter antennas.

Being limited to 26MHz and above means most interesting frequencies are out of bounds. This includes ham radio and AM. For a cooped up person, lacking access to these frequencies is a bit of a pain: AM signals in particular can be very entertaining, as they can bounce off the atmosphere and allow one to listen to stations potentially thousands of kilometres away. An up-converter for bringing these signals up to RTL-SDR's range costs nearly as much as my kit. Starved for a reasonably interesting frequency, I desperately looked online for some hint on what to tune to. A few searches on the Internet pulled up one such frequency: 1090MHz. Thankfully, my kit came with the necessary antenna.

As it turns out, even a six-centimetre tall antenna is more than adequate for picking up ADS-B signals up to 250 kilometres away. I was astonished by the rate of information — I was picking up some 800 packets a second! Of course, this rate is amalgamated from numerous aircraft, but the scale of the endeavour was tantalizing. I began looking for the optimal set of software for tracing and decoding ADS-B packets. On Linux, there is Dump1090, while Windows has rtl1090. Dump1090 has a built-in web server for displaying a page on which aircraft are transposed over an OSM map. The Windows utility hooks into a slew of different proprietary web servers. I chose Dump1090, and it's worked quite well for me.

However, I live in a particularly problematic area. ADS-B is basically line-of-sight, and I'm situated within a valley of sorts. My range was being significantly limited. I made my setup portable — a cheap Chromebook is enough to both power and decode a RTL-SDR. Taking my gear around to different locations, my point was proven. When squatting on the lip of the valley, I could pick up planes many kilometres away. However, this posed another problem: Canadian mobile internet is expensive. Having an OSM map streaming all the time was less than ideal. Oh, woe!

Having a map is almost necessary for ADS-B. Maps let you contextualize the position of airplanes. Raw Dump1090 only provides a table of aircraft. Seeing latitudinal and longitudinal coordinates on their own does nothing to stir my imagination. How far away is a degree of latitude? What is my own current position? When plane spotting in the wilderness, I was stuck. I was receiving quality signals, but I lacked a program for visualizing the position of aircraft relative to myself.

I ended up programming a little utility to do this exact thing: adsb-cmap. It's fairly feature complete for my own purposes. Provided the user knows and can input their own position, the program can display all aircraft around them, including their relative distance in kilometres and their flight-codes. It reads in from Dump1090's networking mode, using Python's built-in curses library to display this information in a terminal emulator.

adsb-cmap is intended for those who regularly track planes without an internet connection. It does not offer many features — the sole intent is to visualize Dump1090's information in a human-readable format. I think the program works quite well for what it is.

Below is a picture of it in action. Right click and open in a new tab to expand it.


Figure 1: adsb-cmap in action