<img src="https://ws.zoominfo.com/pixel/wVZyCO7Xuh9RSC7SjBFs" width="1" height="1" style="display: none;" loading="lazy">

Comment Userful aide les organisations à intégrer les caméras thermiques - Partie 2

Utilisable
Userful
Le premier fournisseur d'AV as a Service (AVaaS)
Interface utilisateur du serveur de gestion vidéo

Dans la première partie de ce blog, nous avons décrit comment les caméras thermiques et autres nouvelles technologies deviendront une seconde nature dans le monde post-COVID. Pour cette partie, nous allons présenter un exemple de configuration.

Nous avons utilisé un serveur de gestion vidéo (VMS) avec une plateforme logicielle qui s'intègre aux caméras de centaines de fournisseurs différents, y compris les caméras prenant en charge l'analyse et/ou l'imagerie thermique. Les utilisateurs peuvent configurer des événements dans la plate-forme VMS ou dans le moteur de règles d'une caméra intelligente. Ces événements peuvent être des déclencheurs de distance d'objet (c'est-à-dire la détection d'objets séparés par une distance inférieure à 1,5 mètre), des déclencheurs de comptage d'objets (c'est-à-dire la détection d'un certain nombre de visiteurs dans un lieu) ou des déclencheurs de température (c'est-à-dire la détection d'objets dont la température est supérieure à 38 degrés centigrades).

Chacun de ces événements peut déclencher un appel HTTP à l'API Userful, permettant au serveur Userful de modifier automatiquement le contenu d'un mur vidéo, d'un écran individuel ou d'un groupe d'écrans. Le déploiement est simple comme bonjour. Il ne faut que trois étapes :

  1. Configurez les événements sur le moteur d'analyse intégré à la caméra ou sur la plateforme logicielle VMS.
  2. Configurer un écouteur HTTP ; pour surveiller les appels HTTP entrants provenant de capteurs externes.
  3. Configurez un commutateur de sources ; un ensemble d'instructions logicielles pour l'API Userful concernant le contenu à afficher sur les différents écrans en fonction du déclencheur externe. Il peut s'agir d'avertissements textuels, d'une vidéo d'instruction, de flux de caméras en direct, d'une diapositive Powerpoint ou de tout autre type de contenu que le client décide d'afficher.

Le résultat final (en utilisant Python) contient 26 lignes de code dans l'application principale : 


si __name__ == '__main__' :

    # Lier la socket au port    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    adresse_serveur = ('192.168.1.100', 8081)
    print ('starting up on %s port %s' % server_address)
    sock.bind(adresse_serveur)
    
    # Écoute les connexions entrantes
    sock.listen(1)    
    while True :
        # Attend une connexion provenant d'un capteur externe
        print ('waiting for a connection')
        connexion, adresse_client = sock.accept()
        essayer :
            print ('connection from', client_address)
            # Recevoir les données en petits morceaux et les lire
            while True :
                données = connexion.recv(512)
                if données : 
                    # extraire les données provenant de l'appel HTTP de Camera. 
                    camera = extract(data)
                    # Connectez-vous au serveur Userful pour récupérer le cookie d'authentification.                   
                    session_header = login()
                    # Déterminez ce qui est en cours de lecture sur les écrans
                    current_source = is_playing(session_header, 'Shop-Floor')
                    # changer le contenu sur les écrans vers une source préconfigurée (dans 
                    # cet exemple, un message d'avertissement HTML
                    switch_source(session_header, 'shop-Floor', 'HTML Warning')
                    # attendez 5 secondes 
                    time.sleep(5)
                    # Retournez au contenu qui était diffusé à l'origine
                    switch_source(session_header, 'Shop-Floor', current_source)
                    #delete_source(session_header, 'PIP_Dynamic')    
                    time.sleep(5) 
                    break
                autre :
                    print (sys.stderr, 'no more data from', client_address)
                    pause     
        enfin :
            # Nettoyer la connexion
            connexion.close()
 
X

Nous allons donc parcourir ce projet étape par étape.

Étape 1 : Configuration des événements sur la caméraera ou VMS

Dans cet exemple, nous utilisons le moteur d'analyse intégré de notre plateforme VMS tierce qui reçoit et enregistre les flux de plusieurs caméras. Les administrateurs peuvent configurer différents événements dans le moteur de règles des caméras... Il peut s'agir d'un déclencheur de mouvement ou d'un déclencheur d'analyse par lequel le logiciel VMS analyse les flux vidéo entrants et détecte les événements pour chaque caméra, par exemple :

  1. Une personne qui entre dans une zone spécifique de la fenêtre enregistrée.
  2. Une personne traversant une ligne virtuelle de A -> B (compteur de visiteurs)
  3. Une personne traversant une ligne virtuelle de B -> A (compteur de visiteurs)
  4. Une personne ayant une température corporelle élevée (> 38 degrés)

