msgbartop
“¿Estás seguro de que ESO es aleatorio?” “Ése es el problema con la aleatoriedad: nunca puedes estar seguro”
msgbarbottom

01 feb 14 Transmisión de imágenes desde Raspberry a través de WhatsApp

Otro de los avances de este fin de semana ha sido que finalmente he conseguido enviar imágenes desde la Raspberry mediante comandos de WhatsApp. Esta ha sido la primera imagen enviada:

Captura de webcam a través de WhatsApp

Captura de webcam a través de WhatsApp

La imagen es bastante mala, lo sé, pero mi webcam ha pasado por tiempos mejores. :mrgreen:

El método fue el siguiente: conecté una antigua webcam USB a la Raspberry. Instalé la aplicación “fswebcam”, que permite tomar capturas de pantalla de un dispositivo de vídeo (en este caso, la webcam, /dev/video0), y almacenarlas como imágenes. Tras comprobar que esto funcionaba, conseguí por fin modificar el código de Yowsup para que procesara adecuadamente el envío de imágenes, gracias a un código compartido en la web de proyecto, que no me costó demasiado adaptar para que se ejecutara al recibir comandos desde WhatsApp, de una manera similar a como activo y desactivo los relés y el sensor de movimiento.

Las posibilidades de esto son enormes: la idea que tengo ahora es modificar el código de aviso del sensor de movimiento PIR para que, además de avisar de cuándo se ha detectado movimiento, realice una captura automática con la webcam, y la envíe al teléfono. Es decir, tener la posibilidad de tomar capturas bajo demanda, o bien de manera automatizada ante eventos externos.

¿Mejoras? Unas cuantas: la primera es que el código compartido no es capaz de hacer el envío de la miniatura asociada a la imagen, lo que produce en algunas ocasiones que WhatsApp dé un error en Android al intentar mostrar la miniatura (aunque luego la imagen se ve bien). La segunda es conseguir una webcam mejor. :D En cuanto a la tercera, sigue habiendo un problema: la webcam tiene que estar conectada a la raspberry, lo que no resulta demasiado práctico si el sensor de movimiento está, por ejemplo, en la entrada (y conectado con la raspberry por RF). Sería interesante poder hacer uso de una webcam IP, o algún sistema de captura de imágenes para Arduino.

Por cierto, aunque la imagen que encabeza el artículo es la primera que transmití de manera controlada por WhatsApp, no es en realidad la primera imagen enviada. Hubo otras dos antes:

Templo romano de la c/ Claudio Marcelo, Córdoba

Templo romano de la c/ Claudio Marcelo, Córdoba

Esta es la primera imagen que envié al móvil desde la Raspberry, antes de realizar la integración con la webcam. La envié con un comando desde la raspberry, para probar la efectividad de la librería de envío de mensajes.

Captura de webcam

Captura de webcam

En cuanto a esta otra, en la primera imagen que envié tras integrar la captura de la webcam en el sistema de envío de mensajes de WhatsApp. Pero, de nuevo, fue enviada desde la raspberry hacia el teléfono, antes de implementar la lógica que permite capturar la imagen desde el teléfono.

Por cierto, lo que se ve en ambas capturas es una estantería de mi estudio llena de libros, y el reloj de riego automatizado. :D

VN:F [1.9.20_1166]
Rating: 10.0/10 (2 votes cast)

Etiquetas: , , ,

15 jun 09 Streaming de webcam para monitorización remota

Una de las grandes ventajas de los sistemas linux es su flexibilidad: permiten desde realizar instalaciones estándar de escritorio hasta realizar instalaciones de grandes servidores de procesos de datos. Hoy voy a hablar de una posibilidad que permiten: realizar un sistema de monitorización remota mediante webcam. Esta aplicación respondería al siguiente esquema:

  • Una estación remota, con un sistema linux básico con una instalación en modo consola, y una webcam añadida. Idealmente este equipo debería ser de pequeño formato, como un Pico-ITX, pero cualquier equipo sería válido. Con una instalación básica de consola sería más que suficiente.
  • Un equipo de escritorio, dedicado a la monitorización. Este equipo, en desde el que se va a realizar el control de la estación remota, requeriría disponer de un entorno gráfico, a discreción del usuario

