martes, 26 de marzo de 2013

Entrada 7: Programa principal - V15/03/2013


A la hora de utilizar el sistema, y también pensando un tener una interfaz con el usuario, hemos decidido hacer un programa principal que vaya mostrando trazas mientras realiza el proceso completo del sistema: grabar el audio -> enviarlo al servidor -> realizar el reconocimiento del idioma -> mostrar el resultado.

Este programa lo hemos desarrollado en shell script de forma que se ejecuta en una terminal, es decir, todavía no tenemos una interfaz gráfica "bonita". A continuación mostramos el código fuente comentado del script:
#!/bin/sh 

# Dirección del servidor ssh
server=diego@10.42.0.1
# Ruta al proyecto en el servidor
LID_RPi_DIR=/home/diego/Dropbox/Universidad/SDG2_Matlab/LID_RPi
# Destino del fichero de audio
AUDIO_DIR=${LID_RPi_DIR}/audio
# Ruta al fichero con los resultados del reconocimiento
SCORES=${LID_RPi_DIR}/ivectoresMFCC/plenty_closed/results_512G_i400/plenty_closed_acus_400i_512G_WithLN_hmmHung_isEval__Albayzin_TEST.scores
# Nombre del fichero de audio
WAV_NAME=tmp  

# Configuración del micrófono 
amixer –c 1 sset Mic,0 100%,100% unmute cap 1>/dev/null

# Grabación de la voz del usuario
echo Pulse Enter para comenzar a grabar 
read keypress 

arecord –D hw:1,0 –f S16_LE –c 1 –r 8000 –B 900000 ${WAV_NAME}.WAV & >/dev/null 2>&1 

echo Grabando… Pulse Enter para finalizar la grabación 
read keypress
killall arecord 1>/dev/null 

# Envío del fichero de audio al servidor
echo Enviando la información al servidor… 
scp ${WAV_NAME}.wav $server:$AUDIO_DIR >/dev/null 2>&1 || (echo “No se ha podido conectar con el servidor” && exit 1) 

# Actualizar la lista con el nombre del archivo para luego poder identificarlo
echo Procesando… 
ssh $server “echo $WAV_NAME > ‘${LID_RPi_DIR}/prueba.lst’” >/dev/null 2>&1

# Ejecución del programa en el servidor 
ssh $server ${LID_RPi_DIR}/runAll2.sh >/dev/null 2>&1

# Muestra de los SCORES por la consola 
ssh $server cat ${SCORES} 
echo “¡Listo!”
 El único problema que hemos encontrado con el script es que cada vez que se realiza una conexión con el servidor te pide la contraseña, y esto no nos parecía viable ya que el usuario podría (debería) no conocer la contraseña que le da acceso a nuestro servidor. Por ello, a continuación contamos como se realiza dicha conexión en más detalle de lo que lo hicimos en la Entrada 1 y explicamos como hemos solucionado el problema de la autenticación.

Al principio decidimos usar el protocolo SSH debido a su sencillez. El nombre viene del acrónimo Secure Shell y es un protocolo de comunicaciones que permite acceder a la Shell o intérprete de comandos de una máquina a través de la red de forma encriptada. Funciona sobre TCP, asegurándonos fiabilidad, una característica a tener en cuenta, ya que vamos a enviar ficheros y necesitamos que lleguen correctamente.

Para la implementación de este protocolo, hemos utilizado openssh, que tiene dos opciones: openssh-client y openssh-server. openssh-client permite acceder a una terminal remota, mientras que openssh-server es el que permite al ordenador ser accedido de forma remota. Por tanto, para realizar la conexión Raspberry Pi <–> Servidor, será necesario tener instalado openssh-client en la Raspberry Pi (el cual, como en muchas distribuciones de Linux, ya viene incluido) y openssh-server en el servidor. Para instalar openssh-server introducimos en la terminal del servidor:
$ sudo apt-get install openssh-server
Una vez instalado openssh en ambos dispositivos, ya podemos acceder al servidor desde la Raspberry Pi y realizar las operaciones que ya mencionamos en dicha Entrada 1.

Ahora bien, como ya hemos dicho, cada vez que se ejecuta uno de estos comandos pide la contraseña del usuario con el que accedemos al servidor. Para evitar esto hay que usar claves DSA. Cuando se generan este tipo de claves, se crean dos ficheros: uno que contiene la clave pública del cliente, y la cual hay que copiar en el fichero de claves autorizadas del servidor, y otro que contiene la clave privada. El proceso que seguimos es el siguiente:
  • Generar las claves dsa con el programa ssh-keygen (incluido en openssh):
$ ssh-keygen –t dsa
  • Darle permisos de lectura y ejecución a todos los usuarios, y de escritura sólo al propietario a la carpeta .ssh:
$ mkdir .ssh

$ chmod 755 .ssh
  • Enviar la clave pública (id_dsa.pub) al servidor como authorized_keys y darle permisos de lectura y escritura al propietario:
$ scp ~/.ssh/id_dsa.pub usuario@dirección_servidor:.ssh/authorized_keys

$ chmod 600 ~/.ssh/authorized_keys

Y una vez hemos realizado estos pasos ya podemos realizar todas las operaciones que soporte ssh sin que nos pidan una contraseña de validación por cada paso que demos.

No hay comentarios:

Publicar un comentario