Skip to content

Repository files navigation

ACARSCOT: ACARS to Cursor on Target Gateway

Puts aircraft datalink traffic into TAK. Reads decoded ACARS from acarsdec and emits CoT.

What this is actually for

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.

Install

pip install acarscot

Point 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:5555

How it decides to place a marker

A 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,0 is 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.

Identity

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 and license

Copyright Sensors & Signals LLC https://www.snstac.com/

Licensed under the Apache License, Version 2.0.

About

ACARS to Cursor on Target Gateway: aircraft datalink in TAK.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages