"Después del juego es antes del juego"
Sepp Herberger

lunes, 9 de marzo de 2015

Montemos una webcam IP barata (II)

En el anterior post instalamos OpenWrt en nuestro router ADSL Huawei desahuciado. Vamos a ver en esta segunda parte como instalar todo el sistema de manejo de la webcam y grabado de las imágenes.

1. Conectando la webcam

El firmware Barrier Breaker no trae drivers USB ni de la cámara, así que lo primero es instalarlos:

root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install usbutils kmod-usb2 kmod-usb-core kmod-usb-ohci kmod-usb-uhci kmod-video-uvc

El driver que instalamos para nuestra cámara es kmod-video-uvc, que es el usado por un buen número de webcams en Linux. Para otras cámaras habría que encontrar el driver que funciona, por ejemplo para la EyeToy de la PS2 sería kmod-video-gspca-ov51.

Puede que la postinstalación nos de errores al intentar cargar los drives en memoria. No importa, tras el reinicio cargarán bien.

root@OpenWrt:~# reboot

Conectamos la cámara a un puerto usb y hacemos:

root@OpenWrt:~# lsusb
Bus 001 Device 003: ID 0c45:62f1 Microdia
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0424:2502 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Ahí esta: 0c45:62f1 Microdia. Veamos si ha cargado el módulo:

root@OpenWrt:~# lsmod | grep uvc
input_core             24617  6 uvcvideo
usbcore               115555  6 uvcvideo
uvcvideo               61219  0
videobuf2_core         24202  1 uvcvideo
videobuf2_vmalloc       2881  1 uvcvideo
videodev               89620  3 uvcvideo

Perfecto, ¿existirá el dispositivo de vídeo?:

root@OpenWrt:~# ls /dev/video0
/dev/video0

Genial. Vamos a hacer una fotico, sonríe please:

root@OpenWrt:~# opkg update; opkg install fswebcam
root@OpenWrt:~# fswebcam --scale "320x240" "snapshot-1.jpg"

Bueno, pues en "snapshot-1.jpg" tenemos la captura tomada. Como nuestro router no tiene entorno gráfico no podemos verla, pero podemos sacarla de allí con:

root@OpenWrt:~# scp snapshot-1.jpg usuario@mipc:/home/usuario/ruta/a/mi/escritorio

Sustituir usuario, mipc y ruta según sea tu caso. Se copiará al escritorio de nuestro PC de trabajo y podremos ver alli que tal la captura.

2. Almacenando las imágenes.

Las imágenes que capturemos no podemos guardarlas en la memoria flash del router, que solamente tiene 16Mb de capacidad. Hay varias alternativas:

-Una unidad de almacenamiento conectada a un puerto USB

-Almacenamiento remoto. Se me ocurren tres opciones:

2.1. Carpeta compartida por Samba/CIFS.

Tomado de aquí:

root@OpenWrt:~# opkg update; opkg install kmod-fs-cifs samba36-client

Suponiendo que la unidad compartida se accede con \\ip-servidor-samba\recurso, hariamos:

root@OpenWrt:~# mount -t cifs //ip-servidor-samba/recurso /mnt -o user=usuario,password=contrasena,file_mode=0777,dir_mode=0777,nounix,noserverino

Y ya tenemos en /mnt montado el recurso compartido. Si queremos un automontaje en el arranque del sistema:

root@OpenWrt:~# cat /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

sleep 30 # Esperamos un rato a que haya red...
mount -t cifs //ip-servidor-samba/recurso /mnt -o user=usuario,password=contrasena,file_mode=0777,dir_mode=0777,nounix,noserverino

exit 0

Reiniciando veremos que se monta automáticamente la carpeta compartida sobre la ruta /mnt.  En general funciona muy bien, pero por desgracia tuve que abandonarla porque el software que uso para hacer las capturas de la webcam (motion) necesita crear enlaces (symbolic link) y CIFS no soporta tal funcionalidad.

2.2. Montaje de directorio remoto por NFS.

Contado aquí. No lo llegué a probar.

2.3. Montaje de directorio remoto por sshfs.

Aunque un poco mas complicado que los anteriores, es el elegido por ser sencillo de configurar en el servidor de ficheros y permitir la creación de enlaces.

El cliente/servidor ssh que viene por defecto con OpenWrt es drobpear, pero es muy limitado para lo que queremos hacer ya que no permite fácilmente conexiones mediante relaciones de confianza, ni automatización del fichero knownhosts.

root@OpenWrt:~# /usr/bin/ssh -?
WARNING: Ignoring unknown argument '-?'
Dropbear SSH client v2014.63 https://matt.ucc.asn.au/dropbear/dropbear.html

