Aviation Pack

Setting up a Headless ACARS Ground Station

One of the primary requirements for commercial and enterprise clients is the ability to deploy RF sensors in remote or restrictive environments where a graphical interface isn't feasible. Mycelium's headless architecture makes it trivial to deploy a fully functional, bidirectional ACARS ground station on lightweight edge hardware like a Raspberry Pi.

Using the Aviation Mission Pack, Mycelium goes beyond simply "listening" to ACARS. It can actively manage sessions, transmit squitter messages, and automatically acknowledge aircraft downlinks.

Step 1: The Deployment Script

Mycelium has a built-in script interpreter that executes .mycelium script files line by line, exactly as if each command were typed at the interactive prompt. Comments begin with # and are ignored. The first line uses a shebang so the script can be run directly as an executable:

#!/usr/bin/Myce

# Headless ACARS ground station — 131.725 MHz VHF
# Hardware: RTL-SDR (RX) + HackRF (TX)

tool create -p ACARS -n ground_station
tool set -n ground_station -r RTLSDR_0 -t hackrf_0
tool set -n ground_station -f 131725000 -m AM:MSK

# Start squitter broadcast thread (identifies this station to aircraft)
directive create -t ground_station -n start_squitter -c Always -a ACARS_Squitter_Start
directive set -t ground_station -n start_squitter -a ACARS_Squitter_Start -p XA -i CID -I KCID -N 1 -L 4153N -O 09143W -S V131725

# Auto-acknowledge all received uplinks
directive create -t ground_station -n auto_ack -c Always -a ACARS_Auto_Ack_Start

# Receive loop: wait for data, forward to central collector, clear buffer
directive create -t ground_station -n listen   -c Null   -a Receive
directive create -t ground_station -n forward  -c Any    -a TCP_Send
directive set -t ground_station -n forward -a TCP_Send -H 10.0.0.50 -P 5044
directive create -t ground_station -n clear    -c Always -a Clear_Data

execute

Make the script executable and it can be invoked directly:

chmod +x ground_station.mycelium
./ground_station.mycelium

Alternatively, pass it as an argument to the binary — useful for systemd services or Docker containers where you control the command explicitly:

Myce ground_station.mycelium

Both forms are equivalent. The interpreter detects a script argument at startup, selects the Interpreter interface instead of the interactive CLI, and executes each command in sequence. Once the last command runs, the process exits — unless a tool is still running, in which case it blocks until all tools stop.

Step 2: Running on Boot

A minimal systemd unit to launch this at boot on a headless edge node:

[Unit]
Description=Mycelium ACARS Ground Station
After=network.target

[Service]
ExecStart=/usr/bin/Myce /opt/missions/ground_station.mycelium
Restart=on-failure

[Install]
WantedBy=multi-user.target

The Architecture

This deployment model allows you to deploy dozens of these lightweight nodes across a geographic area. They will autonomously handle the complex RF handshake procedures, demodulation, and decoding, while funneling a clean stream of JSON telemetry back to a centralized dashboard.

digraph { graph [bgcolor="transparent" fontname="Inter" rankdir=TB pad=0.4] node [fontname="Inter" fontsize=12 fontcolor="#e2e8f0" style=filled fillcolor="#1a1033" color="#8b5cf6" penwidth=1.5 margin="0.2,0.15" shape=box] edge [color="#8b5cf6" fontcolor="#a78bfa" fontname="Inter" fontsize=10 arrowsize=0.8] aircraft [label="Aircraft" shape=ellipse] subgraph cluster_edge { label="Edge Node: Mycelium" fontcolor="#e2e8f0" color="#8b5cf6" style=dashed bgcolor="#0f0a1e" squitter [label="Squitter TX Thread"] autoack [label="Auto-Ack Thread"] encoder [label="JSON Telemetry Encoder"] autoack -> encoder [label="decoded data"] } elk [label="Central ELK Stack" shape=cylinder] kibana [label="Kibana Dashboard"] aircraft -> autoack [label="VHF Uplink 131.725 MHz"] squitter -> aircraft [label="Squitter TX"] autoack -> aircraft [label="Auto-Ack TX" style=dashed] encoder -> elk [label="TCP :5044"] elk -> kibana }

Conclusion

Mycelium transforms standard SDR hardware into an active participant in the National Airspace System's datalink, doing the heavy lifting of protocol state-management autonomously.



← Back to Blog