HB9EYARADIO & ADS-B
Back to the station

The receiving chain

This is the path of an ADS-B message, from the aircraft down to my station's log. What is measured carries its figure and its freshness; what cannot be measured is drawn as a dashed line, with the reason beside it.

  1. The aircraft and its transponder

    not measured

    Every equipped aircraft broadcasts short radio messages: its position, altitude, identity, speed. It broadcasts them to everyone, without knowing who is listening. Nothing is measurable at this stage: what flies out of range does not exist for this station, though it does for others, further away.

  2. The wave, on 1090 MHz

    not measured

    All aircraft share the same frequency, with no arbitration and no turn-taking. Two messages sent at the same instant garble each other, and nothing counts these collisions: they are ordinary, and invisible by nature.

    First unknown: what was not transmitted within range, or what a collision destroyed in flight. No one can put a number on it.

    What theory predicts, since measuring is impossible

    1090 MHz has neither arbitration nor turn-taking: network theory approaches it with the ALOHA model. The name comes from ALOHAnet, the pioneering radio network built at the University of Hawaii in 1971, the first to let several transmitters share a single frequency without coordination. A long message lasts 120 microseconds, preamble included, a short one 64, at one bit per microsecond. From the receiver's point of view, no transmitter is synchronised with the others, and this lack of synchronisation has two effects. First, FRUIT (False Replies Unsynchronised In Time): elsewhere, ground radars and the collision-avoidance systems (TCAS) of other aircraft interrogate the planes, which reply. The station itself only listens: it never interrogates anyone, it just picks up those replies without having asked for them. Second, garbling: two signals that overlap in time destroy each other, and it is this effect that the model estimates. The ALOHA model assumes spontaneous transmissions; yet these triggered replies are not spontaneous: they only go out because an interrogator elicited them. What matters for the approximation is precisely the lack of coordination between transmitters, not their spontaneity: on that count, ALOHA remains a sound first approximation. A message is lost if another starts while it is passing, or if it starts while another is passing: the vulnerability window is twice its duration. Assuming random arrivals, the overlap rate is computed from the rate and the average message duration, the latter measured from the mix of formats received:

    about 19.7% of the messages received arrive overlapped by another one, at a rate of 1,185 messages per second for an average duration of 92.8 microseconds.

    This is a lower bound: the computation only counts the messages received here. Aircraft too far away to be heard occupy the channel just the same, and destroy messages without ever showing up anywhere.

    And an overlap does not always destroy: when one of the two signals is clearly stronger, the receiver may still decode it, the capture effect. The real loss is therefore below the overlap rate.

    A model-based estimate, computed from the rate measured here. It is neither a measurement, nor a figure published elsewhere. mode-s.org/1090mhz

    Durations and bit rate: The 1090 Megahertz Riddle (mode-s.org), which also documents garbling and FRUIT. Interference environment: report ITU-R M.2413-0. Capture effect and reception under overlap: MIT Lincoln Laboratory publications.

  3. The antenna, the cable, the connectors

    not measured

    The physical part of the station, the antenna, an Ecoflex 15 coaxial cable and its connectors, has no sensor watching it directly. Its witness sits further down the chain: the signal level distribution, visible below. An ageing cable or a connector taking on water cannot be seen here; they show up in that signal distribution, whose shape drifts as they degrade. It happened at this station, and it was that drift that revealed it.

  4. The receiver box

    not measured

    It demodulates the wave and verifies each message with a parity check. Whatever fails is rejected on the spot: you see the survivors, not the rejects. That is also why no corrupt message reaches the log: the sorting happened before.

    Second unknown: the number of messages rejected by the parity check. There is no way to count it from here.

  5. From here on, everything is measured
  6. Above this line, nothing is, directly.
  7. The raw output (Beast feed)

    The raw output, known as the Beast feed, is the binary format carrying everything the box has validated, message by message: each frame's format, its signal level, and the aircraft address whenever it is transmitted in the clear. It is the most faithful feed, before any interpretation.

    1,173

    frames per second · rolling 30 s window

    Breakdown by message format (DF)

    out of 711,316 frames · ten-minute window closed at 18:40

    • DF 17: ADS-B21.6%
    • DF 4: altitude (surveillance)18.4%
    • DF 20: Comm-B altitude18.3%
    • DF 0: air-to-air surveillance16.9%
    • DF 11: all-call, solicited or sent spontaneously (squitter)10.1%
    • DF 21: Comm-B identity9.4%
    • DF 5: identity (surveillance)3.3%
    • DF 16: long air-to-air surveillance1.3%
    • DF 18: extended squitter, non-transponder (ADS-B, TIS-B, ADS-R)0.7%

    Three message families

    • ADS-B: position, identity, speed22.4%
    • surveillance replies, no address in the clear67.6%
    • all-call (DF 11): solicited replies and spontaneous squitters10.1%

    Signal level, as a raw byte

    Each frame carries one level byte, 0 to 255. Nothing in the feed says whether that byte encodes an amplitude or a power: no decibel value is therefore shown. The relative scale is enough, because what matters is how this distribution drifts over time.

    0128255

    rolling 30 s window, byte 0 to 255

    0128255

    ten-minute window closed at 18:40 · minimum 0, quartiles 52 and 96, median 73, maximum 221

  8. 56.5%not kept by the text outputThe text output only keeps what it knows how to interpret: the gap is the share of the raw feed that leaves no trace in it.
  9. The text output (BaseStation format)

    In parallel, the same box publishes an interpreted version: text lines carrying the decoded fields, position and callsign included. This is what the feeder reads, and where the log comes from.

    510

    lines per second · rolling 30 s window

  10. The feed to Flightradar24

    not measured

    Feeding Flightradar24 is the box's primary role: that stream leaves directly, without going through the rest of the chain. This station merely taps the raw and text outputs along the way, to feed its own log. The feed to Flightradar24 itself cannot be observed from here: it is the third unknown of the diagram, drawn rather than left unsaid.

  11. The feeder, in two channels

    A home-built program, written in Python, runs at the station: it reads the text output and feeds the site through two distinct channels. The log, durable, with a queue that survives outages; and the live one, ephemeral, pushed every two seconds for the map and the counters.

    1 s ago

    last snapshot received by the site

  12. The raw channel, aggregated on site

    A third channel reads the Beast feed and summarises it at the station itself: one health line every ten minutes, one line per finished contact. The raw feed does not travel: only these summaries leave, along with the few sample frames and lines this page shows further down.

    ten-minute window closed at 18:40 · 51 s ago

    Framing over the last window: 0 byte(s) outside any frame, 0 resynchronisation(s), 0 aggregate(s) dropped, 0.0 s unavailable.

    These counters sit at zero in normal operation; their rising would be the first sign of trouble.

  13. The site and its database

    At the end of the chain, the log: each aircraft passage becomes one contact, written once and for all. It is what you have been browsing on this site since April 2016.

    15,090,723

    identified contacts in the log

    18:10

    last contact written · 30 min ago

    5,550

    identified contacts, last 24 hours

    This total counts identified contacts only; fleeting blips with no position, the ghosts, do not feed it, here or anywhere on this page.

    A contact only closes after thirty minutes with no word from the aircraft, long enough to be sure it has left the coverage area and not merely lost signal for a moment. The last one written can therefore never be more recent than that: it is mechanical, not a lag.

