viernes, 17 de noviembre de 2023

Cámara 4G y WiFi con Raspberry Pi

Con una placa Raspberry Pi, una cámara y un módem podemos montar una cámara con acceso remoto mediante conexión móvil o WiFi. Podemos usar una cámara que se conecte al puerto CSI de la placa o cualquier cámara USB. Además podemos usar una cámara infrarroja para ver en la oscuridad. Para la conexión móvil se puede usar un módem en placa "HAT" o conectado por USB. La placa Raspberry PI se puede alimentar mediante un adaptador de corriente USB, una placa "HAT" con batería o una batería externa.

Las placas "HAT" tienen la ventaja de una mayor integración con la placa Raspberry Pi, lo que permite un mayor control. Pero su gran desventaja es que no se pueden usar con otro tipo de aparatos. Con los dispositivos USB pasa lo contrario, la integración y control es menor pero los podemos usar con otros aparatos.

Como no necesitaba mucho control sobre los dispositivos y me interesaba poder usarlos con otros aparatos, opté por comprar un módem USB que pudiera utilizar también en el ordenador portátil y una batería externa que me sirviera para cargar móviles. Si queremos tener control sobre la carga de la batería, el corte de la corriente eléctrica o la conexión móvil necesitaremos usar placas "HAT". Como no encontré una cámara USB infrarroja de tamaño reducido y no tenía interés en usarla en otro aparato, opté por una cámara conectada al puerto CSI. Esta cámara tiene dos luces infrarrojas, una a cada lado, para iluminar las cosas que tienen poca temperatura y por tanto emiten poca luz infrarroja.

El sistema operativo de la placa Raspberry Pi se instala en una tarjeta micro SD. En un ordenador portátil o torre debemos tener un dispositivo de lectura/escritura de este tipo de tarjetas para realizar la instalación. Una vez instalado y configurado se introduce la tarjeta en la placa Raspberry Pi y es posible arrancar el sistema.

Para instalar el sistema operativo en la tarjeta podemos utilizar la aplicación RPI Imager o grabar la imagen manualmente. El sistema operativo está basado en Debian y hay disponibles diferentes versiones. Como no es necesario que la cámara tenga escritorio y el procesador es de 64 bits podemos usar la versión Lite de 64 bits. A continuación se muestra la descarga, descompresión y copia de la imagen a la tarjeta de forma manual.

# wget https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2023-10-10/2023-10-10-raspios-bookworm-arm64-lite.img.xz

# unxz 2023-10-10-raspios-bookworm-arm64-lite.img.xz

# cp 2023-10-10-raspios-bookworm-arm64-lite.img /dev/mmcblk0

Para que podamos acceder remotamente al sistema es necesario activar el servidor SSH en el programa de instalación o manualmente creando un archivo con nombre ssh en la partición bootfs. En la instalación manual, después de grabar la imagen, puede ser necesario sacar y volver a introducir la tarjeta micro SD para que el sistema operativo detecte y monte sus particiones.

# touch /media/usuario/bootfs/ssh

En versiones anteriores del sistema operativo se podía acceder mediante SSH usando el usuario "pi" y la contraseña "raspberry". Ahora es necesario crear un usuario y contraseña con el programa de instalación o asignar una contraseña al usuario "pi" manualmente editando el archivo /etc/shadow. Para crear la contraseña encriptada podemos usar el comando openssl.

# openssl passwd -6

Password: 
Verifying - Password: 
$6$ZFQQ/phLIOpTvfoX$SNULKfhy01CI9YEyk863qQFRQoimCE8LujmK6rHXkpS5VkJLSbDIz3VX8c7gPAvTRNGRoqYZ5cjDZNpK4biEi0

# vi /media/usuario/rootfs/etc/shadow

pi:$6$ZFQQ/phLIOpTvfoX$SNULKfhy01CI9YEyk863qQFRQoimCE8LujmK6rHXkpS5VkJLSbDIz3VX8c7gPAvTRNGRoqYZ5cjDZNpK4biEi0:19640:0:99999:7:::

Una vez instalado y configurado el sistema operativo podemos introducir la tarjeta micro SD en la placa Raspberry Pi y arrancar. Si la conectamos por Ethernet a nuestra red recibirá una dirección IP mediante DHCP. Podemos buscar esta dirección con el comando nmap y usarla para conectar por SSH y manejar el sistema como cualquier otro dispositivo con Debian.

Si no necesitamos conexión móvil podemos prescindir del módem y usar las conexiones Ethernet y WiFi de la placa. Si en la red Ethernet disponemos de PoE podemos usarlo para alimentar la placa Raspberry Pi mediante un placa "HAT".

# nmap -sP 192.168.1.0/24

Starting Nmap 7.93 ( https://nmap.org ) at 2023-10-27 17:26 CEST

...

Nmap scan report for 192.168.1.40
Host is up (0.0030s latency).
MAC Address: E4:5F:01:E7:9B:F7 (Raspberry Pi Trading)

...

Nmap done: 256 IP addresses (3 hosts up) scanned in 2.23 seconds

# ssh -l pi 192.168.1.40

El módem 4G que yo compré funciona como un router WiFi. En el ordenador donde se conecta por USB aparece como un dispositivo de red y al arrancar crea una red WiFi a la que se puede conectar cualquier dispositivo. La configuración se realiza como cualquier router WiFi, se conecta con un navegador web a su dirección IP y se configura mediante un interfaz web.

# firefox 192.168.8.1

Para poder conectar a la placa Raspberry Pi remotamente debemos conectar el módem/router a uno de sus puertos USB. Como el dispositivo funciona como un router, para cada servidor de la placa al que queramos acceder remotamente es necesario hacer una redirección de puertos. Para configurar la redirección de puertos en el módem/router es necesario que en el sistema operativo de la placa el dispositivo de red que proporciona el módem/router tenga una dirección IP estática. Podemos asignar esta dirección estática en la configuración de red del sistema operativo o en el módem/router. En la configuración DHCP del módem/router se puede asignar la dirección a la MAC del dispositivo de red. Si queremos acceder remotamente por SSH es necesario hacer una redirección de puertos de este servidor.

# ip link show

4: usb0:  mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 42:a6:05:aa:ae:89 brd ff:ff:ff:ff:ff:ff
Configuración DHCP
------------------
42:A6:05:AA:AE:89 -> 192.168.8.2

Redirección de Puertos
----------------------
22 -> 192.168.8.2:22

Para que el módem/router pueda realizar la conexión móvil es necesario introducirle una tarjeta SIM de cualquier operador. Para no tener que introducir el código PIN cada vez que iniciemos el sistema podemos deshabilitar la protección por código PIN.

Algunos operadores utilizan en las conexiones a Internet CG-NAT. Si la conexión se realiza con este sistema compartiremos la misma dirección IP con otros usuarios y no podremos conectar remotamente a la placa. Es necesario que se nos asigne una dirección IP para nosotros solos aunque sea dinámica. En algunos operadores el uso de CG-NAT depende del Nombre de Punto de Acceso que utilicemos para la conexión y se puede configurar en el módem/router.

APN: movistar.es
Usuario: movistar
Contraseña: movistar

Para poder ver la imagen de la cámara y además tener un sistema de detección de movimiento podemos usar el software Motion. Este software tiene un interfaz web y toma varias capturas de imagen por segundo y analiza los cambios entre ellas para valorar si ha habido movimiento. En el archivo de configuración /etc/motion/motion.conf se pueden modificar varios parámetros para adaptarlos al tipo de imagen y movimientos que queremos captar. Si es importante que solo nosotros podamos ver la cámara se puede asegurar la conexión con TLS y usar autenticación con usuario y contraseña. Motion usa un puerto para la interfaz web y otro para la transmisión de las imágenes. En el módem/router debemos configurar una redirección de esos puertos para poder acceder a través de Internet.

# Ancho de imagen en puntos.
width 320

# Alto de imagen en puntos.
height 240

# Máximo número de imágenes a capturar por segundo.
framerate 15

# Umbral para el número de puntos modificados que activan la detección de movimiento.
threshold 250

# Puerto de control web.
webcontrol_port 8080

# Restringir conexiones a localhost.
webcontrol_localhost off

# Método de autenticación para control web.
webcontrol_auth_method 0

# Cadena de autenticación para control web. Sintaxis usuario:contraseña
; webcontrol_authentication value

# Usar TLS para control web.
webcontrol_tls off

# Certificado para TLS.
; webcontrol_cert value

# Clave para TLS.
; webcontrol_key value

# Número de puerto para la transmisión de la imagen.
stream_port 8081

# Restringir transmisión de la imagen a localhost.
stream_localhost off

# Método de autenticación para transmisión de la imagen.
stream_auth_method 0

# Cadena de autenticación para transmisión de imagen. Sintaxis usuario:contraseña
; stream_authentication value

# Usar TLS para la transmisión de la imagen.
stream_tls off

Al ejecutar Motion la conexión de este software con la cámara no funcionó. Tanto en la salida de dmesg como en el archivo "log" pude ver varios errores. Para solucionarlos tuve que activar el software de cámara antiguo con el programa raspi-config y reiniciar el sistema operativo.

# cat /var/log/motion/motion.log

v4l2_fps_set: Error setting fps. Return code -1
v4l2_mmap_set: Error starting stream. VIDIOC_STREAMON: Invalid argument
vid_start: V4L2 device failed to open
Retrying until successful connection with camera

# dmesg

unicam fe801000.csi: Failed to start media pipeline: -22

# raspi-config nonint do_legacy 0

Si estamos usando una batería para alimentar la placa debemos tener en cuenta que cuanto más hagamos trabajar al programa más energía gastará la placa y menos durará la carga de la batería. Yo para gastar poca energía lo configuré para capturar imágenes pequeñas de solo 320x240 puntos y detectar movimiento a partir de 250 puntos modificados. Si no es importante que otras personas puedan ver la imagen podemos ahorrar energía no usando TLS. Cuanto más trabaje el programa también se calentará más el procesador y es posible que necesitemos ponerle algún sistema de refrigeración. Si la cámara incluye luces infrarrojas es posible que podamos regular su intensidad para que consuman menos energía.

Motion se puede configurar para que al detectar un movimiento guarde imágenes y vídeos de lo sucedido. También es posible ejecutar una acción, como por ejemplo enviar una imagen o un vídeo por correo electrónico. Si nuestro módem lo permite podemos enviar un mensaje SMS. De esta forma podemos recibir notificaciones de las detecciones de movimiento.

# Creación de vídeos de eventos de movimiento.
movie_output on

# Máxima duración de vídeos en segundos.
movie_max_time 60

# Contenedor a usar en el vídeo.
movie_codec mp4

# Grabación de imágenes cuando se detecta movimiento.
picture_output first

Hace décadas era muy fácil enviar un correo electrónico a cualquier dirección desde cualquier ordenador. En la actualidad para minimizar los problemas de la publicidad no deseada y las estafas se ha restringido mucho el envío de correo electrónico. Si queremos enviar un correo electrónico desde la cámara podemos enviarlo a través de un "smarthost" o utilizar una cuenta de correo usando un cliente como s-nail.

# vi /etc/s-nail.rc

account cuenta-camara {
    set v15-compat
    set smtp-use-starttls
    set tls-verify=ignore
    set smtp-auth=login
    set mta=smtp://cuenta-camara:contraseña@servidor:587
    set from="cuenta-camara@example.com"
}

Una vez configurado el cliente de correo podemos configurar Motion para enviar correos al producirse un evento. Yo lo configuré para guardar la primera imagen del movimiento y enviarla por correo electrónico. Motion permite utilizar en las acciones variables como la fecha y hora actual.

picture_output first

on_picture_save echo "MD %Y-%m-%d %T-%q" | s-nail -A cuenta-camara -s "MD %Y-%m-%d %T-%q" -a %f usuario@example.com

Si no disponemos de una dirección IP estática en la conexión móvil podemos usar DNS dinámico para asignarle un nombre de equipo y dominio accesible en Internet. Es necesario crear un registro dinámico en un servidor DNS y actualizarlo con un cliente como DDClient. Este software permite averiguar la dirección IP pública y comunicársela al servidor DNS de diferentes formas. Por ejemplo en el caso de utilizar un módem/router la dirección pública se averigua visitando una web. En el archivo /etc/ddclient.conf se debe añadir la configuración necesaria para nuestro tipo de conexión y servidor DNS.

protocol=noip
use=web
web=noip-ipv4
login=usuario
password=contraseña
camara.example.com

Como contenedor de los componentes podemos usar una de las múltiples carcasas que hay para las placas Raspberry Pi. Hay disponibles carcasas ya fabricadas y diseños para impresora 3D. Otra posibilidad es utilizar una caja de conexiones y fijar los componentes mediante bridas o pegamento.

Si el adaptador de corriente o la batería externa no tiene interruptor podemos añadir un cable USB con interruptor. Antes de cortar la corriente con el interruptor debemos apagar el sistema operativo con el comando shutdown. A este comando se le puede pasar como parámetro los minutos que debe esperar antes de apagar el sistema. Si es posible calcular cuantos minutos dura la carga de la batería podemos programar el apagado para que se produzca antes del agotamiento de la carga y el apagado repentino de la placa por falta de energía. Para controlar la carga de la batería y el corte de la corriente desde el sistema operativo es necesario alimentar la Raspberry Pi con una placa "HAT".

# shutdown +1080

Shutdown scheduled for Mon 2023-11-20 09:30:47 GMT, use 'shutdown -c' to cancel.

Esta es una de las posibles formas de crear una cámara con acceso remoto. Dependiendo de lo que necesitemos hay muchas posibles combinaciones de hardware, software, conexiones de red y sistemas de alimentación. Si tienes cualquier duda o sugerencia puedes dejar un comentario.

No hay comentarios:

Publicar un comentario