domingo, 13 de enero de 2013

ADS-B en OpenWRT

Esto es un experimento para recibir transmisiones ADS-B de aviones en routers corriendo OpenWrt con un pincho soportado por rtl-sdr (preferiblemente un RTL2832 con tuner R820T).

Esto es posible gracias a la implementacion dump1090 de antirez (https://github.com/antirez/dump1090) y el bajo uso de recursos de cpu que hace comparado con el software rtl_adsb que viene en el paquete de rtl-sdr ordinario.

En  un AR5387un con cpu mips broadcom 6328 BMIPS4350 con apenas 320 bogomips,  emplea alrededor de un 75-80 % de cpu...

Necesitamos además una antena apropiada para la banda de 1090 Mhz teniendo en cuenta que la recepción depende de que no hayan ningún obstáculo entre el emisor y el receptor.

Recomiendo la construcción de una colineal con coaxial de TV/SAT según las instrucciones siguientes: http://www.balarad.net/

Yo uso una de 12 elementos, midiendo unos 1.5 metros y detecciones a 150 km. (mi ubicación es muy mala).

Recompilamos OpenWrt para nuestro router, añadiendo los paquetes rtl-sdr y dump1090 como packages según:

1.- Creando los directorios trunk/packages/rtl-sdr y trunk/packages/dump1090

2.- Ponemos los makefiles siguientes en cada ruta: http://steve-m.de/projects/rtl-sdr/Makefile y https://www.dropbox.com/s/he5hj2rt0kisy20/Makefile

Seleccionamos los nuevos paquetes mediante un make menuconfig, junto al libusb-1.0 (dentro de Libraries) que lo requiere el rtl-usb  y recompilamos OpenWrt.

También podemos descargar los paquetes directamente e instalarlos con opkg:

https://www.dropbox.com/s/zjdad63o09iqmvu/dump1090_0.1.0-1_brcm63xx.ipk
https://www.dropbox.com/s/gxn11kc1c49uyhu/rtl-sdr_0.1.0-1_brcm63xx.ipk

Una vez instalado,arrancamos el dump1090 y tenemos que empezar a ver cosas como



root@OpenWrt:~# dump1090 --net --net-ro-port 47806
Found 1 device(s):
0: Realtek, RTL2838UHIDIR, SN: 00000013 (currently selected)
Found Rafael Micro R820T tuner
Max available gain is: 49.60
Setting gain to: 49.60
Exact sample rate is: 2000000.052982 Hz
Gain reported by device: 49.60


*a00015b8c26800313000004951e2;
CRC: 4abc56 (ok)
DF 20: Comm-B, Altitude Reply.
  Flight Status  : Normal, Airborne
  DR             : 0
  UM             : 0
  Altitude       : 34000 feet
  ICAO Address   : 4951e2

*8d4951e29944f5aee0042e62ee1e;
CRC: 62ee1e (ok)
DF 17: ADS-B message.
  Capability     : 5 (Level 2+3+4 (DF0,4,5,11,20,21,24,code7 - is on airborne))
  ICAO Address   : 4951e2
  Extended Squitter  Type: 19
  Extended Squitter  Sub : 1
  Extended Squitter  Name: Airborne Velocity
    EW direction      : 1
    EW velocity       : 245
    NS direction      : 1
    NS velocity       : 375
    Vertical rate src : 0
    Vertical rate sign: 0
    Vertical rate     : 1



si arrancamos el planeplotter, configurando un receptor AVR TCP/IP a la ip del router con el puerto 47806 por ejemplo tendremos la ubicación de los aviones en tiempo real:

dump1090 --net --net-ro-port 47806 -raw

Podemos simulatear el modo servidor con modo interactivo en consola:

dump1090 --net --net-ro-port 47806 -raw --interactive

Tenemos pues un receptor de ADS-B de coste mínimo y con conexión wifi de tal modo que lo podemos dejar permanentemente lo más cerca posible de la antena y con el planeplotter compartir tráfico con flightradar24 por ejemplo. Esto hace viable además juntar los datos recibidos por varios equipos mediante dump1090 creando una red de receptores ADS-B.





Buena escucha!


PD: el firmware para el router Comtrend AR5387un ya preparado está aquí

FW OpenWrt Trunk ADS-B AR5387un