Multilateration (MLAT)

Help OpenSky locate Mode S aircraft that do not broadcast their own position. Multilateration compares when the same message reaches several receivers at known locations to estimate the aircraft's position. Your existing ADS-B receiver can contribute its timestamped messages to improve coverage and support research.

Option 1: Enable Integrated MLAT Recommended

We recommend adsb.im for most feeders. It already includes OpenSky MLAT: select OpenSky in the feeder settings, tick Enable MLAT (for selected aggregators supporting MLAT), and save your settings. Follow our Raspberry Pi / adsb.im setup guide to get started.

The SDR Enthusiasts OpenSky Docker container also includes the MLAT client. Set ENABLE_MLAT=true alongside your existing receiver location and OPENSKY_SERIAL, then recreate the container to apply the setting. These integrated setups manage the client for you; use the manual option below if you run a standalone feeder.

Option 2: Add MLAT to a Standalone Feeder

If you already run dump1090 and the OpenSky feeder, as described in Option 2 of our Raspberry Pi guide, add a separate MLAT client alongside them. We recommend Wiedehopf's maintained mlat-client fork, which is also used by the Docker container's base image. The following steps are for Raspberry Pi OS or another Debian-based Linux system with systemd.

1. Check Your Receiver Settings

Use a stream from one physical receiver. MLAT depends on the original receiver timestamps; aggregated streams and MLAT results are unsuitable as input. Run one OpenSky MLAT client per receiver. Other networks' MLAT clients can continue running alongside it.

2. Install the Client

Install it in its own Python environment:

sudo apt-get update
sudo apt-get install -y git build-essential python3-dev python3-venv
sudo git clone https://github.com/wiedehopf/mlat-client.git /opt/opensky-mlat/src
sudo python3 -m venv /opt/opensky-mlat/venv
sudo /opt/opensky-mlat/venv/bin/python -m pip install setuptools pyasyncore
sudo /opt/opensky-mlat/venv/bin/python -m pip install /opt/opensky-mlat/src

3. Configure and Start the Service

Create /etc/systemd/system/opensky-mlat.service using sudo nano /etc/systemd/system/opensky-mlat.service, with the contents below. Replace LATITUDE, LONGITUDE and ALTITUDE with your actual antenna location. For osky_SERIAL, keep the osky_ prefix and replace SERIAL with your existing OpenSky receiver serial before starting.

[Unit]
Description=OpenSky multilateration client
Wants=network-online.target
After=network-online.target

[Service]
DynamicUser=yes
ExecStart=/opt/opensky-mlat/venv/bin/mlat-client \
    --input-type dump1090 \
    --input-connect 127.0.0.1:30005 \
    --server mlat-server.opensky-network.org:40147 \
    --lat LATITUDE \
    --lon LONGITUDE \
    --alt ALTITUDE \
    --user osky_SERIAL
Restart=on-failure
RestartSec=15
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

The server address and port match the OpenSky container's MLAT configuration. Allow the client's outbound TCP connection on port 40147 and its negotiated UDP traffic. You do not need to forward inbound ports on your router.

sudo systemctl daemon-reload
sudo systemctl enable --now opensky-mlat.service
sudo journalctl -u opensky-mlat.service -f

4. Verify the Connection

Check the logs for a connection to dump1090 and the OpenSky MLAT server. Successful position estimates also depend on nearby receivers hearing the same aircraft, good timing and receiver geometry, so a connected client may not produce positions immediately. If it cannot connect, check the Beast output address, internet access and your antenna settings.

Your ADS-B feeding continues alongside MLAT. For more client options, see the mlat-client documentation.