AVISO: bajo ningún concepto desinstalar dropbear, aunque no usemos su cliente ssh, el servidor ssh es el que nos permite conectarnos al router. Si lo desinstalas puedes quedarlo aislado y tener que entrar en modo rescate y tener que cargar el firmware de nuevo.

En lugar de usar dropbear usaremos el cliente openssh, instalándolo:

root@OpenWrt:~# opkg install openssh-client sshfs openssh-keygen
root@OpenWrt:~# /usr/bin/ssh -h
unknown option -- h
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]

Prueba de montaje en carpeta:

root@OpenWrt:~# sshfs openwrt@servidor-ficheros:/home/openwrt /mnt

Previamente debemos haber creado el usuario openwrt y su home en el PC que será nuestro servidor de ficheros, donde guardaremos las fotos de la webcam.

El montaje por ssh nos pregunta la contraseña y las típicas preguntas sobre el servidor nuevo y knownhosts, si queremos evitar esto último (útil para automatizar el montaje) pondremos estos parámetros:

root@OpenWrt:~# sshfs -o ssh_command="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" openwrt@servidor-ficheros:/home/openwrt /mnt

Para evitar la pregunta de la clave y establecer relación de confianza al montar el directorio remoto por ssh sigo parte de este ejemplo:

root@OpenWrt:~# ssh-keygen
root@OpenWrt:~# cd /root/.ssh/
root@OpenWrt:~# scp id_rsa.pub root@servidor-ficheros:/tmp

Y metemos la clave pública en el home de openwrt en .ssh/authorized_keys:

root@servidor-ficheros:~# cat /tmp/id_rsa.pub >> .ssh/authorized_keys

Probamos que entramos sin contraseña y sin preguntitas pesadas:

root@OpenWrt:~# ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no openwrt@servidor-ficheros

Y ahora probamos el montaje:

root@OpenWrt:~# sshfs -o ssh_command="ssh -i /root/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" openwrt@servidor-ficheros:/home/openwrt /mnt
root@OpenWrt:~# ls /mnt

Por último, lo metemos en rc.local para que lo monte en el arranque:

root@OpenWrt:~# cat /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

sleep 40
sshfs -o ssh_command="ssh -i /root/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" openwrt@servidor-ficheros:/home/openwrt /mnt

