Sunday, April 28, 2013

Receptor ADS-B con linux

En este post voy a colocar los pasos que seguí para construir un receptor ADS-B con linux.

Primero, algo de teoría, aunque si estás leyendo este post, probablemente ya sepas que es ADS-B, sin embargo, algo de teoría no cae mal.

Según skybrary, ADS-B son unas siglas que significan Automatic Dependent Surveillance Broadcast. Es un sistema mediante el cual los aviones o cualquier vehículo aeroportuario emiten información generada en sus sistemas de abordo mediante radiodifución (Skybrary, ADS-B).

Existen en el mercado varios receptores para estas emisiones, por ejemplo, el SBS-3 de Kinetic Avionics que cuesta alrededor de £ 500.

En el sitio Flightradar24 se puede apreciar un ejemplo de la data que pueden recopilar estos receptores y de lo que se puede hacer con ella.

Como £ 500 es realmente mucho y existen opciones más baratas disponibles, voy a hablar de una opción que cae en el grupo de las baratas (aproximadamente 8 € !!!!!!!!!).

Hardware

El aparatico que hace la magia es un receptor de radio y televisión digital USB. Según he leido, este es un dispositivo que entra en la categoría de SDR (Radio de software) y lo interesante es que se puede sintonizar a la frecuencia de 1090 MHz que es la frecuencia en la cual se transmite  la información ADS-B.

Uno de los modelos más populares de este "dongle" son los que están basados en los chips RTL2832U+R820T.

Yo compré uno por ebay y me costó 8€ con envío. Este es el link del producto
FM+DAB USB DVB-T RTL2832U+R820T w/ MCX antenna y esta es la foto del producto en su caja, como me llegó:



Este "dongle" viene con una antena que hace un trabajo bastante bueno y que sirve para iniciarse en el mundo del radiospotting.

Esta es la salida de lsusb montrando al "dongle"
Bus 001 Device 003: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Y esta es lo que muestra el syslog cuando el "dongle" se conecta al puerto USB
kernel: [  167.908218] usb 1-8: new high-speed USB device number 3 using ehci_hcd
kernel: [  168.052057] usb 1-8: New USB device found, idVendor=0bda, idProduct=2838
kernel: [  168.052067] usb 1-8: New USB device strings: Mfr=1, Product=2, SerialNumber=3
kernel: [  168.052075] usb 1-8: Product: RTL2838UHIDIR
kernel: [  168.052081] usb 1-8: Manufacturer: Realtek
kernel: [  168.052087] usb 1-8: SerialNumber: 00000001

Aparte del "dongle", se necesita una computadora con un puerto USB 2.0.


Software

Sistema operativo: En mi caso utilicé Debian Wheezy.

SDR: Para la sintonización utilicé las utilidades rtl-sdr.

Decodificador ADS-B (Opcional pero muy recomendado): Como decodificador adicional de ADS-B utilicé dump1090 que es una herramienta muy útil a la hora de visualizar los tráficos de una manera amigable.

Manos a la obra

Lo primero que hay que hacer es preparar el sistema operativo para compilar, ya que ninguno de estos programas (rtl-sdr y dump1090) están precompilados en los repositorios oficiales de debian.

# aptitude install build-essential git cmake libusb-1.0-0-dev


Ahora hay que bajarse el software para compilarlo.

rtl-sdr

# cd /usr/local/src
# git clone git://git.osmocom.org/rtl-sdr.git
# mkdir -p rtl-sdr/build
# cd rtl-sdr/build
# cmake  -DINSTALL_UDEV_RULES=ON ../
# make
# make install

Ya con esto deberíamos tener rtl-sdr instalado. Los binarios estarán en /usr/local/bin.

Ahora hay que probar que podemos trabajar con el "dongle", para esto, lo insertamos en un puerto USB y ejecutamos los siguiente (Ctrl+c para volver al prompt):

# rtl_test

Esta es la salida que obtengo yo:
Found 1 device(s):
  0:  ezcap USB 2.0 DVB-T/DAB/FM dongle

