Receptor AIS por SDR en el Azul: Instalación y configuración con AIS-catcher

Receptor AIS por SDR en el Azul: Instalación y configuración con AIS-catcher

Una de las ventajas de llevar un mini-PC a bordo es que podemos hacer cosas que con una plotter comercial son imposibles — o prohibitivamente caras. Recibir AIS por software con un dongle RTL-SDR de 25 euros es un ejemplo perfecto.

En el Azul hemos sustituido la dependencia de OpenPlotter por una instalación limpia de AIS-catcher directamente sobre Debian, manteniendo la integración con SignalK y, por tanto, con Freeboard-SK y el resto del ecosistema. Te cuento cómo lo hicimos.

El receptor: un SDR con TCXO

Usamos un SDR con chipset RTL2832U y tuner R820T2, con oscilador TCXO de 1 ppm (frente a los típicos 20-100 ppm de los cristales de cuarzo baratos). Su cobertura va de 100 kHz a 1,7 GHz, con recepción de HF por direct sampling en la rama Q. Físicamente va en una caja azul con un logotipo de delfín.

Ese ejemplar concreto (azul, con el delfín) no se encuentra ya en internet; es un dongle genérico de la familia full band que se vende bajo distintas etiquetas y marcas. Lo que importa no es la marca sino el conjunto R820T2 + TCXO de 1 ppm. El diseño de referencia de esta clase de dispositivo es el RTL-SDR Blog V3 (misma idea: TCXO y HF por direct sampling en la rama Q). No es de los modelos más baratos del mercado.

Con un TCXO de 1 ppm el error a 162 MHz ronda los 160 Hz (0,16 kHz), despreciable frente a los 25 kHz de separación de los canales AIS (161,975 y 162,025 MHz). Los dongles baratos sin TCXO tienen desviaciones de decenas de ppm y sí exigen corrección de PPM. Esto explica la nota que ya aparece más adelante sobre no tocar PPM ni gain: no es magia de AIS-catcher, es el TCXO.

Compartir la antena del palo: el diplexor

Para compartir la antena de VHF que tenemos a tope de palo entre la radio VHF y el receptor AIS usamos un Banten 00260 "AIS Active Diplexer" (Banten, Italia). Es activo: tiene un puerto AIS (TX/RX) y un puerto VHF (TX/RX) sobre la misma antena, con alimentación de 10-30 V y unos 100 mA, soporta hasta 30 W continuos y va en una caja de aluminio de 140x63x30 mm. Un detalle práctico: sin alimentación deja paso directo a VHF, por lo que la radio no se queda sin antena si el diplexor pierde corriente. Ficha del producto.

La calidad del conjunto importa: al principio probamos otros SDR más baratos que no dieron resultados fiables, y el diplexor también debe tener una calidad mínima — un simple repartidor en T barato no vale para esto.

Dongle RTL-SDR conectado al mini-PC

Instalación

El script oficial de instalación hace todo el trabajo: descarga el binario estático más reciente, crea los directorios de configuración y registra el servicio systemd.

sudo apt update
sudo apt install -y curl
sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/jvde-github/AIS-catcher/main/scripts/aiscatcher-install) -p"

Nota para Raspberry Pi: aunque nuestra instalación es sobre un mini-PC con Debian, casi todo el procedimiento es igual de válido en una Raspberry Pi, que probablemente sea el caso de muchos lectores. La misma vía funciona: script de instalación oficial, servicio systemd e integración con SignalK por NMEA0183 over UDP.

Una vez ejecutado, el sistema queda con:

Componente Ruta
Binario /usr/bin/AIS-catcher
Configuración /etc/AIS-catcher/
Servicio systemd /etc/systemd/system/ais-catcher.service

Identificar el SDR por su serial USB

No basta con enchufar el dongle: hay que decirle a AIS-catcher cuál de los dispositivos USB es el receptor. El comando AIS-catcher -l lista los dispositivos disponibles:

AIS-catcher -l

En nuestro caso la salida muestra tres dispositivos, y el RTL-SDR aparece con su serial grabado en la EEPROM:

Found 3 device(s):
0: Realtek, RTL2838UHIDIR, SN: rtl-buen
1: Serial, USB Serial, SN: usb-FTDI_...
2: Serial, USB Serial, SN: usb-ITEAD_...

Para confirmar el serial también puedes usar:

lsusb -v 2>/dev/null | grep -A 5 -B 5 "RTL2838"

Nos quedamos con rtl-buen, que es el serial que hemos fijado en la EEPROM del dongle para tener una identificación estable, independientemente del puerto USB donde lo conectemos.

Configuración mínima

El fichero de configuración se encuentra en /etc/AIS-catcher/config.cmd. Nosotros usamos esta configuración, probada y optimizada para nuestro entorno:

-d rtl-buen
-o 1
-u 0.0.0.0 10110

Línea a línea:

  • -d rtl-buen — selecciona el RTL-SDR por su serial USB. Así da igual en qué puerto USB esté conectado.
  • -o 1 — modo de salida "NMEA only". Suficiente para SignalK, que entiende NMEA 0183 nativamente.
  • -u 0.0.0.0 10110 — envía los mensajes NMEA por UDP al puerto 10110, escuchando en todas las interfaces de red.

Nota sobre PPM y gain: No hace falta ajustar PPM ni gain manualmente si la recepción es estable. El control automático de ganancia (AGC) interno del RTL-SDR, combinado con el decodificador moderno de AIS-catcher, ofrece un rendimiento excelente con la configuración por defecto.

Arrancar y gestionar el servicio

Una vez escrita la configuración, habilitamos e iniciamos el servicio systemd:

sudo systemctl daemon-reload
sudo systemctl enable --now ais-catcher.service

Para comprobar que todo va bien:

systemctl status ais-catcher.service

Y si quieres ver los mensajes AIS en tiempo real desde la consola:

sudo journalctl -u ais-catcher.service -f

Integrar con SignalK

Ahora vamos a decirle a SignalK que recoja los mensajes que AIS-catcher está emitiendo por UDP:

  1. Abre la interfaz web de SignalK (normalmente en http://localhost:3000 o la IP del equipo donde corre).
  2. Ve a Data Sources -> Add Connection.
  3. Selecciona tipo NMEA0183 over UDP.
  4. Puerto: 10110.
  5. Escuchar en: 0.0.0.0 (o 127.0.0.1 si prefieres restringirlo a la propia máquina).

Guarda y activa la conexión. A partir de ese momento los datos AIS empiezan a fluir. Puedes comprobarlo en el Data Browser de SignalK, donde aparecerán rutas como:

  • navigation.position
  • vessels.<mmsi>.static.name
  • sensors.ais.class

Verificar que los datos llegan

Si quieres asegurarte de que los mensajes NMEA están saliendo del receptor, abre un terminal en el mini-PC y ejecuta:

nc -u -l 10110

Deberías ver líneas como estas:

!AIVDM,1,1,,A,13WU;o02AoO`m<tDahrIp7sH08JO,0*53
!AIVDM,2,1,0,A,59NWw5H2@cCh7QQW800P4lltpT6084i@T<40001?IhCC;4WC0IQDhC1h,0*39

Si ves esto, enhorabuena: tu receptor AIS funciona.

Notas importantes

  • No hemos activado el servidor web de AIS-catcher. La opción server.active = false en config.json lo mantiene desactivado, lo que aligera el sistema y reduce la superficie de ataque. Todo pasa por SignalK.
  • Los mensajes tipo 5 (los que contienen nombre, destino, calado y demás datos estáticos del barco) pueden tardar hasta 6 minutos en aparecer tras el inicio del receptor. Es normal: esos mensajes se emiten a intervalos largos. Ten paciencia.
  • Si en el futuro añadimos más SDRs, habrá que asegurarse de que cada uno tenga un serial único, o usar el índice (-d:0) en la configuración.

Tres años de servicio continuo

Ambos dispositivos — el SDR y el diplexor Banten — llevan más de tres años funcionando 24/7 a bordo del Azul con un funcionamiento perfecto hasta hoy.

El alcance observado supera las 20 millas en condiciones normales, y no hemos apreciado ningún problema en el uso de la radio VHF compartiendo antena a través del diplexor.

Aviso legal

AIS-catcher es software libre para fines educativos y de afición. No está certificado para navegación ni seguridad de la vida humana. La información recibida debe contrastarse siempre con fuentes oficiales. Úsalo bajo tu propia responsabilidad y conforme a la legislación local sobre recepción de radio.


¿Te ha resultado útil? ¿Has montado tu propio receptor AIS? Escríbeme — siempre aprendo con las experiencias de otros navegantes.