Construye un Radar de Tráfico Aéreo con tu Raspberry Pi

Hola a todos de nuevo!!

¿Cómo van esas vacaciones? Seguro que bien, por eso os traigo un tema bastante interesante y que puede resultar bastante curioso a más de un@. Si os estáis aburriendo en vuestras vacaciones y tenéis una Raspberry Pi y un RTL-SDR (escaner de radio) podéis hacerlo en casa.

Con estas dos cosas puedes hacer un radar aéreo casero y que funciona bastante bien, aprendes a manejarte con Linux, librerías, dependencias, hardware, protocolos y tu resultado lo verás en tiempo real!

Más de un@ dirá, pues yo no tengo lo que hace falta, además, seguro que es caro. Pues os digo que no, además de que ambos dispositivos se pueden usar en infinidad de aplicaciones y es una de las cosas que a todo hacker le gustaría tener en su arsenal de herramientas. Todo este procedimiento se puede hacer tanto bajo Windows como Linux, por lo que, no hay excusa, así que vamos a ello.

Bien, para que sepamos de que va la historia, vamos a utilizar la herramienta Dump1090. Esta herramienta (entre muchas otras cosas) se encarga de procesar la información del sistema ADS-B (Automatic dependent surveillance—broadcast) que todos o prácticamente todos los aviones tienen (empezará a se obligatorio en ciertos paises en 2020). Este sistema es una tecnología de vigilancia cooperativa en la que un avión determina su posición a través de la navegación por satélite y la emite periódicamente, lo que permite realizar su seguimiento. La información puede ser recibida por las estaciones terrestres de control de tráfico aéreo como un reemplazo para el radar secundario ya que no necesita recibir una señal desde tierra para emitir. También, puede ser recibida por otras aeronaves para proporcionar conocimiento de la situación y permitir la auto-separación. Gracias a este sistema ¡nuestra Raspberry Pi podrá ser un radar de tráfico aéreo!. Este sistema normalmente emite una señal se a 1090 Mhz y que nuestro RTL-SDR puede recibir. 🙂

Bueno y, ¿qué hay que hacer o qué necesito?

  • Una Raspberry Pi y su fuente de alimentación, acompañado de un cable Ethernet. En mi caso tengo el kit Raspberry Pi 3 B.
RaspberryPi model 3.
  • Un espectómetro de radiofrecuencia, también conocido por RTL-SDR (Software Defined Radio). Utiliza generalmente el chip RTL2832U para el procesamiento de la señal recibida de la antena. Algún día hablaré más sobre esta maravillosa herramienta. En mi caso tengo: DVB-T-SDR.
RTL-SDR
  • Una tarjeta microSD (con su adaptador al PC) para la Raspberry Pi. Yo uso una de 8 GB que tenía de andar por casa, que para este caso vale de sobra. Si la queréis seguir usando para otras aplicaciones se os puede quedar corta.
  • Raspbian, el sistema operativo Linux basado en Debian que usaremos en la Raspberry Pi. Se puede descargar gratuitamente desde su página oficial. Al ser una tarea que no se requiere nada más que la Raspberry Pi y el RTL-SDR nos descargaremos el SO básico sin sistema gráfico (solo línea de comandos). Las ventajas es que, pesa menos, nos ahorramos la parte gráfica, ya que no usaremos la salida HDMI para nada, y por tanto tampoco el teclado y ratón; con todo esto ahorraremos procesamiento innecesario y sobre todo energía.
RTL-SDR

Ya tenemos todo lo necesario, ¡manos a la obra!

Para comenzar, tendremos que montar la imagen en la microSD para que la Raspberry Pi pueda acarrancar y use la microSD como memoria persistente, (todos los cambios que se hagan se quedarán guardados incluso si apagamos la Raspberry Pi).

Este punto se puede hacer de muchas formas; la página oficial recomienda el uso de Etcher, que vale tanto para distribuciones Linux como Windows, ya que tiene una interfaz muy amigable. Yo personalmente, siempre uso Rufus, nunca me ha fallado, es portable y me parece el mejor de todos (para gusto los colores), lo malo, es que solo está bajo Windows. Pero como ya he dicho, todo el desarrollo de este procedimiento se puede hacer tanto bajo Windows como bajo Linux, por lo que no habría problema. Elegid el que más os guste.

Conectamos nuestra tarjeta microSD al PC y en mi caso al usar Rufus, ejecutamos Rufus y seleccionamos la imagen del SO, y la microSD. No hay que seleccionar nada más, el resto son opciones avanzadas que no vienen al tema. Listo, ¡damos a empezar!

Raspbian instalación

Una vez que el proceso haya terminado, tendremos la microSD con nuestro sistema operativo Raspbian instalado, y si nos fijamos, tendremos dos particiones. La partición boot que es la que usa para bootear el sistema y la partición rootfs que es donde se encuentra el file system del SO.

Como he mencionado antes, no vamos a usar ni teclado ni ratón ya que no hace falta. Esto acarrea un problema y es que por defecto (por seguridad) el servidor SSH se encuentra deshabilitado y necesitaríamos acceso físico a nuestra Raspberry Pi, y posteriormente, habilitarlo. Pero podemos solucionarlo, solo tendremos que crear un archivo vacío con nombre “ssh” sin extensión en la partición boot.

Creando archivo vacio sin extension en la particion boot.

Listo, cuando arranquemos nuestra RaspberryPi, tendremos el servidor SSH habilitado para poder conectarnos desde nuestro PC. Como es de esperar, es necesario que tengamos acceso remoto a nuestra Raspberry Pi, por lo que lo ideal sería conectar el cable ethernet (que normalmente viene con el router) al puerto Ethernet físico de la Raspberry Pi. Introducimos la microSD y le conectamos la fuente de alimentación a 5V. Aquí podríamos usar o un cargador de móvil de al menos 1 A aunque se recomienda 2.4 A (ya que en el peor de los casos es la mayor corriente que podrá consumir), pero estamos a salvo, ya que éste no será nuestro caso, porque solo tendremos consumiento principalmente nuestro RTL-SDR, el procesador Broadcom y la controladora de ethernet. También podríamos usar una batería portatil (powerbank) que normalmente tienen salida de 1 A y de 2.4 A. Elegid lo que os venga mejor.

Tras unos segundos después del arranque, solo nos quedará saber la IP local que se le ha asignado a nuestra Raspberry Pi, y posteriormente conectarnos usando protocolo SSH.

  • En Linux:
 root@kali:/home/closer# netdiscover
root@kali:/home/closer# ssh 192.168.1.40 -l pi

Netdiscover & abriendo conexion SSH.

Nos pedirá la contraseña, que es raspberry y aceptaremos la petición de conectarnos ya que se ha generado un fingerprint personalizado para la conexión segura entre nuestro PC y nuestra Raspberry Pi.
Tras aceptar, ¡ya estamos conectados a nuestra Raspberry Pi!

  • En Windows:

Por defecto, Windows anteriores a Windows 10 no trae ningún cliente para poder conectarnos por SSH, pero hay herramientas como Putty que nos hace de cliente. Para descargarnos la versión portable, con solo ir a la sección de “Alternative binary files” y seleccionar nuestra versión del binario “putty.exe” (x64 u x86). Si usas Windows 10 (a partir de Abril de 2018) ya viene, por defecto, el cliente SSH.
Una vez en nuestras manos, en la ventana de comandos lanzaremos:

 C:\Users\Closer> arp -a | findstr b8-27-eb

Con “arp -a” mostraremos la tabla ARP (Address Resolution Protocol) que se encarga de asociar las IPs dinámicas y estáticas con direcciones MAC. Dado que la tabla ARP puede ser un poco extensa y no tener claro cual es la IP de nuestra Raspberry Pi, podemos filtrarla con “findstr b8-27-eb” ya que en la industria de asignaciones de direcciones MAC cada fabricante se asigna un rango de direcciones MAC, en este caso para Raspberry Pi Fundation tiene asignadas las direcciones MAC B8:27:EB:xx:xx:xx. Por tanto nuestra salida podría quedar tal que:

ARP-A & FINDSTR MAC RaspberryPiFundation.

Ahora, sí, sabiendo a IP a la que nos tenemos que conectar, abrimos Putty (en caso de tenerlo), escribimos la IP, declaramos que queremos conexión por SSH con el puerto 22 (por defecto para TCP) y nos conectaremos:

Putty Configuracion.

Nos saldrá el aviso igual que antes en Linux, de confirmar el fingerprint para la conexión segura, aceptamos, y ya tendremos acceso a nuestra Raspberry Pi, nos pedirá usuario para el login que como ya sabéis es pi y la contraseña raspberry.

En caso de tener Windows 10, el comando es el mismo que en Linux.

A partir de aquí, ya es lo mismo tanto para Linux como Windows, yo continuaré en Linux. Vamos a la chicha.

Antes de todo, que no se os olvide cambiar la contraseña por defecto de la Raspberry Pi.

Putty Configuracion.

Primeramente y ya que la imagen de nuestra Raspberry Pi puede tener algo de tiempo, es decir, estar algo desactualizada (que haya pasado un tiempo desde la release), y el contenido de los repositorios hayan podido cambiar, esto, nuestro Raspbian no lo sabe. Por tanto, es recomendable actualizar el listado de los paquetes, para tener la versión más reciente de ellos y ver cuáles son necesarios actualizar y a qué versión, en caso de requerir una instalación.

pi@raspberrypi:~ $ sudo apt-get update

Cuando nuestro Raspbian ya tenga el listado de paquetes actualizado, será necesario instalar la dependencias. Diréis ¿dependencias de qué? Las dependencias que son en definitiva librerías (en este caso paquetes) que son necesarias para poder instalar la herramienta con la que vamos a jugar.🙂

Gracias a los buenos repositorios no será necesario complicarnos la vida. Salvo que queramos descargar alguna librería/paquete en específico o a una versión que no esté en los repos, lo ideal sería coger el que nos ofrecen e instalarlo, ya que son librerías que ya están más que probadas y están empaquetadas (nos ahorramos el proceso de compilación y lo que eso conlleva, ya que para ciertas librerías es un poco tedioso). Instalamos las siguientes librerías:

pi@raspberrypi:~ $ sudo apt-get install -y debhelper libusb-1.0-0-dev librtlsdr-dev librtlsdr0 rtl-sdr lighttpd

Si os habéis bajado, por cualquier razón, otra release de Raspbian (con entorno gráfico por ejemplo) puede ser que alguna esté ya instalada. Para este caso, esas librerías son todas necesarias, y de hecho, algunas son dependencias de otras librerías, e importa el orden. Con -y no nos pedirá confirmación de instalación y reserva de memoria en la unidad microSD (todo a “yes”).

Por último, nos queda instalar la herramienta con la que jugaremos. Esta herramienta es la conocida dump1090 aunque a lo largo de su vida (su último desarrollo fue hace 7 años) ha ido mutando y usuarios de Github han ido haciendo forks de ella y hay versiones modificadas y con features nuevas. Hay un par de empresas que hacen uso extensivo de esta herramienta y con sus propias modificaciones, al final os contaré de que van. Nosotros instalaremos la última que hay, llamada dump1090-mutability. He de decir que, no es realmente la última ya que FlightAware hizo un fork de esta y ha introducido nuevas features, pero me he decantado por la mutability porque FA la ha adaptado a su SO modificado. Como ya he dicho, al final comentaré mejor sobre esto.

Bueno, sigamos:

pi@raspberrypi:~ $ sudo apt-get install -y dump1090-mutability

Si todo ha ido bien (que debería), al terminar el proceso de instalación automáticamente se lanza el asistente de configuración del paquete. Donde nos saldrá una ventana como la siguiente:

Putty Configuracion.

Nos pedirá que si queremos que se lance automáticamente al iniciar nuestra Raspberry Pi, indicamos “Yes” si queremos que sea así, en caso contrario, tendríamos que lanzarlo a mano cada vez que queramos usarlo. Como mi intención es más adelante seguir añadiendo features a nuestra Raspberry indico que sí.

Por otro lado, este asistente nos ha asignado una configuración por defecto en “/etc/default/dump1090-mutability“. En este punto, se puede hacer dos cosas; si hacemos “dpkg-reconfigure dump1090-mutability” nos volverá a aparecer el asistente que nos irá preguntando una a una, una serie de configuraciones/parámetros (que en su mayoria las dejariamos por defecto) que podríamos ir cambiándolas, o, editar el archivo en la ruta anterior mencionada. Para que no se extense esto, os dejaré la configuración que se encuentra en “/etc/default/dump1090-mutability” que habría que utilizar para que podamos tener nuestro radar de vuelo con las características mínimas (que un futuro podríamos modificar).

El archivo de configuración debería quedar tal:

# dump1090-mutability configuration file
# this is a POSIX shell fragment.
# You can edit this file directly, or use
# "dpkg-reconfigure dump1090-mutability"

# Set to "yes" to start dump1090 on boot.
START_DUMP1090="yes"

# User to run dump1090 as.
DUMP1090_USER="dump1090"

# Logfile to log to
LOGFILE="/var/log/dump1090-mutability.log"

#
# Receiver options
#

# RTLSDR device index or serial number to use
# If set to "none", dump1090 will be started in --net-only mode
DEVICE="0"

# RTLSDR gain in dB.
# If set to "max" (the default) the maximum supported gain is used.
# If set to "agc", the tuner AGC is used to set the gain.
GAIN="max"

# RTLSDR frequency correction in PPM
PPM="0"

#
# Decoding options
#

# If yes, fixes messages with correctable CRC errors.
FIX_CRC="yes"

# If set, supplies a reference location for local position decoding.
LAT="LATITUD"
LON="LONGITUD"

# If set, provides the absolute maximum receiver range used to
# filter bad position reports, and to determine when local position
# decoding is safe to use. Specify this in nautical miles (NM).
MAX_RANGE="300"

#
# Networking options
#

