sdrrc: Administración Remota para un Sintonizador de Radio

ELO-330: Programación de Sistemas
Proyecto Final
2° semestre 2017

¿Que es?

Es un software que permite controlar de forma remota una estación receptora de radio, en la cual, la señal captada es retransmitida por internet mediante un streaming de audio.

Para captar la señal, usarémos un sintonizador básado en los dispositivos RTL-SDR conectados a un computador por el puerto USB, mientras que la retransmisión será delegada a un software especializado comunmente usado en estaciones de radio online.

Requisitos

El software está diseñado para correr en sistemas Linux, kernel (4.0 o superior). Además, se requieren los siguientes elementos:

  • Dispositivo sintonizador USB de la familia RTL-SDR.
  • Herramientas de compilación (GCC y GNU Make).
  • Librería librtlsdr.
  • Herramienta y librería FFmpeg.
  • Servidor streaming de audio Icecast.

    Nota: Para la demostración se levantó el servicio Icecast con el siguiente XML de configuración.

Estas dependencias pueden encontrarse en los repositorios de las distribuciones Linux, por lo menos las más populares (Ubuntu, Debian, Fedora y Arch).

Detalles de implmentación

El programa abre un socket de bienvenida en el puerto 17920/tcp, en el cual cada vez que un cliente se conecta se crea una nueva hebra que atiende al nuevo cliente. Esta hebra estará a la espera de comandos que permiten controlar la estación y se cerrará eventualmente cuando finalice la conexión. En el siguiente enlace se muestra un diagrama de flujo con los principales procedimientos en la ejecución.

Los comandos soportados son:

  • status

    Informa el estado actual de la estación, la frecuencia a la cual sintoniza (en Hertz) y su modulación.

  • start

    Inicia la recepción y retransmisión de la señal de radio.

  • stop

    Detiene la recepción y retransmisión.

  • setmod <am/fm/wbfm/raw>

    Cambia el esquema de demodulación en la recepción.

  • setfreq <nueva_frec>

    Cambia la frecuencia a sintonizar, los valores son en Hertz.

  • reload

    Aplica los cambios realizados y reinicia la recepción.

A nivel de código, estos comandos estan implementados por medio de una tabla de mapeo, la cual vincula su nombre a una funcion de callback junto con sus argumentos:

Tabla de mapeo, comandos soportados en la versión demo.

Junto a los argumentos enviados por el cliente, cada función de callback recibe un puntero a una estructura de contexto struct app_config, mediante el puntero void *magic:

Estructura de contexto app_settings y sus atributos.
Estructura sdr_settings

Según sea necesario para el control de los procesos que buscan sintonizar y retransmitir, se hace uso de llamadas al sistemas, tales como: fork(), exec(), pipe(), kill(), entre otras.

Extracto de start_cb(). Función invocada al recibir el comando start.

Forma de uso

En la estación, una vez instaladas y configuradas las dependencias solo basta compilar con make y ejecutar:

root@server ~/sdrrc # ./sdrrc
INFO: Running in station mode, listening on port: tcp/17920

Mientras que el cliente solo necesita conectarse mediante telnet a la IP y puerto del servidor. A continuación se muestra un ejemplo donde se pide a la estación sintonizar la frecuencia FM 99.7, correspondiente a la radio UTFSM de la quinta región:

felipe@vermouth ~ $ telnet localhost 17920
Trying ::1...
Connection failed: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

status
<Freq: 94500000, Mod: fm, Running: no>
setfreq 99700000
<Freq: 99700000>
start
<Starting librtlsdr...>
status
<Freq: 99700000, Mod: fm, Running: yes>

Finalmente, el streaming se encontrará activo y puede ser escuchado por reproductores de música como VLC, donde para efectos de la demostración, el enlace usado por Icecast es: http://localhost:8000/stream.ogg.m3u, con la configuración antes mencionada en los requisitos.

Posibles mejoras

Dentro de las posibles mejoras al proyecto se encuentran:

  • Interfaz más amigable: Diseñar un cliente GUI.
  • Soporte para controlar más parámetros:
    • Sampling
    • Ganancia
    • Métodos de filtrado
  • Control de más estaciones por cliente.
  • Flexibilizar la ruta al servidor de streaming (Actualmente apunta a localhost:8000, con clave elo330).

Descargas

El código fuente puede obtenerse desde los siguientes enlaces: