ELO-330: Programación de Sistemas
Proyecto Final
2° semestre 2017
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.
El software está diseñado para correr en sistemas Linux, kernel (4.0 o superior). Además, se requieren los siguientes elementos:
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).
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:
Informa el estado actual de la estación, la frecuencia a la cual sintoniza (en Hertz) y su modulación.
Inicia la recepción y retransmisión de la señal de radio.
Detiene la recepción y retransmisión.
Cambia el esquema de demodulación en la recepción.
Cambia la frecuencia a sintonizar, los valores son en Hertz.
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:
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:
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.
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.
Dentro de las posibles mejoras al proyecto se encuentran:
El código fuente puede obtenerse desde los siguientes enlaces: