Puts aircraft datalink traffic into TAK. Reads decoded ACARS from acarsdec and emits CoT.
ADS-B already tells you where an aircraft is. ACARS tells you what it is doing: flight number, route, gate requests, engine and maintenance downlinks, free-text crew messages. ACARSCOT carries that operational context.
It is a metadata source that occasionally has geometry, not a tracking
source, and it is built that way round deliberately. Measured on live San
Francisco traffic with a LimeSDR Mini v2, a 25-message capture contained zero
parseable positions — 20 were airline engine blobs (label H1), 3 were empty
(_d), one was ATS (B9) and one a gate request (5Z). A second 23-message
capture also found zero.
So most of the time ACARSCOT emits nothing to the map, and that is correct behaviour rather than a fault.
pip install acarscotPoint acarsdec at it:
acarsdec --soapysdr driver=lime -a LNAW -g 40 \
--output json:udp:host=127.0.0.1,port=5555 \
130.025 130.425 130.450 131.125 131.550 131.725
acarscot -c config.ini[acarscot]
COT_URL = udp+wo://239.2.3.1:6969
LISTEN_URL = udp://0.0.0.0:5555A marker appears only when a message reports a position that can be read unambiguously. There is no partial credit — a wrong aircraft position is worse than an absent one, because an operator will act on it.
- acarsdec's JSON has no latitude or longitude field. When an aircraft reports position it is buried in the free-text payload in an operator-chosen format.
- Only patterns with an observed real example are implemented. Speculative parsers for formats nobody has seen produce confident nonsense the first time they half-match engine telemetry.
- Results are range-checked, and
0,0is refused — it is a real coordinate in the Gulf of Guinea and a very common zeroed-field artefact. - Validated against 48 real messages: zero false positives.
- The remarks say
Pos from text (<pattern>)so an operator can see the position was pattern-matched out of a payload, not read from a field.
Positions expire (10 min default) much sooner than the aircraft state (1 h), because a flight number stays true for a whole flight while a position ages into fiction within minutes at 500 knots. The accumulated context survives the position.
Tracks are keyed on tail number, and an aircraft with no usable tail is dropped rather than bucketed. Merging unknown-tail messages would fuse unrelated aircraft into a single track — a mistake made once in dronecot, where a constant fallback UID collapsed every drone in range into one contact.
State is bounded by both TTL and a hard cap, and the cap refuses new aircraft rather than evicting old ones, so a long-running receiver does not quietly stop reporting the aircraft it started with.
Copyright Sensors & Signals LLC https://www.snstac.com/
Licensed under the Apache License, Version 2.0.