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......