ACARS — native message layer + Inmarsat AERO framing
The character-oriented aircraft datalink (ARINC-618): mode, registration, label, block-id, message sequence, flight and text, sealed by a reflected CRC-16 block-check — one message layer shared by VHF ACARS, VDL and the satellite AERO services — plus AERO framing that carries it over the already-native Inmarsat-C FEC chain.
Rafe project · app/radio/acars.py, test_acars.py · build + parse + AERO encode/decode · message format and BCS transcribed from ARINC-618, validated self-consistently; 7-bit parity conventions and the AERO burst PHY are the on-air interop steps
Abstract
ACARS is the short-message system of commercial aviation: position reports, weather requests, engine data, gate assignments — a few hundred characters at a time, addressed by aircraft registration. The message layer is identical whether the transport is 2400 bps MSK on VHF (131.550 MHz and friends), VDL Mode 2, or the Inmarsat/Iridium satellite links (AERO). Rafe implements that common layer — build and parse with the block-check sequence — and the AERO path, which reuses the Inmarsat-C scramble/Viterbi/ interleave/unique-word chain wholesale (ACARS over AERO is a sibling service of STD-C on the same satellites).
1. Message format
build() produces, and parse() consumes, this byte layout:
SOH(0x01) · mode(1) · registration(7, left-padded '.') · ack(1)
· label(2) · block-id(1) · STX(0x02)
· MSN(4) · flight(6) · text(…) · ETX(0x03)
· BCS(2, little-endian) · DEL(0x7F)
| Field | Default | Notes |
|---|---|---|
| mode | "2" |
ACARS mode character |
| registration | "G-ABCD" → ".G-ABCD" |
right-justified to 7 with .; parse strips the padding |
| ack/NAK | 0x15 (NAK) |
technical acknowledgement byte |
| label | "H1" |
2-char message type (Q0 link test, H1 ADS/engine, 5Z airline, …) |
| block id | "1" |
single character |
| MSN | "M01A" |
message sequence number, 4 chars |
| flight | "BA0123" |
6 chars |
| text | "" |
free text (ASCII) |
BCS coverage: every byte between (not including) SOH and the BCS itself — i.e. from the mode character through ETX inclusive.
parse() rejects: missing SOH, missing DEL, BCS mismatch ({"error": "bcs"}), missing STX/ETX — then returns all fields with the registration padding stripped.
2. The block-check sequence
CRC-16 in the reflected (LSB-first) form of the CCITT polynomial — process each byte low-bit-first with 0x8408 (the bit-reverse of 0x1021), init 0, no final XOR, transmitted low byte first. This is the same polynomial family as AX.25's FCS (AIS/APRS) with different init/XOR dressing — one more member of the "CRC-16 is a family" table in Commonalities B.3.
3. AERO framing
aero_encode(acars_bytes) / aero_decode(soft_bits, n_bytes) are thin adapters onto the Inmarsat-C STD-C chain: bytes → bits → stdc_encode (scramble → r=1/2 K=7 convolve → 64-column interleave → 24-bit unique word), and the reverse through the soft-input Viterbi. Everything said in the Inmarsat-C spec about that chain — constants, UW 0xB1CB4E, caveats — applies verbatim here.
4. Validation
| Test | Asserts |
|---|---|
test_message_roundtrip |
all header fields + text recovered exactly |
test_various_messages |
registrations/labels/texts across three realistic messages |
test_bcs_detects_corruption |
one flipped bit in the registration → {"error": "bcs"} |
test_bcs_function |
BCS deterministic and input-sensitive |
test_aero_fec_chain_clean |
message → AERO frame → decode → identical text |
test_aero_fec_chain_noisy |
17-sample stream offset + ~3 % bit flips → exact text |
5. Limitations and interop caveats
- Character conventions. Real ACARS characters are 7-bit with a parity bit; this layer works in clean 8-bit ASCII. The parity convention is the named interop step for off-air captures.
- No VHF PHY yet. The 2400 bps MSK modem (classic VHF ACARS) and VDL2's D8PSK/AVLC are separate future layers — this module is transport-agnostic above the bit level.
- AERO burst structure. Real AERO carries ACARS inside its own burst/ packet formats over A-BPSK; the framing here demonstrates the FEC path end-to-end and awaits the burst-timing layer for on-air interop.
- Uplink/downlink asymmetries (block formats, multi-block messages, ETB continuation) are not modelled; single-block ETX messages only.
Related: Inmarsat-C (the reused FEC chain), AIS/APRS (the same CRC family), and ADS-B (the other aircraft downlink in the catalogue).