info about aircraft flying over me

This is a very basic question. I don’t know how to get information about aircraft that fly over my house.

On flightaware, and other web sites, I see how to start with specific flight numbers or tail numbers, but I want to start with location.

** I want to learn tail numbers of aircraft that fly over me. **

I’m more interested in helicopter traffic than fixed-wing, but in any case, i want to start with location and then learn identity. I realize it will be a few years before all helicopters have ADS-B. I’ve had some success with photography, but it is quite difficult to catch the tail number of a helicopter with a camera. Requires long telephoto lens and good technique, and luck, and of course only works in the daytime.

Can I discover the identity of aircraft flying over me via flightaware?

If so, please point me to the right page or menu.

If not, would I be able to do this with my own ADS-B receiver and some software or some other web site?

Your best bet is probably your own receiver, especially if you’re interested in low-flying traffic. ADS-B is approximately line of sight so at lower altitudes the effective receiver range is much shorter; there may not be an existing receiver that’s suitable for the area immediately around you. You can set up a basic receiver with a Raspberry Pi and a RTLSDR dongle pretty cheaply; if you’re only interested in aircraft that are relatively close (i.e. can be photographed!) then you don’t need to worry much about the antenna either - you don’t need 400km range! - probably the standard antenna that comes with the dongle will be fine.

There is also Flightaware’s new Android feeder app that may be simpler if you just want an ad-hoc receiver. (this needs an android tablet/phone + a RTLSDR dongle + a suitable OTG cable).

That said, ADS-B gives you the 24-bit ICAO identifier, not the tail number. You will need some way to do that conversion (often the national registries will do this, or there are some databases floating around)

Ok! I followed the flightaware “build a PiAware ADS-B receiver” instructions. It is now working. I’m looking at the data using PlanePlotter. Need a little bit more help.

I need to understand how to convert those 24-bit ICAO identifiers to some useful form. I googled and googled, and have not found a way to do this. I must not be using the right keywords, or something. Also visited the ICAO web site, FAA web site, etc. I live in the US, so if this is going to be a search of a national registration database, it should be for the US I suppose, although I am near Mexico.

Plane plotter displays a registration number for some messages, but not others (PP’s “aircraft view”). Does that mean the registration number is sometimes in the message? Or is PlanePlotter looking these guys up for me somehow?

For example ICAO A5897B shows reg N456MB. That’s fine. However, some messages don’t show a registration.

Examples of ICAO identifiers I’ve seen today without a registration number…
298b3b
298cc9
E8040E
0D0246

So I’m wondering how to look up these guys.

The registration is not in the message - Planeplotter is likely to be doing a database lookup behind the scenes.

faa.gov/licenses_certificate … _download/ has the FAA database. (Look up by “Mode S code”). I’d guess that Planeplotter is already using this. Your US example is in there and matches.

Different countries are allocated different blocks of codes - so you can in theory tell which country from the first few digits. See e.g. kloth.net/radio/icao24alloc.php

From a quick look, E80xxx is Chile, 0D0xxx is Mexico, 29x is … something in the south american region, but I’m not sure what country specifically.

You might try airframes.org/

Got an iPhone? Ask Sari “What planes are flying over me?” and she’ll show you a map of your locale with all the overhead non-blocked aircraft, courtesy of FA.

I hacked this up last night from the description in the quoted document. Its ugly code but appears to work. It doesn’t handle Mexican aircraft which I expect you’ll see a few of.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

// Mode A/C decoder for ADS-B.  Mode S includes tail number and map coordinates but modes A and C
// do not.  This conversion from hex address to tail number lets us look the aircraft up in the
// FAA database and elsewhere, eg:
//   http://registry.faa.gov/aircraftinquiry/NNum_Results.aspx?NNumbertxt=999XX
//   https://www.google.co.uk/search?q=N999XX
//   http://jetphotos.net/showphotos.php?regsearch=N999XX
//   http://uk.flightaware.com/live/flight/N999XX
//   https://flightaware.com/resources/registration/N999XX
// and the downloadable copy of the FAA database
//   at http://www.faa.gov/licenses_certificates/aircraft_certification/aircraft_registry/releasable_aircraft_download/