# Port to listen on for raw (AVR-format) input connections. 0 disables.
RAW_INPUT_PORT="30001"

# Port to listen on for raw (AVR-format) output connections. 0 disables.
RAW_OUTPUT_PORT="30002"

# Port to listen on for SBS-format output connections. 0 disables.
SBS_OUTPUT_PORT="30003"

# Port to listen on for Beast-format input connections. 0 disables.
BEAST_INPUT_PORT="30004,30104"

# Port to listen on for Beast-format output connections. 0 disables.
BEAST_OUTPUT_PORT="30005"

# TCP heartbeat interval in seconds. 0 disables.
NET_HEARTBEAT="60"

# Minimum output buffer size per write, in bytes.
NET_OUTPUT_SIZE="500"

# Maximum buffering time before writing, in seconds.
NET_OUTPUT_INTERVAL="1"

# TCP buffer size, in bytes
NET_BUFFER="262144"

# Bind ports on a particular address. If unset, binds to all interfaces.
# This defaults to binding to localhost. If you need to allow remote
# connections, change this.
NET_BIND_ADDRESS=""

#
# Misc options
#

# Interval (in seconds) between logging stats to the logfile. 0 disables.
STATS_INTERVAL="3600"

# Path to write json state to (for use with an external webserver). Blank disables.
JSON_DIR="/run/dump1090-mutability"

# Interval between writing json state (in seconds). 0 disables.
JSON_INTERVAL="1"

# Accuracy of receiver location to write to json state, one of "exact" / "approximate" / "none"
JSON_LOCATION_ACCURACY="approximate"

# Set to yes to log all decoded messages
# This can get large fast!
LOG_DECODED_MESSAGES="no"

# Additional options that are passed to the Daemon.
EXTRA_ARGS=""

Los parámetros de color blanco son los de por defecto o poco relevantes para lo que queremos, y los azules son los que realmente son importantes de cambiar, tal y como dice la configuración. Eso sí, que no se os olvide cambiar los parámetros LATITUD y LONGITUD de la configuración con la latitud y longitud de la ubicación de vuestra Raspberry Pi.

Para terminar, debemos de asegurarnos de que se ha habilitado el uso de la librería lighttpd para dump1090, debería de haberlo hecho al finalizar la instalación de la herramienta. En caso de que no se haya habilitado tendríamos que habilitarla y forzar a reiniciar el servicio con:

pi@raspberrypi:~ $ lighty-enable-mod dump1090
pi@raspberrypi:~ $ sudo service lighttpd force-reload

Por último, reiniciamos el servicio de dump1090-mutability. Se puede hacer de varias formas, como la anterior de lighttpd, usando service, pero también se podría desde el adminitrador de servicios de Linux, systemctl. Elegid el que queráis, para este caso no importa.

pi@raspberrypi:~ $ sudo systemctl restart dump1090-mutability.service

¡Ya lo tenemos todo!
Vamos a la dirección IP de nuestra Raspberry Pi para ver el mapa.

En mi caso http://192.168.1.40/dump1090/gmap.html

¡Mira como queda!

Radar de trafico aereo.

Y ¡así me ha quedado el sistema!

A quien le guste este mundillo, os recomiendo investigar y leer más sobre esto. Además con Dump1090 se puede hacer alguna cosa más, como añadirle trazas de altimetría en el mapa, ya que esto también tiene su estudio. Por ejemplo, hemos puesto que use una distancia de por defecto 300 millas náuticas y que haga uso de la ganancia al máximo, etc, esto a veces no es así o no es lo que queremos, ya que depende mucho de las circunstancias en las que nos encontremos. Como ya he dicho esto tiene su estudio, como por ejemplo la refracción de las ondas, que nos limitará así como si estamos en un sitio bajo, o con árboles, la llegada de las ondas de radio.

Putty Configuracion.

En definitiva, a quien le guste esto hay varias plataformas que se dedican a esto exclusivamente y son bastantes buenas, como por ejemplo FlightRadar24 o Flighaware que como ya comenté usan sus variaciones de Dump1090, de hecho, tienen sistemas operativos especializados en esto, es decir un “todo en uno” que lo instalas en tu Raspberry Pi y con acceso a Internet envian los datos a las plataformas, y hacer entre toda la comunidad, un radar de vuelo MUNDIAL. Si estáis interesados, en cada una de las plataformas, os indican como hacerlo paso a paso.

Espero haberme explicado con claridad y que os haya gustado. Si os ha gustado este mundillo, quizás algún día hago un post para capturar la señal de algún satélite que transmite imágenes. 😏

Nos vemos en el siguiente post! 😉

Happy Hacking!

Autor: Rafael Moreno López.

Comentarios en “Construye un Radar de Tráfico Aéreo con tu Raspberry Pi

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *