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
- Keep dump1090 and your OpenSky ADS-B feeder running. The MLAT client reads the same receiver's
raw, timestamped Beast output, normally
127.0.0.1:30005on the same machine. Use the receiver's address instead if dump1090 runs on another machine. - Use your antenna's accurate latitude and longitude in decimal degrees. The client's
--altoption expects antenna height above the WGS84 ellipsoid in metres. If your height is measured above mean sea level, add the signed local geoid separation. - Have your existing OpenSky receiver serial number ready. The client identifies your receiver
as
osky_SERIAL, matching the integrated OpenSky client. Keep a leading minus sign if it is part of your serial number.
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.