VDL2 (VHF Data Link Mode 2) trabaja en la frecuencia de 136,975 MHz usa modulación D8PSK con la que consigue una velocidad de transmisión de datos de 31.500 bps por lo que es el sustituto natual de ACARS, dado que además los mensajes ACARS pueen encapsularse en VLD2
Instalación
sudo apt install build-essential cmake git libglib2.0-dev pkg-config
cd
git clone https://github.com/szpajder/libacars
cd libacars
mkdir build
cd build
cmake ../
make
cd
git clone https://github.com/szpajder/libacars
cd libacars
mkdir build
cd build
cmake ../
make
sudo make install
sudo ldconfig
cd
git clone https://github.com/szpajder/dumpvdl2.git
cd dumpvdl2
mkdir build
cd build
cmake ../
make
sudo make install
sudo ldconfig
Funcionamiento
dumpvdl2 --help
dumpvdl2 2.6.0 (libacars 2.2.1)
Usage:
RTL-SDR receiver:
dumpvdl2 [output_options] --rtlsdr <device_id> [rtlsdr_options] [<freq_1> [<
freq_2> [...]]]
Read I/Q samples from a file (use "-" to read from standard input):
dumpvdl2 [output_options] --iq-file <input_file> [file_options] [<freq_1> [<
freq_2> [...]]]
General options:
--help Displays this text
--version Displays program version number
common options:
--max-ppm <max_ppm> Set maximum allowable absolute PPM deviation for valid messages (default: 0 == unlimited) <freq_1> [<freq_2> [...]] VDL2 channel frequencies If channel frequencies are omitted, VDL2 Common Signalling Channel (136975000 Hz) will be used as default.
rtlsdr_options:
--rtlsdr <device_id> Use RTL device with specified ID or serial number (default: ID=0)
--gain <gain> Set gain (decibels)
--correction <correction> Set freq correction (ppm)
--centerfreq <center_frequency> Set center frequency (default: auto)
--oversample <oversample_rate> Oversampling factor (sampling rate will be set to 105000 * oversample)
--bias <bias> Enable(1) or Disable(0) bias tee (default: 0)
file_options:
--iq-file <input_file> Read I/Q samples from a file (use "-" to read from standard input)
--centerfreq <center_frequency> Center frequency of the input data, (default: 0)
--oversample <oversample_rate> Oversampling factor (sampling rate will be set to 105000 * oversample) (sampling rate will be set to 10
5000 * oversample_rate) Default: 10
--sample-format <sample_format> Input sample format. Supported f
ormats: U8 8-bit unsigned (eg. recorded with rtl_sdr) (default) S16LE 16-bit signed, little-endian (eg. recorded with miri_sdr)
Output options:
--output <output_specifier> Output specification (default: decoded:text:file:path=-) (See "--output help" for details)
--output-queue-hwm <integer> High water mark value for output
queues (0 = no limit) (default: 1000 messages, not applicable when using --iq-file or --raw-frames-file)
--decode-fragments Decode higher level protocols in fragmented packets
--gs-file <file> Read ground station info from <file> (MultiPSK format)
--addrinfo terse|normal|verbose Aircraft/ground station info verbosity level (default: normal)
--station-id <name> Receiver site identifier Maximum length: 255 characters
--msg-filter <filter_spec> Output only a specified subset of messages (default: all) (See "--msg-filter help" for details)
Text output formatting options:
--utc Use UTC timestamps in output and file names
--milliseconds Print milliseconds in timestamps
--raw-frames Print raw AVLC frame as hex
--dump-asn1 Print full ASN.1 structure of CM and CPDLC messages
--extended-header Print additional fields in message header
--prettify-xml Pretty-print XML payloads in ACARS and MIAM CORE PDUs
--prettify-json Pretty-print JSON payloads in OHMA messages
Frequencies might be specified in Hz (as integer numbers) or in kHz, MHz, GHz (as integer or floating-point numbers followed by any of the following suffixes: k, K, m, M, g, G).
Examples: 136975000, 136975k, 136.975M, 0.136975G
dumpvdl2 --output help
dumpvdl2 2.6.0 (libacars 2.2.1)
<output_specifier> is a parameter of the --output option. It has the following syntax:
<what_to_output>:<output_format>:<output_type>:<output_parameters>
where:
<what_to_output> specifies what data should be sent to the output:
decoded Output decoded frames
raw Output undecoded AVLC frame as raw bytes
<output_format> specifies how the output should be formatted:
text Human readable text
pp_acars One-line ACARS format accepted by Planeplotter via UDP
json Javascript object notation
<output_type> specifies the type of the output:
file Output to a file
udp Output to a remote host via UDP
<output_parameters> - specifies detailed output options with a syntax of: pa
ram1=value1,param2=value2,...
Parameters for output type 'file':
path Path to the output file (required)
rotate How often to start a new file: Accepted values: daily, hourly
Parameters for output type 'udp':
address Destination host name or IP address (required)
port Destination UDP port (required)
dumpvdl2 --rtlsdr 0 --gain 40 --centerfreq 136975000
136975000
Las frecuencias para europa que se recomiendan son: 136725000 136775000 136825000 136875000 136975000
dumpvdl2 2.6.0 (libacars 2.2.1)
Sampling rate set to 1050000 sps
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000001
Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Exact sample rate is: 1050000.026077 Hz
[R82XX] PLL not locked!
Center frequency set to 136975000 Hz
Bandwidth set to 21000 Hz
Device #0: gain set to 40.20 dB
Device 0 bias tee set to 0
Device 0 started
Allocating 15 zero-copy buffers
[2026-05-10 12:13:30 CEST] [136.975] [-33.5/-12.2 dBFS] [-21.3 dB] [-2.1 ppm]
347247 (Aircraft, Airborne) -> 1096DA (Ground station): Command
AVLC type: I sseq: 3 rseq: 4 poll: 0
X.25 Data: grp: 11 chan: 255 sseq: 1 rseq: 2 more: 0
X.25 reasm status: skipped
X.233 CLNP Data (compressed header):
LRef: 0x42 Prio: 11 Flags: 0xf6
Lifetime: 20.0 sec
PDU Id: 0x102
X.224 COTP Data:
dst_ref: 0xda8a
sseq: 2 req_of_ack: 0 EoT: 1
COTP reasm status: skipped
ATN checksum: 51 79 63 d5
CPDLC Downlink Message:
Header:
Msg ID: 2
Msg Ref: 3
Timestamp: 2026-05-10 10:13:28
Logical ACK: required
Message data:
WILCO
Analisis de los mensajes
[2026-05-10 12:29:34 CEST] [136.975] [-26.8/-47.0 dBFS] [20.2 dB] [-0.4 ppm] [S:
0] [L:13] [F:0] [#0]
348204 (Aircraft, Airborne) -> 10927A (Ground station): Response AVLC type: S (Receive Ready) P/F: 1 rseq: 4
0] [L:13] [F:0] [#0]
348204 (Aircraft, Airborne) -> 10927A (Ground station): Response AVLC type: S (Receive Ready) P/F: 1 rseq: 4
CABECERA
- [2026-05-10 12:29:34 CEST]: Fecha y hira
- [136.975]: Frecuencia
- [-26.8/-47.0 dBFS] : señal / ruido
- [20.2 dB] : relación S/N
- [-0.4 ppm]: offset
- [S:0]: number of bit errors corrected in the VDL2 burst header (up to 2).
- [L:13]: burst length in octets.
- [F:0] number of octets corrected by Reed-Solomon FEC.[#0]number of frame in this particular transmission. Multiple AVLC frames (messages) may be concatenated and sent as a single transmission burst. When a multiframe burst is received, frames will be numbered incrementally.
MENSAJE
- 348204: Avión de Vueling
- Airbone: En vuelo
- 10927A: estación de tierra
- Response AVLC type: S (Receive Ready): estoy listo
[2026-05-10 12:29:35 CEST] [136.975] [-26.5/-47.2 dBFS] [20.7 dB] [-0.5 ppm] [S:
0] [L:34] [F:0] [#0]
348204 (Aircraft, Airborne) -> 10927A (Ground station): Command AVLC type: I sseq: 2 rseq: 4 poll: 0
X.25 Data: grp: 11 chan: 255 sseq: 0 rseq: 2 more: 0
X.25 reasm status: skipped
X.233 CLNP Data (compressed header): LRef: 0x41 Prio: 11 Flags: 0xf6 Lifetime: 20.0 sec PDU Id: 0x7a
X.224 COTP Data Ack: dst_ref: 0xdaf8 rseq: 8 credit: 3 ATN checksum: b4 fd 4b 7c
AVLC type: I Lleva información
[2026-05-10 12:41:07 CEST] [136.975] [-25.6/-47.5 dBFS] [21.9 dB] [-0.1 ppm] [S:
0] [L:96] [F:0] [#0]
44CE79 (Aircraft, Airborne) -> 283538 (Ground station): Command AVLC type: I sseq: 4 rseq: 5 poll: 0
ACARS:
Reassembly: skipped
Reg: .OO-SSY Flight: SN026H
Mode: 2 Label: 27 Blk id: 2 More: 0 Ack: ! Msg num: M36A
Message: EBBR,LEBL,LFBO,LFRS,N 39.333,E .234,29860,SN3776
Este es un mensaje ACARS sobre VDL2
- Aeronave (44CE79): Corresponde a un Airbus A319 de la compañía Brussels Airlines.
- Matrícula (.OO-SSY): Confirmado, es el registro belga del avión.
- Vuelo (SN026H / SN3776): El código de radio es SN026H, pero el número comercial de vuelo que aparece en el mensaje es el SN3776. Es un vuelo que suele cubrir la ruta entre Bruselas y algún destino del sur.
- EBBR, LEBL, LFBO, LFRS. Es la ruta con los aeropuertos alternativos o puntos de ruta:
- EBBR: Bruselas (Origen).
- LEBL: Barcelona - El Prat.
- LFBO: Toulouse.
- LFRS: Nantes.
- Posición exacta: N 39.333, E .234.
- Altitud: 29860 pies (9.000m)
[2026-05-10 16:01:15 CEST] [136.975] [-32.8/-47.3 dBFS] [14.5 dB] [0.6 ppm]
4CA565 (Aircraft, On ground) -> 10926A (Ground station): Command
AVLC type: I sseq: 7 rseq: 7 poll: 0
ACARS:
Reassembly: skipped
Reg: .EI-DPZ Flight: FR7202
Mode: 2 Label: QQ Blk id: 9 More: 0 Ack: ! Msg num: M08A
Message: LEVCGCLP14011350
4CA565 (Aircraft, On ground): en tierra
LEVCGCLP14011350: vuelo de LEVC (Valencia) a GCLP(Gran canaria)
Label: QQ
Colorear log
Instalar
sudo apt install multitail
sudo cp /home/pi-star/dumpvdl2/extras/multitail-dumpvdl2.conf /etc/
echo "include:/etc/multitail-dumpvdl2.conf" | sudo tee -a /etc/multitail.conf
Probar
multitail -cS dumpvdl2 -l "dumpvdl2 --rtlsdr 0 --gain 35
136.975M"
![]() |
| Mensajes VDL2 |
![]() |
| Mensaje ACARS encapsulado en VDL2 |
Conclusiones
El software funciona r sin problemas en la Raspberry Pi con RTL-SDR y decodifica los mensajes VDL2 extrayendo los ACARS encapsulados.
Lo que no se ha conseguido es actuar como feeder del agregador airframes.io
Ver también
Referencias
Advertencia importante
Las modificaciones, configuraciones y procedimientos descritos en este sitio pueden implicar riesgos técnicos, legales o de seguridad. El autor no se responsabiliza del mal funcionamiento de los equipos, daños permanentes, pérdida de garantía ni de posibles infracciones legales derivadas del uso de esta información.
El lector asume plena responsabilidad por cualquier acción que decida realizar basándose en el contenido de este blog.
© 2026 EA5JTT. Queda prohibida la reproducción total o parcial sin autorización expresa del autor.




No hay comentarios:
Publicar un comentario