The funnel

These three bars form a funnel: from what the antenna hears to what the log keeps, the flow narrows at each stage, from tens of millions of frames a day at the top to a few thousand contacts at the bottom. But this narrowing is not even, and that is the remarkable fact: almost everything happens at the end. The log writes a single line per aircraft passage, and one passage gathers hundreds or thousands of messages.

  • frames heard, scaled to one day (at the current rate)101,347,200
  • lines kept, scaled to one day (at the current rate)44,064,000
  • identified contacts (last 24 hours, counted on the database)5,550

The first narrowing, from raw feed to text feed, is a factor of about 2.3: the box keeps only what it can interpret. The last one, from kept lines to log contacts, is a factor of about 7,900: no longer a loss, but a summary.

The first two bars extrapolate the rolling thirty-second window, assuming that rate held for a whole day; the third counts the contacts actually written over twenty-four hours. The two time bases differ, and the drawing places them at the same scale. At the scale of the first bar, the last is barely a sliver, kept visible so it is not mistaken for zero, and that is the whole point.

A real frame, decoded before your eyes

This is not an example: this frame was received seconds ago by the antenna, and it changes over time. The feeder only sent the bytes; the site reads them, layer by layer.

received at 18:40:32 · signal level 40 (raw byte)

8d4b1a6799088a3010044ae423f6

  • 1 byte format and capability
  • 3 bytes ICAO address, in the clear
  • 7 bytes data (56 bits)
  • 3 bytes parity check