Using device 0: ezcap USB 2.0 DVB-T/DAB/FM dongle
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7
22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...
lost at least 68 bytes

No me preocupo por los bytes perdidos, lo que interesa es que el dispositivo está reconocido y más aún, que reconoció el radio Rafael Micro R820T.

Ahora hay que conectar la antena (si es que ya no está conectada) y probar si recibimos data ADS-B.

Si es posible colocar la antena cerca de la ventana y tener visión del cielo sin obstáculos, mejor.

En mi caso, como las pruebas las estoy haciendo en una laptop, me es fácil ubicarme cerca de una ventana.

Ejecutamos lo siguiente (Crtl+c para volver al prompt):

# rtl_adsb -V

Y deberíamos tener una salida como esta
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: ezcap USB 2.0 DVB-T/DAB/FM dongle
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 1090000000 Hz.
Sampling at 2000000 Hz.
Exact sample rate is: 2000000.052982 Hz
*8d405f1391404839a80495d13bdd;
DF=17 CA=5
ICAO Address=405f13
PI=0xd13bdd
Type Code=18 S.Type/Ant.=1
--------------
*8d505ec162b98399033c73ba8256;
DF=17 CA=5
ICAO Address=505ec1
PI=0xba8256
Type Code=12 S.Type/Ant.=2
--------------
*8d34150e9901650a80b296f522d3;
DF=17 CA=5
ICAO Address=34150e
PI=0xf522d3
Type Code=19 S.Type/Ant.=1
--------------
*8597c521e0e38161319e05f52f61;
DF=16 CA=5
ICAO Address=97c521
PI=0xf52f61
Type Code=28 S.Type/Ant.=0
--------------
*8e44ce719910e92280809106d31b;
DF=17 CA=6
ICAO Address=44ce71
PI=0x06d31b
Type Code=19 S.Type/Ant.=1
--------------

Señores, ahí están los tráficos!!!!!!!, el receptor funciona y tenemos información. Las líneas que salen como "ICAO Address" son la identificación de los tráficos que tienen transponders en Modo S. Más información Aquí.

Por supuesto, esta representación no nos dice mucho, lo que realmente queremos es ver los tráficos en un mapa y conocer su altitud, velocidad, heading, call sign, tipo de avión, etc, etc, etc, y para eso se necesita un visualizador.

Para linux he encontrado dos, el dump1090 que es decodificador y visualizador y el Virtual Radar Server que está escrito en C# (Mono) y aseguran que corre en linux. Yo solo lo he probado en windows y dada mi nula habilidad en ese sistema operativo, poco puedo aportar, salvo que me ha dado uns resultados bastante "aceptables" pero me sigo sintiendo "incómodo". Por esa razón, solo voy a hablar de dump1090 que si corre bien en linux y además de decodificador es visualizador.

dump1090

Dump1090 es muy versátil, permite decodificar la información ADS-B, mostrarla en modo texto de una manera amigable y además tiene un servidor web en el que se pueden ver los tráficos al estilo Flightradar24.

En mi caso, con la antena que viene el "dongle", dentro del apartamento (1° piso) y con una visión sin obstáculos de un sector "pequeño" del norte de Madrid, he podido seguir tráficos a altitudes de entre 5000 ft y FL380 (Madrid está a 2000 ft aproximadamente) y a una distancia de 110 NM.

Ye que le he hecho tanta propaganda a dump1090, hay que compilarlo:

# cd /usr/local/src
# git clone https://github.com/antirez/dump1090.git
# cd dump1090
# make

Esto genera el binario dump1090. Ahora solo resta copiar el binario y el archivo gmap.html a un directorio apropiado.

Entre las opciones que tiene dump1090 están, la visualización en modo texto (--interactive), la visualización por web y la posibilidad de compartir la data decodificada con otros visualizadores.

Para conocer todas las opciones de dump1090 hay que ejecutar:

# ./dump1090 -h

Dejo unas capturas de dump1090 en funcionamiento.

dump1090 en modo texto:



Visualización de la data en modo web proporcionada por dump1090:



Eso es todo, espero que sea de utilidad.