char *icoa_decode24(int param)
{
  // written from first principles as a direct implementation of the description in
  // https://www.scribd.com/doc/252532022/Kentekens-ICAO-luchtvaartuigadressen
  // Clearly it could be simplified but this structure makes the code more obvious.

  int addr = param;
  int v,w,x,y,z;
  char *reg = calloc (1, 8);
  char *f = "ABCDEFGHJKLMNPQRSTUVWXYZ";

  // American aircraft: 10485759 < M_S < 11534336
  if ((addr <= 10485759) || (addr >= 11534336)) return reg; // not a US plane

  // Civil aircraft: 10485759 < M_S < 11401160
  // (Military) aircraft without 'N'-Number: M_S >= 11401160
  if (addr >= 11401160) {strcpy(reg, "US Mil"); return reg;}

  if (addr >= 10385878) {
    // N10000-N99999 Nvwxyz  M_S = 10385878 + 101711 * v + 10111 *   w  + 951 *   x  + 35 *   y  +   z
    addr -= 10385878;
    v = addr / 101711; addr -= v*101711;
    w = addr / 10111;  addr -= w*10111;
    x = addr / 951;    addr -= x*951;
    y = addr / 35;     addr -= y*35;
    z = addr; 
    if (v < 10 && w < 10 && x < 10 && y < 10 && z < 10) {sprintf(reg, "N%0d%0d%0d%0d%0d", v,w,x,y,z);return reg;} else addr = param;
  }

  if (addr >= 10385853) {
    // N1000-N9999   Nvwxy   M_S = 10385853 + 101711 * v + 10111 *   w  + 951 *   x  + 35 *   y
    // N1000A-N9999Z Nvwxyz  M_S = 10385854 + 101711 * v + 10111 *   w  + 951 *   x  + 35 *   y  + f(z)
    addr -= 10385853;
    v = addr / 101711; addr -= v*101711;
    w = addr / 10111;  addr -= w*10111;
    x = addr / 951;    addr -= x*951;
    y = addr / 35;     addr -= y*35;
    if (addr == 0 && v < 10 && w < 10 && x < 10 && y < 10) {sprintf(reg, "N%0d%0d%0d%0d", v,w,x,y); return reg;}
    addr -= 1; z = addr;
    if (v < 10 && w < 10 && x < 10 && y < 10 && z < 24) {sprintf(reg, "N%0d%0d%0d%0d%c", v,w,x,y,f[z]); return reg;} else addr = param;
  }

  if (addr >= 10385252) {
    // N100-N999     Nvwx    M_S = 10385252 + 101711 * v + 10111 *   w  + 951 *   x
    // N100A-N999Z   Nvwxy   M_S = 10385253 + 101711 * v + 10111 *   w  + 951 *   x  + 25 * f(y)
    // N100AA-N999ZZ Nvwxyz  M_S = 10385254 + 101711 * v + 10111 *   w  + 951 *   x  + 25 * f(y) + f(z)
    addr -= 10385252;
    v = addr / 101711; addr -= v*101711;
    w = addr / 10111;  addr -= w*10111;
    x = addr / 951;    addr -= x*951;
    if (addr == 0 && v < 10 && w < 10 && x < 10) {sprintf(reg, "N%0d%0d%0d", v,w,x); return reg;}
    addr -= 1; y = addr / 25;     addr -= y*25;
    if (addr == 0 && v < 10 && w < 10 && x < 10 && y < 24) {sprintf(reg, "N%0d%0d%0d%c", v,w,x,f[y]); return reg;}
    addr -= 1; z = addr;
    if (v < 10 && w < 10 && x < 10 && y < 24 && z < 24) {sprintf(reg, "N%0d%0d%0d%c%c", v,w,x,f[y], f[z]); return reg;} else addr = param;
  }

  if (addr >= 10384651) {
    // N10-N99       Nvw     M_S = 10384651 + 101711 * v + 10111 *   w
    // N10A-N99Z     Nvwx    M_S = 10384652 + 101711 * v + 10111 *   w  + 25  * f(x)
    // N10AA-N99ZZ   Nvwxy   M_S = 10384653 + 101711 * v + 10111 *   w  + 25  * f(x) +      f(y)
    addr -= 10384651;
    v = addr / 101711; addr -= v*101711;
    w = addr / 10111;  addr -= w*10111;
    if (addr == 0 && v < 10 && w < 10) {sprintf(reg, "N%0d%0d", v,w); return reg;}
    addr -= 1; y = addr / 25;     addr -= y*25;
    if (addr == 0 && v < 10 && w < 10 && y < 24) {sprintf(reg, "N%0d%0d%c", v,w,f[y]); return reg;}
    addr -= 1; z = addr;
    if (v < 10 && w < 10 && y < 24 && z < 24) {sprintf(reg, "N%0d%0d%c%c", v,w,f[y], f[z]); return reg;} else addr = param;
  }

  if (addr >= 10384050) {
    // N1-N9         Nv      M_S = 10384050 + 101711 * v
    // N1A-N9Z       Nvw     M_S = 10384051 + 101711 * v + 25    * f(w)
    // N1AA-N9ZZ     Nvwx    M_S = 10384052 + 101711 * v + 25    * f(w) +       f(x)
    addr -= 10384050; v = addr / 101711; addr -= v*101711;
    if (addr == 0) {sprintf(reg, "N%0d", v); return reg;}
    addr -= 1;        y = addr / 25;     addr -= y*25;
    if (addr == 0 && v < 10 && y < 24) {sprintf(reg, "N%0d%c", v,f[y]); return reg;}
    addr -= 1;        z = addr;
    if (v < 10 && y < 24 && z < 24) {sprintf(reg, "N%0d%c%c", v, f[y], f[z]);  return reg;}
  }
  strcpy(reg, "bug");
  return reg;
}