Blog del usuario

Cómo Userful ayuda a las organizaciones a integrar las cámaras térmicas | Parte 2

Escrito por Userful | May 29, 2020 6:00:00 AM

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:

  1. Configure los eventos en el motor de análisis integrado en la cámara o en la plataforma VMS basada en software.
  2. Configurar un escuchador HTTP; para monitorear las llamadas HTTP entrantes provenientes de sensores externos.
  3. Configurar un conmutador de fuentes; un conjunto de instrucciones de software para la API de Userful sobre qué contenido mostrar en las diferentes pantallas en función del activador externo. Puede tratarse de advertencias de texto, un vídeo de instrucciones, imágenes de cámara en directo, una diapositiva de PowerPoint o cualquier otro tipo de contenido que el cliente decida mostrar.

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()
 
 
X

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:

  1. Una persona que entra en una zona específica de la ventana grabada.
  2. Una persona que cruza una línea virtual de A -> B (contador de visitas)
  3. Una persona que cruza una línea virtual de B -> A (contador de visitas)
  4. Una persona con temperatura corporal elevada (> 38 grados)

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:

  1. Escucha las peticiones http entrantes en una dirección de socket TCP específica (dirección IP y un número de puerto)
  2. Maneja esta solicitud y actúa cuando se recibe un mensaje en la dirección del socket.

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()
  
 
 
X

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'] 

  
 
 
X

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 

  

 

 
 
 
X

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.