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

lunes, 2 de marzo de 2015

Montemos una webcam IP barata (I)

El reto que tengo ahora es montar un sistema de videovigilancia con una cámara IP con elementos baratos o de desecho. El objetivo es:

  • Un sistema de vigilancia conectado a internet por wifi, cable o incluso 3G.
  • Que tenga posibilidad de grabar imágenes en un almacenamiento remoto (por ejemplo, un servidor).
  • Que tenga detección de movimientos.
  • Que tenga la posibilidad de mandar avisos por correo electrónico (o SMS, twitter, ...).

El hardware del que dispongo es mínimo:

  • Un router ADSL que permita instalar OpenWrt una distribución de Linux embebido para routers. En mi caso es un Huawei HG556a ofrecido por el ADSL de Vodafone que me dieron porque estaba muerto de risa en un trastero. Elegí este router por la facilidad con la que se instala OpenWrt en él (era mi primera vez con OpenWrt) y porque tiene muchas posibilidades de conectividad: 2 puertos USB, interfaz ethernet e interfaz wifi.

 

  • Una webcam USB barata de DealExtreme. En mi caso salió gratis ya que cuando me la enviaron no funcionaba (mostraba la imagen negra), asi que reclamé y me enviaron otra gratis. Al poco tiempo un usuario de DX me dijo que probase a desmontar la carcasa, lo hice y empezó a funcionar: se había desencajado por dentro y la lente del objetivo no apuntaba hacía donde debía.

Vamos a ver los pasos a seguir:

1. Instalación de OpenWrt.

Lo primero es confirmar que el router es compatible con OpenWrt, confirmándolo en la página correspondiente http://wiki.openwrt.org/toh/huawei/hg556a.

Lo segundo es saber que versión del router tenemos para descargar la imagen adecuada. En este caso se hace mirando el número de serie, en mi caso es: N/S: 30692100.... Cotejando este número en el enlace exterior veo que el modelo exacto del router es:

HG55VDFA VER.C
HG556BVDFA - HG556(B)VDFA
Wifi: Atheros AR9223
OpenWrt file (≥CC) Ver. B.

Mirando en http://wiki.openwrt.org/toh/huawei/hg556a, vemos que hay 2 opciones para instalar:

  • La versión estable, llamada Barrier Breaker.
  • La versión de testing correspondiente al la versión B de nuestro router, del snapshot diario.

Nos decantamos por la versión estable, que descargamos del enlace anterior. Para instalar seguimos estos pasos:

    • Poner en nuestro PC una direccion IP fija, la 192.168.1.35 y conectarlo por cable ethernet al router.
    • Desconectar el router de la corriente.
    • Pulsar el botón RESTART del router. Mantenerlo apretado.
    • Conectar el router a la corriente.
    • Esperar 12 segundos o más.
    • Soltar el botón del router.
    • En el navegador de nuestro PC, ir a http://192.168.1.1. Esa es la página para cargar un nuevo firmware.
    • Seleccionar el archivo .bin bajado anteriormente.
    • Seleccionar "Update Software" para iniciar el proceso de cambio del firmware.
    • Esperar a que reinicie.
    • Hacer
                # telnet 192.168.1.1

     para entrar en el router. La primera tarea es cambiar la contraseña de root con:

                root@OpenWrt:/# passwd
    • Despues de esto, podremos entrar con
                # ssh root@191.168.1.1

Con esto ya tenemos un Linux funcional con un conjunto de paquetes básicos para trabajar. Existe un interface web de configuración llamado Luci, al que podremos acceder desde el navegador en http://192.168.1.1 o la IP que posteriormente pongamos a nuestro router.

En otros router el proceso de instalación es bastante mas costoso, necesitando abrir el router y conectar un adaptador USB-TTL-serie  al puerto serie de la placa  y dar ordenes por terminal desde el programa minicom, o incluso usando soldaduras de pines y cables para acceder al puerto serie o JTAG  y escribir esotéricas ordenes de actualización del CFE (la BIOS del router) para permitir cambiar el bootloader e instalar nuevos firmwares. Por dicho motivo este router concreto es ideal para iniciarse en OpenWrt: simplemente actualizar el firmware por su página de configuración web.

Conector serie del router:

Conector JTAG del router:

2. Configuración inicial.

Bueno, ya estamos en Linux y nos sentimos como en casa, vamos a ir configurando lo básico del sistema. Podríamos usar la interfaz web Luci para la mayoría de las opciones, pero vamos a hacerlo por línea de comandos para saber mejor que pasos damos, así que hacemos un ssh a root@192.168.1.1. Lo primero es actualizar los repositorios de paquetes (esto hay que hacerlo cada vez que reiniciemos el router, ya que se guardan en memoria RAM).

Vemos los repositorios:

root@OpenWrt:/# cat /etc/opkg.conf

dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz barrier_breaker_base http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/base
src/gz barrier_breaker_luci http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/luci
src/gz barrier_breaker_packages http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/packages
src/gz barrier_breaker_routing http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/routing
src/gz barrier_breaker_telephony http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/telephony
src/gz barrier_breaker_management http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/management
src/gz barrier_breaker_oldpackages http://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages

Si tenemos la versión testing, deberá ser:

root@OpenWrt:/# cat /etc/opkg.conf

dest root /
dest ram /tmp
lists_dir ext /var/opkg-lists
option overlay_root /overlay
src/gz barrier_breaker_base http://downloads.openwrt.org/snapshots/trunk/brcm63xx/generic/packages/base/
src/gz barrier_breaker_luci http://downloads.openwrt.org/snapshots/trunk/brcm63xx/generic/packages/luci
src/gz barrier_breaker_packages http://downloads.openwrt.org/snapshots/trunk/brcm63xx/generic/packages/packages
src/gz barrier_breaker_routing http://downloads.openwrt.org/snapshots/trunk/brcm63xx/generic/packages/routing
src/gz barrier_breaker_telephony http://downloads.openwrt.org/snapshots/trunk/brcm63xx/generic/packages/telephony
src/gz barrier_breaker_management http://downloads.openwrt.org/snapshots/trunk/brcm63xx/generic/packages/management

Actualizamos la lista de paquetes e instalamos nano para tener un editor de textos posterior a la Constitución en vigor.

root@OpenWrt:/# opkg update
root@OpenWrt:/# opkg install nano

Ahora configuramos una IP fija en la tarjeta eth0, para integrarlo en nuestra red:

root@OpenWrt:/etc/config# nano /etc/config/network 

    config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

    config globals 'globals'
        option ula_prefix 'fd58:01a4:b44f::/48'

    config interface 'lan'
        option ifname 'eth0.1'
        option force_link '1'
        option type 'bridge'
        option proto 'static'
        option netmask '255.255.255.0'
        option ip6assign '60'
        option ipaddr 'IP-FIJA-DEL-ROUTER'
        option gateway 'GATEWAY-DE-LA-RED'
        option broadcast 'BROADCAST-DE-LA-RED'
        option dns 'IP-DNS-DE-LA-RED 8.8.8.8'

    config switch
        option name 'eth0'
        option reset '1'
        option enable_vlan '1'

    config switch_vlan
        option device 'eth0'
        option vlan '1'
        option ports '0 1 2 3 4 5t'

Configuramos las DNS en resolv.conf:

root@OpenWrt:/# rm /etc/resolv.conf
root@OpenWrt:/# echo "search midominio
> nameserver IP-DNS-DE-LA-RED
> nameserver 8.8.8.8" > /etc/resolv.conf
root@OpenWrt:/# cat /etc/resolv.conf
search minominio
nameserver IP-DNS-DE-LA-RED
nameserver 8.8.8.8
root@OpenWrt:/#

Definimos bien la TimeZone para poner la hora correcta con el cliente ntp instalado:

root@OpenWrt:~# nano /etc/config/system 

config system
    option hostname 'OpenWrt'
    option zonename 'Europe/Madrid'
    option timezone 'CET-1CEST,M3.5.0,M10.5.0/3'

config timeserver 'ntp'
    list server '0.openwrt.pool.ntp.org'
    list server '1.openwrt.pool.ntp.org'
    list server '2.openwrt.pool.ntp.org'
    list server '3.openwrt.pool.ntp.org'
    option enabled '1'
    option enable_server '0'
............
............
............

Tras esto, reiniciamos el router con reboot y cuando esté de nuevo operativo entramos por ssh root@IP-DEL-ROUTER.

3. Por si metemos la pata: actualizaciones posteriores del firmware.

Una vez instalado OpenWrt, la recuperación/actualización del firmware si rompemos algo es ya mucho mas sencilla.

Primero editamos /etc/sysupgrade.conf y añadimos los ficheros que queremos preservar en caso de instalar de nuevo el firmware, para evitar tener que configurar todo posteriormente otra vez:

root@OpenWrt:~# nano /etc/sysupgrade.conf
## This file contains files and directories that should
## be preserved during an upgrade.

# /etc/example.conf
# /etc/openvpn/

/etc/sysupgrade.conf
/etc/resolv.conf
/etc/sysctl.conf
/etc/rc.local
/etc/profile
/etc/passwd
/etc/firewall.user
/etc/dropbear/dropbear_rsa_host_key
/etc/dropbear/dropbear_dss_host_key
/etc/config/wireless
/etc/config/system
/etc/config/network
/etc/config/firewall
/etc/config/dropbear
/etc/config/dhcp

A continuación descargamos el firmware y lanzamos su instalación:

root@OpenWrt:~# cd /tmp
root@OpenWrt:/tmp# wget https://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/openwrt-HW556-squashfs-cfe.bin
root@OpenWrt:~# sysupgrade -v /tmp/openwrt-HW556-squashfs-cfe.bin

Tras un rato el router reinicia y ya tenemos el sistema como nuevo pero conservando los ficheros indicados.

NOTA: si sucede algo catastrófico y el router no arranca bien y no responde a nuestros ping, siempre se puede recurrir al modo de rescate (parecido al modo rescate de un Linux normal, con un montón de funciones capadas pero al que podemos acceder por la IP 192.168.1.1 y dar algunas órdenes)

  • Poner en nuestro PC una direccion IP fija, la 192.168.1.35 y conectarlo por cable ethernet al router.
  • Desconectar el router de la corriente.
  • Conectarlo de nuevo y pulsar el botón RESTART compulsivamente mientras se enciende.
  • El sistema arranca en modo rescate, lo sabemos porque el led de encendido parpadea furiosamente.
  • Poner el .bin de la imagen en el directorio /tmp de nuestro PC
  • Hacer
        root@(none):~# ssh root@192.168.1.1

  • Traernos el .bin de la imagen a /tmp
       root@(none):~# cd /tmp
       root@(none):/tmp# scp root@192.168.1.35:/tmp/openwrt-HW556-squashfs-cfe.bin .

  • Reinstalar:
       root@(none):/tmp# sysupgrade -v openwrt-HW556-squashfs-cfe.bin

con estos pasos he podido retomar el control de la situación cuando la he liado parda mientras enredaba probando cosas.

Bueno, pues en este punto tenemos un sistema OpenWrt actualizado, integrado dentro de nuestra red local y listo para conectar nuestra cámara USB y empezar a capturar imágenes, cosa que haremos en la siguiente entrada.....

4 comentarios:

  1. Buenas noches, me parecen increibles los pedazos de posts que has realizado. Llevo casi 2 años con OpenWRT sobre todo para usarlo como repetidor WiFi principalmente, y recientemente para DLNA, UPnP, Samba. Tenía pendiente esto de la Webcam tengo una "Logitech, Inc. QuickCam Express".

    Estoy tratando de hacerlo siguiendo tus pasos, pero me encuentro nada más empezar con estos problemas:

    Quise conectarme como cliente WiFi a mi router principal, pero no están los drivers WiFi o no he consegido activarlo ni por Luci, ni con los comandos por SSH de UCI.

    Si el router Openwrt no tiene internet como va a instalar el nano? ...Bueno, otra opción es meterlo por ethernet al router principal con una IP fija para no perderlo de vista y desde ahí seguir pa lante digo yo (se nota que me falta 0 para irme a sobar no?)

    Si ves que ese sería el camino, dímelo please, y también cual sería para instalar el WiFi, quiero poner el router con la webcam por WiFi al router principal.

    Un saludo y muchas gracias por todo.

    ResponderEliminar
    Respuestas
    1. Hola, Eduardo. Me alegro de que te resulte interesante el tema. Te contesto por partes:

      1) Durante la configuración de todo si es conveniente tener el router conectado por cable con ip fija. esta manera instalo nano y cualquier otra cosa rápidamente. Luego, cuando todo funcione ya tendrás tiempo de configurarlo como cliente inalámbrico.

      2) Sobre la cámara, lo mejor es que te instales el paquete usbutils en el router y hagas "lsusb" en terminal con la cámara conectada al puerto usb. Eso te dará el identificador USB de la cámara, que en tu caso probablemente sea 046d:0840. En https://github.com/openwrt/bcm63xx-next/blob/master/Documentation/video4linux/gspca.txt podrás ver que está soportada, seguramente baste con instalar el paquete kmod-video-gspca-stv06xx y reiniciar el router para que la detecte y aparezca /dev/videoX.

      3) Sobre la configuración inalámbrica, necesitaría saber que router tienes y que version de Openwrt está instalado, para ver si soporta modo cliente inalámbrico. Además, si haces un "ifconfig" debería listarte los interfaces de red, entre ellos la tarjeta inalámbrica. Idém con "iwconfig" que es el comando para configurar la conexión inalámbrica que tendrás despues de instalar el paquete "wireless-tools".

      Bueno, pues ya me cuentas que te va saliendo.





      Eliminar
  2. Buenas noches, a estas altas horas de la noche para variar. Gracias por responderme. He estado a pico y pala y ya conseguí sacar fotos, Yiiiiiiiiijaaaaa !!!!!!. A ver cuento, tuve varios problemas pero ya los solventé, los comento por si le pasa a alguien:


    El lsusb daba fallo:

    root@OpenWrt:~# lsusb
    unable to initialize libusb: -99

    Así que desinstalé el usbutils y en vista de que me nombró el libusb, este lo desinstalé y volví a instalar ambos, también por si acaso el libusb-compat, que no sé su exacto cometido por la descripción del paquete, pero bueno por si le sumase mejoras al libusb. Como siempre suelo reiniciar cada vez que instalo algo.

    Pasé a instalar lo dicho por tí en el siguiente post (con todo correcto):

    opkg install usbutils kmod-usb2 kmod-usb-core kmod-usb-ohci kmod
    -usb-uhci kmod-video-uvc


    Webcam detectada:

    root@OpenWrt:~# lsusb
    Bus 002 Device 002: ID 0424:2502 Standard Microsystems Corp.
    Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
    Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 003: ID 046d:0928 Logitech, Inc. QuickCam Express
    root@OpenWrt:~# reboot

    Pasé a continuar con los siguientes comandos:

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

    Instalé el driver de la webcam que no era y me daba fallos, fue poner su ID 046d:0928 Logitech, Inc. QuickCam Express, instalé su driver kmod-video-gspca-spca561 (The SPCA561 USB Camera Driver (spca561) kernel module) vía LUCI y funcionó.

    ==============================================
    Estos fueron los fallos al instalar el driver que no era:

    He mirado con el WinSCP la carpeta DEV y no existe tampoco ninguna otra carpeta /dev/videoX

    root@OpenWrt:~# ls /dev/video0
    ls: /dev/video0: No such file or directory
    root@OpenWrt:~# opkg update; opkg install fswebcam


    Traté de sacar la foto, y obviamente al no estar el directorio pues salió esto:

    root@OpenWrt:~# fswebcam --scale "320x240" "snapshot-1.jpg"
    --- Opening /dev/video0...
    stat: No such file or directory

    Absurdamente creé el directorio "video0" en /dev/ (/dev/video0) y con lo poco que sé de Linux me imagino esto es un link a un dispositivo, no a una carpeta en si, pero tampoco lo sé, la cosa es que obviamente no pudo sacar la foto:

    root@OpenWrt:~# fswebcam --scale "320x240" "snapshot-1.jpg"
    --- Opening /dev/video0...
    Trying source module file...

    Y ahí se quedó colgado...
    =====================================

    Por si le sucedía a alguien el aplicar un driver erroneo que viera los fallos.

    Un saludo y ya mñn sigo tus 3 magníficos post....te saliste en serio.

    Aquí un link a la carpeta con el par de fotos (tengo el router en otro cuarto y la cámara tiene enfoque...de ahí que no puedo ajustarlo a estas horas)

    https://www.dropbox.com/sh/t2tm7n5rtdq6zbc/AABcAd_3Bm0lhoDE9SBiIySEa?dl=0

    ResponderEliminar
  3. Me alegro de que ya funcione, una vez tengas conectado el router como cliente inalambrico del router principall ya no deberías tener ningún problema con el resto de configuraciones.

    ResponderEliminar