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:~# 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"
root@OpenWrt:~#
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......
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:
ResponderEliminarroot@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
Hola, vayamos por partes.
EliminarEl 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.
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,
ResponderEliminarroot@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.
Hola, buenas, me alegro de que te resulte interesante este trabajo, a mi me gustó mucho realizarlo.
EliminarEl 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.
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??
ResponderEliminarSe 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