Chaque événement a un appel à l'action ; par exemple, une demande HTTP à notre auditeur web à 192.168.1.100:8081 avec un message contenant le nom de la caméra et la qualification de l'événement. Un exemple de règle d'événement est présenté dans l'image ci-dessous.

 

Interface utilisateur du serveur de gestion vidéo

 

Étape 2 : le récepteur HTTP

Un serveur web HTTP est un simple processus qui s'exécute sur votre machine et qui fait exactement deux choses :

  1. Écoute les requêtes http entrantes sur une adresse de socket TCP spécifique (adresse IP et numéro de port).
  2. Gère cette requête et agit lorsqu'un message est reçu sur l'adresse de la 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 ...


# Lier la socket au port    
    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    adresse_serveur = ('192.168.1.100', 8081)
    print ('starting up on %s port %s' % server_address)
    sock.bind(adresse_serveur) 
    # Écoute les connexions entrantes
    sock.listen(1)   
 
    while True :
        # Attend une connexion provenant d'un capteur externe
        print ('waiting for a connection')
        connexion, adresse_client = sock.accept()
        essayer :
            print ('connection from', client_address)
            # Recevoir les données en petits morceaux et les lire
            while True :
                données = connexion.recv(512)
                si données : 

                else :
                    print (sys.stderr, 'no more data from', client_address)
                    break     
        enfin :
            # Nettoyer la connexion
            connexion.close()
  
 
X

Avant de basculer notre source sur les écrans, nous vérifions quelle source est actuellement en cours de lecture dans une zone (c'est-à-dire un groupe d'écrans). De cette façon, nous pouvons revenir au contenu original une fois qu'un événement est passé. Le code ci-dessous détectera le nom de la source en cours de lecture (c'est-à-dire le nom du lecteur de signalisation, ou autre). En appelant cette fonction, nous transmettons notre cookie d'authentification et le nom de la zone.


  def is_playing (session_header, zone) :
    get_url = api_url_base + '/api/zones/byname/' + zone
    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')
    autre :
        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)
    sinon
        print (response.status_code)
    return dict['sourceName'] 

  
 
X

Maintenant que nous avons déterminé le nom de la source en cours de lecture, nous pouvons changer la source pour cette zone :


  def switch_source(session_header, zone_name, source_name) :
    post_url = api_url_base + '/api/zones/byname/' + zone_name + '/switch?destinationSourceName=' + source_name
    response = requests.put(url=post_url, headers=session_header)
    valeur = Faux
    si response.status_code == 200 :
        data = response.content
        value = json.loads(data)["isPlaying"]
        print('Source Switched')
    else :
        print (response.status_code)
    retourner la valeur 

  

 

 
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.


  # se connecter au Userful Server pour récupérer le cookie d'authentification                  
                    session_header = login()
                    # Déterminez ce qui est en cours de lecture sur les écrans
                    source = is_playing(session_header, 'Zone-3')
                    # changer le contenu sur les écrans vers une source préconfigurée (dans cet exemple un message d'avertissement HTML)
                    switch_source(session_header, 'Zone-3', 'HTML Warning')
                    # attendez 5 secondes 
                    time.sleep(5)
                    # basculez à nouveau vers le contenu qui était initialement en cours de lecture
                    switch_source(session_header, 'Zone-3', source)
                    #delete_source(session_header, 'PIP_Dynamic')    
                    time.sleep(5) 
                    pause 

  

Nous pouvons développer ce script en examinant les données reçues dans l'appel HTTP provenant de la caméra ou de la plate-forme VMS. Ces données peuvent contenir des informations sur la caméra et/ou la source de déclenchement et ces informations peuvent être utilisées pour afficher différents types de contenu. Pensez aux flux de caméras en direct ou - si la caméra compte les personnes - à l'affichage du nombre de clients présents dans le magasin et du nombre de clients supplémentaires pouvant entrer dans le magasin.

Un moniteur affichant un message en direct sur le nombre de clients dans le magasin, alimenté par REST-API, dans un magasin.

Grâce à la simplicité de l'API-REST, les clients et les intégrateurs de systèmes peuvent déployer des solutions simples pour certaines fonctions techniquement étonnantes. Il n'est pas nécessaire de recourir à des solutions ponctuelles provenant de différents fournisseurs. Un peu d'imagination combinée à des compétences limitées en codage peut vous mener loin. J'espère que nous avons suscité votre intérêt et je me réjouis de participer à d'autres échanges d'idées et d'exemples.

 

 

Regardez le webinaire à la demande pour en savoir plus sur l'utilisation de l'API d'Userful.

Userful
Le premier fournisseur d'AV as a Service (AVaaS)