El sistema operativo, obviamente, tendría que ser linux. Cualquier distribución valdría, pero por mis preferencias personales he de recomendar Debian, una magnífica distribución con la flexibilidad suficiente como para permitir una sencilla instalación de estos dos entornos tan diferentes.

La piedra angular de esta instalación es el programa netcat, la navaja suiza de los administradores de sistemas. Esta herramienta tiene como principal característica es su capacidad para abrir puertos TCP/IP y redireccionar flujos de datos del sistema operativo por ellos. También tiene una función trascendental los túneles SSH, que permiten enlazar puertos en una máquina remota (a la que se realiza la conexión SSH) con otra máquina que esté en la red local del sistema cliente (esto también incluye, obviamente, la propia máquina cliente).

Otra suposición de la que partimos es que el cliente y el servidor NO se encuentran en la misma red local, sino que se encuentran en redes separadas, ya sea porque hay algún elemento como un cortafuegos interpuesto, o bien porque se encuentran enlazadas por una red WAN. En cualquier caso, algo impide impide que se pueda acceder a cualquier puerto entre el cliente y el servidor, estando limitado a accesos por puertos bien conocidos, como SSH.

En primer lugar, habría que configurar el sistema operativo del servidor para que reconozca la webcam. Esta tarea queda fuera de este mini-tutorial, por lo que me remito a internet para realizar esta labor. Sin embargo, en un sistema linux reciente, tendría que ser más que suficiente con instalar Video For Linux 2, ya que los módulos necesarios suelen venir por defecto en el kernel. Esto debería provocar que la webcam, al ser conectada al servidor, haga aparecer el dispositivo /dev/video0 (o algo por el estilo).

Una vez hecho esto, la idea en el servidor es la siguiente: recoger el flujo de datos de la webcam a través del dispositivo correspondiente (/dev/video0,o el que corresponda), y mediante netcat, abrir un puerto (por ejemplo, el 2000) y dirigir el flujo de datos anterior a este puerto, que estará preparado para recibir conexiones. Esto se haría mediante el siguiente comando:

$ cat /dev/video0 | nc -l -p 2000

Por otro lado, en el cliente, habría que realizar la siguiente operación: realizar un túnel SSH al servidor, de tal manera que se enlace el puerto que hemos abierto en el servidor (en este caso, el 2000) con un puerto en la máquina cliente (en este caso, el 270001). A continuación, con netcat se recoge el flujo de datos del puerto 27001; por último, mediante un pipe, se recoge la salida del comando anterior (que sería mostrada por la salida estándar) hacia un programa de visualización de vídeo adecuado, como mplayer o xine. La sucesión de comandos sería la siguiente:

ssh -f -L 27001:127.0.0.1:2000 usuario@servidor sleep 10; nc 127.0.0.1 27001 | xine -

Un cutre-esquema de lo expuesto anteriormente sería el siguiente:

Diagrama de la instalación

Diagrama de la instalación

Con toda esta película conseguiríamos visualizar desde el equipo cliente la webcam del servidor.

Una pequeña variación de lo anterior permite, por otro lado, hacer streaming de ficheros de vídeo (o audio). Con el siguiente comando abriríamos el puerto local 2000 para accesos desde un servidor remoto, que leerían del fichero video.avi:

nc -l -p 2000 < video.avi

Por la parte del cliente seguiríamos usando el comando anterior.

Existen algunos corolarios a este mini-tutorial. Uno de ellos consistiría en lograr que el acceso al servidor sea sin contraseña, basándonos en el uso de certificados de usuario. Pero eso ya quedará para otro día.

VN:F [1.9.20_1166]
Rating: 5.0/10 (1 vote cast)

Etiquetas: , , , , , ,