reply format
DF17 · TC19
aircraft address
4b1a67
message subject
velocity (subject named, not computed here)

Raw against interpreted, over the same seconds

The two outputs of the same box, side by side: on the left what the antenna heard, frame by frame; on the right what the box made of it, as text lines. The gap stops being a percentage: surveillance replies scroll by on the left without leaving a trace on the right.

the raw feed

  • 18:40:520x32not transmitted81
  • 18:40:500x32not transmitted49
  • 18:40:480x33not transmitted79
  • 18:40:460x32not transmitted115
  • 18:40:440x32not transmitted98
  • 18:40:420x33not transmitted54
  • 18:40:400x33not transmitted32
  • 18:40:380x33not transmitted34
  • 18:40:360x32not transmitted37
  • 18:40:340x33not transmitted60
  • 18:40:320x334b1a6740
  • 18:40:300x32not transmitted89

the text output

  • MSG,3,333,441375,406B6C,441475,2026/08/14,16:40:52.929,2026/08/14,16:40:52.929, ,22275, , ,48.54281,7.94442, ,,0,0,0,0
  • MSG,1,333,440879,44CDC8,440979,2026/08/14,16:40:52.934,2026/08/14,16:40:52.934,BEL6VF, , , , , , ,, , , ,
  • MSG,4,333,441132,02019B,441232,2026/08/14,16:40:52.945,2026/08/14,16:40:52.945, , ,452.0,214.0, , ,-64,, , , ,
  • MSG,4,333,441445,4B1A67,441545,2026/08/14,16:40:52.945,2026/08/14,16:40:52.945, , ,406.0,19.7 , , ,0 ,, , , ,
  • MSG,8,333,440991,4B1808,441091,2026/08/14,16:40:52.947,2026/08/14,16:40:52.947, , , , , , , ,, , , ,0
  • MSG,4,333,441080,4CA6C4,441180,2026/08/14,16:40:52.948,2026/08/14,16:40:52.948, , ,470.0,130.5, , ,0 ,, , , ,
  • MSG,1,333,440636,040103,440736,2026/08/14,16:40:52.949,2026/08/14,16:40:52.949,DRC098, , , , , , ,, , , ,
  • MSG,8,333,440860,39D304,440960,2026/08/14,16:40:52.954,2026/08/14,16:40:52.954, , , , , , , ,, , , ,0
  • MSG,3,333,441190,4070E4,441290,2026/08/14,16:40:50.951,2026/08/14,16:40:50.951, ,37000, , ,46.48073,5.25874, ,,0,0,0,0
  • MSG,3,333,441239,4B1806,441339,2026/08/14,16:40:50.956,2026/08/14,16:40:50.956, ,22400, , ,46.72659,5.43917, ,,0,0,0,0

Two views of the same instant, not a translation: nothing guarantees that a line on the right descends from a given frame on the left.

Reception history

The same measurements as above, but over time: each point is a ten-minute window of the raw channel. The rate follows the traffic, the signal level follows the radio chain, and the addresses heard follow the number of aircraft overhead.

The table has history since 2026-08-13 20:16; 132 ten-minute window(s) shown over the chosen period.

The middle curve is the diagnostic one: the median signal level, its middle value, framed by the quartile band, where the central half of the measurements sit. A slow downward drift of this median, at comparable traffic, betrays the radio chain: a connector taking on water, a failing solder joint, ice on the antenna. That is what makes it an instrument, not just a curve.

No gap is filled in: if windows are missing (an outage, a restart, a closed channel), the curve breaks and only resumes after the gap. Joining it across an unmeasured period would amount to inventing values.

Signal distribution over time

Each column is a ten-minute window; from bottom to top, the signal level from 0 to 255; colour shows how many frames fell into each bin. A degrading radio chain reads as the warm band sliding downward. The very bottom row, at byte zero, is the frames at zero level, the ones the signal stage already counts separately.

What “measured” means here

Every value carries its window: the rates come from a rolling thirty-second window, refreshed every five seconds; the feed detail comes from the raw channel's last ten-minute window, with its time; the log is read on the database at computation time. When a measurement is missing, its absence is written in its place; when it has grown too old, it is marked stale, with its date.