31 de Mayo, 2004

La búsqueda de un transporte

Este fin de semana ha sido extraño. Sonia tenía mucho trabajo y yo no, aunque al final me he puesto a hacer experimentos y he acabado casi tan liado como ella.

Igual se ha notado que esta semana he estado probando diferentes alternativas para publicar imágenes en web desde un dispositivo de captura como una webcam o, en mi caso, una sintonizadora de televisión. Además quiero hacerlo desde cualquier punto de las redes a las que tiene acceso blackshell (elxwifi y mi LAN principalmente).

Hace un par de años que tenía ya una Logitech USB de muy mala calidad, ojo que no lo parecía en el momento de su compra :P, y que no estaba soportada en Linux ni otro sistema operativo Libre de los que uso a diario. La tenía sujetando libros (literal) porque empezaba a fallar y ya ni en un windows que me queda instalado podía descargar imágenes. Cuando compré la cámara de fotos digital, su función de sujetalibros fue definitiva.

Y así estaba hasta que hace un par de días empezamos Felipe y yo a trastear con webcams y descubrí que ¡ya había driver! Por desgracia la cámara estaba definitivamente muerta y la tiré a la basura :(.

La frustración es mala, y el amor de una madre inmenso, así que ella me ha financiado una webcam Labtec (18 EUR y pico), que es compatible con Linux (y parece que con *BSD).

Me voy por las ramas, pero que sirva como demostración de que las cosas más raras nos llevan a hacer cosas aun más extrañas :D.

El caso es soy un mal usuario de software. Si veo posibilidades en algo muy muy simple, me cuesta emplear una solución empaquetada, si sobrepasa con mucho mis necesidades.

En este caso tengo instalado XawTV EL paquete para ver televisión en UNIX. Este software viene con un programita, streamer, que permite capturar una imagen de cualquier dispositivo compatible a nivel de driver con v4l (video for linux).

Mi primera prueba: un script en shell que recogía una imagen cada 3 segundos y la enviaba con SSH a blackshell donde un juego de scripts PHP y algo de código Javascript hacían el resto.

Funcionaba (Miguel lo comprobó desde una de sus super-conexiones desde la UMH), pero la negociación para establecer la sesión SSH es lenta (y más contra un Pentium 100 como blackshell), así que claramente esta forma de transporte no es la más adecuada.

Una conversación tomando café con Felipe me llevó a la segunda prueba: NFS.

La infraestructura ya estaba funcionando, así que decidí reutilizarla. Esta forma de transporte es mucho más eficiente, aunque plantea varios problemas que enseguida descartaron el sistema.

El protocolo NFS es un tanto especial, y veía como el cliente podía obtener la imagen a medio guardar en el servidor (!). Intenté minimizar el problema con un buffer de n imágenes pero, sin entrar en bloqueos y alejarme de la concepción "sencilla" de la solución, no había un arreglo definitivo.

Además existía un punto en contra que con SSH no se daba. La posibilidad de enviar imágenes desde cualquier punto de las redes accesibles por blackshell (emitir desde el portátil a través de elxwifi es especialmente atractivo) se perdía sin remedio con NFS, relegando el sistema a solo mi red local.

A estas alturas ya debería estar claro que el FTP no era una opción. Si bien blackshell tiene un FTP anónimo que solo acepta peticiones en elxwifi, y no quiero complicar esa parte porque sería delicada. No he valorado tampoco el coste que tendría abrir una sesión, pero como algunos programas para webcam lo usan, imagino que no será tan malo.

Así que me decidí ha echar un vistazo a mis conocimientos sobre servicios web. A fin de cuentas llevo tres años dedicándome más o menos a eso, y la solución sería fácil: el servidor web lo haría todo.

Pues me he puesto a buscar opciones. Tengo alguna experiencia con SOAP, pero la implementación para PHP no me convence porque realmente no necesito algo tan potente (complejo). ¿Por qué no mirar entonces hacia su hermano menor? Finalmente XML-RPC ha resultado ser una respuesta muy elegante a todos mis problemas.

¿Qué es XML-RPC? Se trata, como su nombre indica, de un sistema para realizar llamadas remotas a procedimientos (Remote Procedure Call, RPC) empleando XML (eXtended Markup Language) como instrumento para la codificación y, en estos momentos, usando HTTP como principal medio de transporte.

Dado que es una especificación, no tendremos que atarnos a ningún lenguaje de programación sino que podremos hacer clientes/servidores en cualquier lenguaje que implemente XML-RPC. Por ejemplo uno del que dispongo en el servidor web de blackshell y que más o menos domino: PHP.

De esta forma he programado un pequeño servicio XML-RPC que proporciona dos procedimientos remotos: camrpc.push para subir una imagen al servidor y camrpc.off para marcar una cámara como apagada.

camrpc
El esquema de camrpc

Este servicio permite a cualquier cliente con acceso a la web de blackshell (usuario y contraseña mediante, claro), ejecutar esas dos operaciones y enviar la información necesaria para hacer funcionar una webcam.

Por ahora tengo implementado, a parte del servidor, un cliente en Python (no tenía ni idea de programar en ese lenguaje... ahora ya sé algo :P), y quiero hacer lo mismo el Perl porque en el portátil no tengo instalado Python (y así reviso lo poco que sé de Perl :D).

Ya explicaré más sobre este tema cuando publique lo que he ido haciendo este fin de semana. Por ahora el servidor está funcionando en blackshell y voy haciendo pruebas con el cliente en Python y homeworld (con la sintonizadora de TV, que la webcam me llega el miércoles). Cuando esté seguro de que todo va bien, publicaré el código.

Más adelante haré pruebas con la webcam y vortex (mi portátil), o incluso puede que algún usuario de elxwifi quiera publicar su webcam en blackshell para que cualquiera desde internet pueda echar un vistazo ;).

Anotación por Juan J. Martínez.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.