En la primera parte de este blog, describimos cómo las cámaras térmicas y otras nuevas tecnologías se convertirán en una segunda naturaleza en el mundo post-COVID. En esta parte mostraremos un ejemplo de configuración.
Utilizamos un servidor de gestión de vídeo (VMS) con una plataforma de software que se integra con cámaras de cientos de proveedores diferentes, incluidas las cámaras que admiten análisis en la cámara y/o imágenes térmicas. Los usuarios pueden configurar eventos dentro de la plataforma VMS o dentro del motor de reglas de una cámara inteligente. Estos eventos pueden ser disparadores de distancia de objetos (es decir, detección de objetos con una distancia inferior a 1,5 metros entre ellos), disparadores de recuento de objetos (es decir, detección de un determinado número de visitantes dentro de un lugar) o disparadores de temperatura (es decir, detección de objetos con una temperatura superior a 38 grados centígrados).
Cualquiera de estos eventos puede desencadenar una llamada HTTP a la API de Userful, permitiendo que el servidor de Userful cambie automáticamente el contenido de un videowall, una pantalla individual o un grupo de pantallas. ¿Qué tan sencillo es desplegar esto? Sólo se necesitan tres pasos:
El resultado final (usando Python) contiene 26 líneas de código en la aplicación principal:
si __name__ == '__main__':
# Enlaza el socket con el puerto
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dirección_servidor = ('192.168.1.100', 8081)
print ('starting up on %s port %s' % server_address)
sock.bind(dirección_servidor)
# Escuchar las conexiones entrantes
sock.listen(1)
while True:
# Espera por una conexión proveniente de un sensor externo
print ('esperando una conexión')
connection, client_address = sock.accept()
intenta:
print ('conexión desde', dirección_del_cliente)
# Recibe los datos en pequeños trozos y los lee
mientras sea cierto
data = connection.recv(512)
si datos:
# extrae los datos procedentes de la llamada HTTP de la cámara.
camera = extract(data)
# iniciar sesión en el servidor de Userful para recuperar la cookie de autenticación
session_header = login()
# determinar lo que se está reproduciendo actualmente en las pantallas
current_source = is_playing(session_header, 'Shop-Floor')
# cambiar el contenido de las pantallas a una fuente preconfigurada (en
# este ejemplo un mensaje de advertencia HTML
switch_source(session_header,'shop-Floor','HTML Warning')
# esperar 5 segundos
time.sleep(5)
# volver al contenido que se estaba reproduciendo originalmente
switch_source(session_header, 'Shop-Floor', current_source)
#eliminar_fuente(encabezado_sesión,'PIP_Dinámico')
time.sleep(5)
break
Si no:
print (sys.stderr, 'no more data from', client_address)
break
finalmente:
# Limpiar la conexión
connection.close()
Así que vamos a recorrer este proyecto paso a paso.
Paso 1: Configurar los eventos en la cámaraera o VMS
En este ejemplo utilizamos el motor de análisis integrado de nuestra plataforma VMS de terceros que recibe y graba las señales de las cámaras. Los administradores pueden configurar diferentes eventos dentro del motor de reglas de la cámara... Puede tratarse de un activador de movimiento o de un activador de análisis mediante el cual el software VMS analiza las alimentaciones de vídeo entrantes y detecta eventos para cada cámara, por ejemplo:
Cada evento tiene una llamada a la acción; por ejemplo, una SOLICITUD HTTP a nuestra escucha web en 192.168.1.100:8081 con contenidos de mensajes como el nombre de la cámara y la calificación del evento. Un ejemplo de regla de evento se muestra en la siguiente imagen.
Paso 2: la escucha HTTP
Un servidor web HTTP es un simple proceso que se ejecuta en su máquina y hace exactamente dos cosas:
In this example; our listener is listening to port 8081 on it's external Ethernet interface on IP address 192.168.1.100. If incoming connections are detected, the data received in the HTTP message is collected and processed under a <call to action> routine. This is the routine of instructing the Userful server what to do. Enter your text here ...
# Vincular el socket al puerto
importar socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dirección_servidor = ('192.168.1.100', 8081)
print ('starting up on %s port %s' % server_address)
sock.bind(dirección_servidor)
# Escuchar las conexiones entrantes
sock.listen(1)
while True:
# Espera una conexión procedente de un sensor externo
print ('esperando una conexión')
connection, client_address = sock.accept()
intenta:
print ('conexión desde', dirección_del_cliente)
# Recibe los datos en pequeños trozos y los lee
mientras sea cierto
data = connection.recv(512)
si datos:
else:
print (sys.stderr, 'no more data from', client_address)
romper
finalmente:
# Limpiar la conexión
connection.close()
Antes de cambiar nuestra fuente en las pantallas, comprobamos qué fuente se está reproduciendo actualmente en una zona (es decir, un grupo de pantallas). De esta manera podemos volver al contenido original una vez que haya pasado un evento. El código siguiente detectará el nombre de la fuente que se está reproduciendo actualmente (es decir, el nombre del reproductor de señales, u otro). Al llamar a esta función, pasamos nuestra cookie de autenticación y el nombre de la zona.
def is_playing (session_header, zone):
get_url = api_url_base + '/api/zonas/byname/' + zona
response = requests.get(url=get_url, headers=session_header)
si response.status_code == 200
data = response.content
dict = json.loads(data)
sourceID = dict['playingSourceId']
sourceName = get_source_info(session_header,sourceID)
print(sourceName, 'is playing')
si no:
print (response.status_code)
return sourceName
def get_source_info (session_header, sourceID):
get_url = api_url_base + '/api/sources/' + sourceID
response = requests.get(url=get_url, headers=session_header)
si response.status_code == 200
data = response.content
dict = json.loads(data)
Si no:
print (response.status_code)
return dict['sourceName']
Ahora que hemos determinado el nombre de la fuente que se está reproduciendo, podemos cambiar la fuente de esa zona:
def switch_source(session_header, zone_name, source_name):
post_url = api_url_base + '/api/zonas/byname/' + zone_name + '/switch?destinationSourceName=' + source_name
response = requests.put(url=post_url, headers=session_header)
valor = Falso
si response.status_code == 200
data = response.content
value = json.loads(data)["isPlaying"]
print('Fuente cambiada')
si no
print (response.status_code)
devuelve el valor
And that is it…. The <CALL TO ACTION> in our HTTP Listener becomes: (1) retrieve the AUTH cookie for the Userful Server, (2) Detect current source playing in a particular zone, (3) Switch the content on the displays to a 'HTML Warning' message stored on the local server (4) Pause for some time, (5) Switch back to the original source.
# login al servidor de Userful para recuperar la cookie de autenticación
session_header = login()
# determinar lo que se está reproduciendo actualmente en las pantallas
source = is_playing(session_header, 'Zone-3')
# cambiar el contenido de las pantallas a una fuente preconfigurada (en este ejemplo, un mensaje de advertencia HTML)
switch_source(session_header,'Zone-3','HTML Warning')
# esperar 5 segundos
time.sleep(5)
# vuelve al contenido que se estaba reproduciendo originalmente
switch_source(session_header, 'Zone-3', source)
#delete_source(session_header,'PIP_Dynamic')
time.sleep(5)
break
Podemos ampliar este script mirando realmente los datos que se recibieron en la llamada HTTP procedente de la cámara o de la plataforma VMS. Estos datos pueden contener información sobre la cámara y/o la fuente de activación y esta información puede utilizarse para mostrar diferentes tipos de contenido. Piense en las transmisiones de la cámara en directo o, si la cámara está contando personas, en mostrar cuántos clientes hay en la tienda y cuántos clientes adicionales pueden entrar en ella.
Gracias a la sencillez de REST-API, los clientes y los integradores de sistemas pueden implantar soluciones sencillas para algunas funciones técnicamente impresionantes. No es necesario recurrir a soluciones puntuales de distintos proveedores. Sólo un poco de imaginación combinada con unos conocimientos limitados de codificación pueden llevarte lejos. Espero que hayamos despertado su interés y que estemos deseando participar en más intercambios de ideas y ejemplos.