Cámara IP
Es un dispositivo que nos permite ver remotamente imágenes a tiempo real de cualquier sitio donde dispongamos de una conexión a Internet.
Alimentación
Aparte de la alimentación directa con un enchufe, algunas cámaras las podemos alimentar mediante el propio cable de Ethernet usando un POE (Power Over Ethernet). También hay cámaras IP con batería.
Internet
La conexión de la cámara a Internet es mediante wifi o cable Ethernet. Como hay routers con tarjeta sim 4G/LTE con batería, podemos decir que podemos poner la cámara, al menos mientras duren las baterías, en cualquier lugar.
Aplicaciones
Estas cámaras normalmente vienen con aplicaciones para móviles que utilizan conexiones P2P para simplificar la configuración a nivel de usuario. También podemos usar aplicaciones como iSpy o Blue Iris en ordenadores convencionales.
Seguridad
Las conexiones a la cámara pasan por un servidor remoto. Aparte, las App que usamos en nuestro móvil para visualizarlas nos piden habilitar el acceso a todo, incluso a la cámara del móvil para leer el código QR. Muy seguro no parece. Depende de la confianza que nos inspire la compañía que las fabrica y su equipo técnico.
Además, en muchos casos no hay una capa segura TLS y toda la información, incluidos los passwords, viajan sin encriptar, dejando la puerta abierta a los hackers.
Maneras de mejorar la seguridad |
---|
Con fabricantes reputados |
Usando cámaras IP con TLS |
Negando a la App el acceso a nuestro móvil |
Cambiando el password que viene por defecto |
Conectándolas a Ethernet, no a WiFi. |
Usándolas sólo dentro de la LAN |
Usando una VPN (Virtual Private Network) en caso de acceso remoto |
No usando cámaras en zonas sensibles |
Teniendo el firmware actualizado |
MAC - Media Access Control
Es un identificador único e invariable asociado a cada dispositivo conectado a Internet. El Mac nos permite reconocer los diferentes dispositivos en nuestras redes locales.
Formato MAC:
donde H es un hexadecimal entre 1 y F.
IPv4 - Internet Protocol version 4
Cada dispositivo conectado a Internet se le asocia una dirección IP fija o dinámica. Como el Protocolo de Internet versión 4 no tiene suficientes direcciones para todos los dispositivos conectados a Internet, hay unos rangos de direcciones que son privadas y se pueden repetir en diferentes redes locales. Así nuestros routers incluyen NATs que enlazan las direcciones IP privadas y públicas.
Formato IPv4 (2^32 direcciones):
donde d es un decimal entre 1 y 255.
Formato IPv6 (2^128 direcciones):
donde H es un hexadecimal entre 1 y F.
Puerto
Las diferentes aplicaciones o servicios de un dispositivo que se conectan a Internet con una dirección IP se les asocia un puerto para reconocerlas.
NAT - Network Address Translation
El router que tiene asociada una dirección IP pública, tiene diferentes dispositivos conectados a los que asocia una dirección IP privada.
El NAT, que forma parte del router, asocia un puerto público de salida a cada conexión hacia el exterior de cada aplicación (Puerto privado) de cada dispositivo (IP privada) conectado al router.
El NAT no responde ninguna conexión exterior (IP pública, Puerto público) que no haya tenido previamente una salida. O sea, un servidor no puede enlazar con el cliente si este antes no se lo pide.
P2P - Peer to Peer
P2P es una conexión directa de dos aplicaciones (Puerto) de dos dispositivos (IP) sin intermediarios.
Las cámaras IP y sus aplicaciones hacen conexiones P2P pero como no saben si están conectados en diferentes NATs, que no permite conexiones entrantes sin una salida previa, recurren a servidores STUN y a veces también a protocolos TURN.
STUN - Session Traversal Utilities for NAT
El servidor STUN responde al cliente con su dirección IP y puerto, tanto públicos como privados, que esta usando. Y además le da la dirección IP y puerto, tanto públicos como privados, del cliente al que se quiere conectar. Esto permite intentar una conexión directa entre los clientes que pueden estar dentro del mismo NAT o no. Si esto falla, como es el caso de los NATs simétricos, se puede recurrir a un Servidor TURN.
TURN - Traversal Using Relays around NAT
Cuanto el NAT no admite la conexión directa entre dos clientes, se utiliza un servidor TURN para retransmitir toda la información entre ellos.
RTSP - Real Time Streaming Protocol
Normalmente podemos acceder a las cámaras IP mediante el protocolo RTSP que viene a ser el mando a distancia clásico con el que puedes moverte por los datos de audio y video.
Este protocolo nos permite independizarnos de las aplicaciones de visualización que nos vienen con la cámara.
Nuestra aplicación
Hay muchas aplicaciones para ver videos con el protocolo RTSP, como VCL, pero es muy fácil hacérnosla nosotros mismos. Para ello podemos utilizar las librerias de codigo abierto de FFMpeg y OpenCV.
IP estática
Reservamos una IP privada en el router para nuestra cámara, basándonos en su MAC. Así cuando arranque siempre se le asignará la misma IP y nos será más fácil encontrarla desde nuestros programas.
FFMpeg - Fast Forward Mpeg
FFMpeg es un proyecto de código abierto, en lenguaje C, con librerías y programas para manejar video y audio. Este proyecto fue iniciado por el prolífico Fabrice Bellard y actualmente es usado por infinidad de aplicaciones como VCL, iTunes y Youtube.
FFMpeg se usa en la consola del Sistema Operativo y tiene un sinfín de parámetros.
ffmpeg -rtsp_transport udp
-i rtsp://IP:PORT/application
-f image2
-frames:v 5
-vf fps=1/5
-y %03d.jpeg
El comando en línia anterior extrae 5 images JPEG del stream RTSP de la cámara IP, con un intervalo de 5 segundos entre imágenes.
-rtsp_transport | protocolo de transporte udp |
---|---|
-i | entrada RTSP |
-f image2 | muxer de imagen (de frames a imágenes) |
-vf fps= | frames por segundo |
-y %03d.jpeg | nombre de las imágenes resultantes, entero de 3 cifras (-y sobreescribe). |
FFMpeg es capaz en un solo comando de recibir en RTSP y publicar en DASH (Dynamic Adaptive Streaming over HTTP).
MPEG - Moving Picture Experts Group
Para hacer viable la transmisión del audio y del video en internet, estos se comprimen usando los códecs H.264 o H.265.
Muchas de estas cámaras permiten la comunicación de audio bidireccional.
OpenCV - Open Source Computer Vision
Es una librería de código abierto, en lenguaje C/C++, de visión artificial, nos permite hacer cosas tan interesantes con las imágenes como saber si se trata de un perro o una persona lo que se está moviendo delante de la cámara.
OpenCV dispone de bindings para lenguajes más amigables como Java y Python.
El código para extraer imágenes (frames) es muy simple.
VideoCapture capture =
new VideoCapture("rtsp://IP:PORT/application");
if (capture.isOpened())
{
while (true)
{
capture.read(webcamMatImage);
if (!webcamMatImage.empty())
{
// manage frame
} else
{
// Frame not captured -- break
break;
}
}
}
Todo el trabajo realmente lo está haciendo las librerías de FFMpeg, incluidas en OpenCV, que contienen los códecs y los protocolos de comunicación.
El problema de este código es que sólo sirve dentro de nuestra red local ya que es incapaz de saltarse el NAT del router y llegar al stream RTSP de la cámara IP. Esto lo podemos hacer usando un servidor STUN o abriendo un puerto del router para nuestra aplicación. (Port Forwaring + DDNS).
Port forwarding
Si el router tiene Port forwarding podemos asociar un puerto público a una dirección IP estática privada y a un puerto privado.
El router puede asociar una IP de forma permanente a un dispositivo basándose en su MAC.
Ahora el problema que tenemos es que la dirección publica del router puede cambiar. Esto se soluciona con un DDNS.
DDNS - Dynamic Domain Name System
Hay routers que permiten configurar un DDNS. El DDNS se conectan con un servidor para informar de los cambios de la IP pública del router. Esta IP está asociada a un subdominio fijo que podremos usar como punto de entrada a nuestro dispositivo local.
Raspberry Pi
Nuestra aplicación puede estar alojada en una Raspberry Pi, que estará en el mismo router que la cámara. La Raspberry Pi 4 Model B, con un ARM de 64 bits a 1.5 GHz, tiene suficiente potencia para gestionar streaming y manipular frames. Además tiene un decodificador hardware para H.264 y H.265, y un codificador hardware para H.264.
La Raspberry Pi 4 tiene la potencia y las librerías de código abierto necesarias para el procesado de las imágenes.
Podemos recibir las imágenes con FFMpeg, manipularlas con openCV, servirlas a través de un servidor Nginx instalado en la propia Raspberry, pero le costaría atender a todos los eventos a la vez. Así que mejor utilizar la Raspberry simplemente como pasarela que manipula las imágenes en función de eventos externos recibidos por sus GPIOs y las publica en la nube para que otros servidores o usuarios las puedan consumir.
Las GPIOs pueden alojar por ejemplo sensores de movimiento, de humo, relés que encienden luces o alarmas, para hacer un sistema de seguridad para nuestra casa.
Podemos evitar cableados utilizando tecnologías como ZigBee o Z-Wave que implicaría poner un sombrero hardware en la Raspberry pero evitaria complicarnos la vida con adaptaciones de hardware para los sensores / actuadores, ya que son dispositivos que simplemente se conectan. Lógicamente, simplificar el desarrollo hardware tiene un precio econòmico, pero también facilita el mantenimiento ya que se convierte en el equivalente a cambiar una bombilla.
Una bombilla Osram Smart + LED de 800 lumens con tecnología ZigBee que puedes encender, apagar, cambiar de color y regular la intensidad se puede encontrar en Amazon por menos de 8 euros (En algún momento de Diciembre 2020).
Las posibilidades son infinitas.
Servidor Pub/Sub
Este tipo de servidor desacopla el dispositivo que genera la información de la aplicación que la consume. Así, Raspberry publica información sobre temas, por ejemplo "detección de humo", que serán empujados a través de Notificaciones Push a aplicaciones de usuarios que previamente se han subscrito.
Notificaciones Push
Se tiene que crear una pequeña aplicación de usuario que le permita recibir notificaciones a las que previamente se ha subscrito. Si le interesa el tema, entonces puede conectarse al Servidor Web para ampliar la información sobre el tema o simplemente visualizar directamente la cámara que ha generado la notificación.
Servidor Web
Se tiene que crear también un Servidor Web para gestionar todas las imágenes, vídeos, alarmas previamente publicadas por la Raspberry.
Para finalizar
En la entrada Mejorando una cámara IP - Raspberry PI tenéis un ejemplo de encapsulación y mejora de una cámara IP usando una Raspberry PI.
Comentarios
Publicar un comentario