exit 0
Actualización 25/1/2016: después de varios meses funcionando bastante bien, había un pequeño problema recurrente. Cuando el servidor remoto donde se guardan los archivos se caía, la conexión se perdía y se empezaban a guardar las capturas en el /mnt/ local del router que como disco local se llenaba pronto y colapsaba el OpenWrt. Adicionalmente, /mnt se negaba a montarse de nuevo al no estar vacío. Con este retoque en /etc/rc.local lo limpio antes de volver a montarlo y así me evito el problema:
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
sleep 40
umount /mnt
rm -rf /mnt/*
sshfs -o ssh_command="ssh -i /root/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" -o nonempty openwrt@servidor-ficheros:/home/openwrt /mnt

exit 0

3. Capturando el vídeo.

La primera opción que probé es mjpg_streamer:

root@OpenWrt:~# opkg update; opkg install mjpg-streamer
root@OpenWrt:~# mjpg_streamer -i "input_uvc.so -d /dev/video0" -o "output_http.so -w /www/webcam -port 8080"

Si abrimos un navegador con http://ip-router:8080 veremos el flujo de vídeo de la cámara. Por desgracia, si queremos grabar:

root@OpenWrt:~# mkdir /mnt/snapshot
root@OpenWrt:~# root@OpenWrt:~# mjpg_streamer -i "input_uvc.so -d /dev/video0" -o "output_http.so -w /www/webcam -port 8080" -o "output_file.so -f /mnt/snapshot/ -d 5000"

Vemos que da error ya que el módulo output_file.so no está en el paquete mjpg_streamer de OpenWrt.

El siguiente candidato es motion, que además luego me doy cuenta de que tiene muchas más funcionalidades que mjpg_streamer.

root@OpenWrt:~# opkg update;  opkg install motion
root@OpenWrt:~# mkdir -p /mnt/snapshot

Configuramos el programa:

root@OpenWrt:~# nano /etc/motion/motion.conf
#Solo toco estos parámetros, el resto los quedo igual de momento:
daemon on
width 352
height 288
framerate 5
snapshot_interval 10
target_dir /mnt/snapshot
snapshot_filename %Y-%m-%d-%H:%M:%S-snapshot-%v
picture_filename %d%m%Y-%H%M%S-%q
stream_port 8081
stream_maxrate 5
stream_localhost off

Lo ejecutamos con:

root@OpenWrt:~# motion -c /etc/motion.conf

Si abrimos un navegador con http://ip-router:8081 veremos el flujo de vídeo de la cámara. Simultáneamente se graban 5 frames por segundo en /mnt/snapshot cuando la cámara detecte movimiento. Si no hay movimiento se grabará una imagen cada 10 segundos (llamada *snapshot.jpg). Esto tiene mejor pinta. Si queremos matar el proceso, que se está ejecutando como demonio, haremos:

root@OpenWrt:~# killall motion

Con esto acaba la segunda parte. Para la tercera queda:

  • Ejecución de motion como servicio.
  • Afinar la detección de movimientos.
  • Detectar eventos y conectarlos al envío de correos electrónicos de aviso.
  • Y varias sugerencias mas para ampliar esto.

Hasta la próxima......

6 comentarios:

  1. Buenas noches, ya he conseguido que el motion funcione, pero te quería preguntar, porque no entiendo porqué los colores de la imagen son grises y violetas, sin embargo si hago una captura con el "fswebcam --scale "320x240" "snapshot-1.jpg" la imagen tiene todos los colores perfectamente, sin alteraciones de ningún tipo. ¿A tí te ocurre lo mismo o se te ven los colores bien?.... ya por último estoy viendo que el motion que instala el OpenWRT es del año 2011 (20110826-051001-2), he buscado en la web de motion y ya van por la versión 3.2.12, y en las carpetas de la web me he bajado esta versión "motion-20140827-051001" Ahora viene el dilema,,,,estoy tratando de compilarlo (soy macronovato pero lo lucho)...y no hay forma, ya instalé el make en OpenWRT, pero me salen estos errores:

    root@Webcam1_Relayd_CliWiFi:/usr/motion-20140827-051001# ./configure
    checking for gcc... no
    checking for cc... no
    checking for cl.exe... no
    configure: error: in `/usr/motion-20140827-051001':
    configure: error: no acceptable C compiler found in $PATH
    See `config.log' for more details


    Así que procedí a ver el config.log:


    root@Webcam1_Relayd_CliWiFi:/usr/motion-20140827-051001# cat config.log
    This file contains any messages produced by compilers while
    running configure, to aid debugging if configure makes a mistake.

    It was created by motion configure trunkREV561, which was
    generated by GNU Autoconf 2.69. Invocation command line was

    $ ./configure

    ## --------- ##
    ## Platform. ##
    ## --------- ##

    hostname = Webcam1_Relayd_CliWiFi
    uname -m = mips
    uname -r = 3.10.49
    uname -s = Linux
    uname -v = #3 Wed Oct 1 15:07:11 CEST 2014

    /usr/bin/uname -p = unknown
    /bin/uname -X = unknown

    /bin/arch = unknown
    /usr/bin/arch -k = unknown
    /usr/convex/getsysinfo = unknown
    /usr/bin/hostinfo = unknown
    /bin/machine = unknown
    /usr/bin/oslevel = unknown
    /bin/universe = unknown

    PATH: /usr/bin
    PATH: /usr/sbin
    PATH: /bin
    PATH: /sbin


    ## ----------- ##
    ## Core tests. ##
    ## ----------- ##

    configure:2458: checking for gcc
    configure:2488: result: no
    configure:2551: checking for cc
    configure:2598: result: no
    configure:2654: checking for cl.exe
    configure:2684: result: no
    configure:2708: error: in `/usr/motion-20140827-051001':
    configure:2711: error: no acceptable C compiler found in $PATH
    See `config.log' for more details

    etc.....


    ¿Me puedes exar una mano?

    Un saludo y buenas noches

    ResponderEliminar
    Respuestas
    1. Hola, vayamos por partes.

      El que se vean las capturas con los colores cambiados no creo que tenga porque ser problema de motion. Puede que incluso sea problema del driver de la webcam.

      ¿Tienes la posibilidad de montar la cámara con motion sobre un PC con Linux, para ver si alli también produce el problema de los colores?.

      En cuanto a compilar la última versión de motion dentro de OpenWRT es una tarea bastante complicada, ya que los programas necesarios no están en OpenWRT y aunque estuvieran se necesita bastante espacio en disco y un procesador bastante mas potente que el que trae el router, Si quieres compilar algo para OpenWRT lo normal es hacerlo desde un PC con LInux, en lo que se llama "compilación cruzada", ya que compilarás en un PC algo que se va a ejecutar sobre un hardware totalmente distinto, como es un router con OpenWRT. Aqui viene el tutorial oficial: http://wiki.openwrt.org/doc/devel/crosscompile

      Otra cosa mas que puedes probar: no se si sabes que motion tiene un interfaz web que te permite acceder a la cámara con un navegador y ver que está capturando, asi como controlar manualmente cosas como el brillo, tono, y otros diversos parámetros de la misma. Puede que jugando con dichos parámetros des con la configuración adecuada para ver bien las imagenes. En este enlace: http://marc.merlins.org/linux/motion.conf verás opciones en los apartados "Live Webcam Server" y "HTTP based control" sobre como configurarlo. Luego, una vez activado puedes acceder poniendo en el navegador web la url:

      http://ip-del-router:8888

      o

      http://ip-del-router:8889

      Y desde alli tocar la configuración del video y ver en tiempo real lo que ve la cámara.

      Ya me contarás.








      Eliminar
  2. Hola, de entrada estupendo trabajo, tengo un route hg556a y le tengo instalado openwrt, he seguido todos los paso pero al llegar a " fswebcam --scale "320x240" "snapshot-1.jpg" ", tengo problemas, aqui la lista de dispositivos,

    root@OpenWrt-102:~# lsusb
    Bus 002 Device 002: ID 093a:2460 Pixart Imaging, Inc. Q-TEC WEBCAM 100
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    root@OpenWrt-102:~#

    el siguiente paso me devuelve esto

    root@OpenWrt-102:~# lsmod | grep uvc
    input_core 24633 4 uvcvideo
    usbcore 112149 5 uvcvideo
    uvcvideo 61144 0
    videobuf2_core 22473 1 uvcvideo
    videobuf2_vmalloc 2849 1 uvcvideo
    videodev 81880 3 uvcvideo
    root@OpenWrt-102:~#

    Hasta ahora todo parece que discurre correctamente.
    Siguiente paso

    root@OpenWrt-102:~# ls /dev/video0
    ls: /dev/video0: No such file or directory
    root@OpenWrt-102:~#

    a pesar de esto ejecuto las siguientes ordenes

    root@OpenWrt-102:~# opkg install fswebcam
    Package fswebcam (20110717-1) installed in root is up to date.
    root@OpenWrt-102:~# ls /dev/video0
    ls: /dev/video0: No such file or directory
    root@OpenWrt-102:~# fswebcam --scale "320x240" "snapshot-1.jpg"
    --- Opening /dev/video0...
    stat: No such file or directory
    root@OpenWrt-102:~# ls /dev/video0
    ls: /dev/video0: No such file or directory
    root@OpenWrt-102:~#

    Como mis conocimientos de linux son extremadamente escasos, me encuentro totalmente atascado, espero puedas ayudarme, este proyecto creo que es sumamente interesante y me gustaria poder llevarlo acabo, mi agradecimiento de antemano.

    ResponderEliminar
    Respuestas
    1. Hola, buenas, me alegro de que te resulte interesante este trabajo, a mi me gustó mucho realizarlo.

      El problema que tienes es que no existe el dispositivo /dev/video0, que es el que permite acceder a la cámara.

      La causa es que la cámara que tienes (093a:2460) no está soportada por el driver uvcvideo. Buscando aquí:

      https://github.com/openwrt/bcm63xx-next/blob/master/Documentation/video4linux/gspca.txt

      Verás que:

      pac207 093a:2460 Qtec Webcam 100

      Es decir, tu cámara está soportada por el driver pac207. ¿Existe ese driver?, si hacemos

      opkg update; opkg list | grep pac207

      Veremos que sale al final:

      kmod-video-gspca-pac207 - 3.10.49-1 - The Pixart PAC207 USB Camera Driver (pac207) kernel module

      Por tanto el driver está en el paquete: kmod-video-gspca-pac207, que es el que debes instalar con

      opkg install kmod-video-gspca-pac207

      El paquete kmod-video-uvc casi seguro que puedes quitarlo, pero tampoco pasa nada porque lo dejes por si en el futuro pones otra cámara.

      Después de instalado el paquete nuevo, reinicia y haz:

      ls /dev/video*

      A ver si ya te sale un dispositivo de video para manejar.

      No olvides contarme el resultado.

      Salud.

      Eliminar
  3. Hermano saludos excelente trabajo, una pregunta pero el vídeo en streaming puede verse a través de internet o hay que estar en la misma red wan??

    ResponderEliminar
    Respuestas
    1. Se puede ver a través de internet, pero hay que abrir los puertos en tu router para ello y redirigirlos hacia la IP del openwrt. Es mas o menos como cuanod abres los puertos para el torrent, el emule o los juegos.

      Eliminar