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

Wie Userful Unternehmen bei der Integration von Wärmebildkameras unterstützt - Teil 2

Benutzerfreundlich
Userful
Der führende Anbieter von AV as a Service (AVaaS)
Benutzeroberfläche des Video Management Servers

In Teil 1 dieses Blogs haben wir beschrieben, wie Wärmebildkameras und andere neue Technologien in der Post-COVID-Welt zur zweiten Natur werden. In diesem Teil werden wir ein Beispiel für eine Einrichtung vorstellen.

Wir haben einen Videoverwaltungsserver (VMS) mit einer Softwareplattform verwendet, die mit Kameras von Hunderten verschiedener Hersteller integriert werden kann, darunter auch Kameras, die kamerainterne Analysen und/oder Wärmebilder unterstützen. Die Benutzer können Ereignisse innerhalb der VMS-Plattform oder in der Regel-Engine einer Smart-Kamera konfigurieren. Bei diesen Ereignissen kann es sich um Objektabstands-Trigger (d. h. Erkennung von Objekten mit einem Abstand von weniger als 1,5 Metern zwischen ihnen), Objektzählungs-Trigger (d. h. Erkennung einer bestimmten Anzahl von Besuchern an einem Ort) oder Temperatur-Trigger (d. h. Erkennung von Objekten mit einer Temperatur über 38 Grad Celsius) handeln.

Jedes dieser Ereignisse kann einen HTTP-Aufruf an die Userful-API auslösen, so dass der Userful-Server automatisch den Inhalt einer Videowand, eines einzelnen Displays oder einer Gruppe von Displays ändern kann. Wie einfach ist die Bereitstellung? Es sind nur drei Schritte erforderlich:

  1. Konfigurieren Sie die Ereignisse auf der in der Kamera integrierten Analyse-Engine oder auf der softwarebasierten VMS-Plattform.
  2. Konfigurieren Sie einen HTTP-Listener, um eingehende HTTP-Aufrufe von externen Sensoren zu überwachen.
  3. Konfigurieren Sie einen Quellenumschalter, d. h. eine Reihe von Softwareanweisungen für die Userful-API, welche Inhalte auf der Grundlage des externen Auslösers auf den verschiedenen Bildschirmen angezeigt werden sollen. Dabei kann es sich um Textwarnungen, ein Anleitungsvideo, Live-Kameraübertragungen, eine Powerpoint-Folie oder jede andere Art von Inhalt handeln, den der Kunde anzeigen möchte.

Das Endergebnis (unter Verwendung von Python) enthält 26 Codezeilen in der Hauptanwendung: 


if __name__ == '__main__':

    # Binde den Socket an den Port    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('192.168.1.100', 8081)
    print ('Starten auf %s Port %s' % server_address)
    sock.bind(server_address)
    
    # Warten auf eingehende Verbindungen
    sock.listen(1)    
    while True:
        # Warte auf eine Verbindung vom externen Sensor
        print ('warte auf eine Verbindung')
        connection, client_address = sock.accept()
        try:
            print ('Verbindung von', client_address)
            # Empfangen Sie die Daten in kleinen Stücken und lesen Sie sie
            while True:
                data = connection.recv(512)
                if data: 
                    # Extrahiere die Daten, die vom Camera-HTTP-Aufruf kommen. 
                    camera = extract(data)
                    # Anmeldung am Userful Server, um das Authentifizierungs-Cookie abzurufen         
                    session_header = login()
                    # Feststellen, was gerade auf den Bildschirmen abgespielt wird
                    current_source = is_playing(session_header, 'Shop-Floor')
                    # den Inhalt auf den Bildschirmen auf eine vorkonfigurierte Quelle umschalten (in 
                    # diesem Beispiel eine HTML-Warnmeldung
                    switch_source(session_header,'shop-Floor','HTML Warning')
                    # Warten Sie 5 Sekunden lang 
                    time.sleep(5)
                    # zurück zum ursprünglich abgespielten Inhalt wechseln
                    switch_source(session_header,'Shop-Floor', current_source)
                    #delete_source(session_header,'PIP_Dynamic')    
                    time.sleep(5) 
                    break
                sonst:
                    print (sys.stderr, 'keine weiteren Daten von', client_address)
                    break     
        finally:
            # Die Verbindung auflösen
            connection.close()
 
X

Gehen wir dieses Projekt also Schritt für Schritt durch.

Schritt 1: Konfigurieren von Ereignissen auf der Camera oder VMS

In diesem Beispiel verwenden wir die integrierte Analyse-Engine unserer VMS-Plattform eines Drittanbieters, die die Kamera-Feeds von mehreren Kameras empfängt und aufzeichnet. Administratoren können verschiedene Ereignisse innerhalb der Kamera-Regel-Engine konfigurieren. Dies kann ein Bewegungsauslöser oder ein Analyseauslöser sein, bei dem die VMS-Software die eingehenden Video-Feeds analysiert und beispielsweise Ereignisse für jede Kamera erkennt:

  1. Eine Person, die einen bestimmten Bereich des erfassten Fensters betritt.
  2. Eine Person, die eine virtuelle Linie von A -> B überquert (Besucherzähler)
  3. Eine Person, die eine virtuelle Linie von B -> A überquert (Besucherzähler)
  4. Eine Person mit erhöhter Körpertemperatur (> 38 Grad)

Jedes Ereignis hat eine Handlungsaufforderung, z. B. eine HTTP-Anfrage an unseren Web-Listener unter 192.168.1.100:8081 mit Nachrichteninhalten wie dem Kameranamen und der Ereignisqualifikation. Ein Beispiel für eine Ereignisregel ist in der folgenden Abbildung dargestellt.

 

Benutzeroberfläche des Video Management Servers

 

Schritt 2: der HTTP-Listener

Ein HTTP-Webserver ist ein einfacher Prozess, der auf Ihrem Rechner läuft und genau zwei Dinge tut:

  1. Hört auf eingehende http-Anfragen an einer bestimmten TCP-Socket-Adresse (IP-Adresse und Portnummer)
  2. Bearbeitet diese Anfrage und reagiert, wenn eine Nachricht an der Socket-Adresse empfangen wird.

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 ...


# Binden Sie den Socket an den Port    
    Socket importieren
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('192.168.1.100', 8081)
    print ('Starten auf %s Port %s' % server_address)
    sock.bind(server_address) 
    # Warten auf eingehende Verbindungen
    sock.listen(1)   
 
    while True:
        # Auf eine Verbindung warten, die von einem externen Sensor kommt
        print ('waiting for a connection')
        connection, client_address = sock.accept()
        try:
            print ('Verbindung von', client_address)
            # Empfangen Sie die Daten in kleinen Stücken und lesen Sie sie
            while True:
                data = connection.recv(512)
                if Daten: 

                else:
                    print (sys.stderr, 'keine weiteren Daten von', client_address)
                    break     
        finally:
            # Die Verbindung auflösen
            connection.close()
  
 
X

Bevor wir unsere Quelle auf den Bildschirmen umschalten, prüfen wir, welche Quelle gerade in einer Zone (d. h. einer Gruppe von Bildschirmen) abgespielt wird. Auf diese Weise können wir zum ursprünglichen Inhalt zurückkehren, sobald ein Ereignis vorüber ist. Der nachstehende Code erkennt den Namen der aktuell wiedergegebenen Quelle (z. B. den Namen des Signage Players oder einen anderen Namen). Beim Aufruf dieser Funktion übermitteln wir unser Authentifizierungs-Cookie und den Zonennamen.


  def is_playing (session_header, zone):
    get_url = api_url_base + '/api/zones/byname/' + zone
    response = requests.get(url=get_url, headers=session_header)
    wenn response.status_code == 200:
        data = response.content
        dict = json.loads(data)
        sourceID = dict['playingSourceId'] 
        sourceName = get_source_info(session_header,sourceID)
        print(quellenname, 'wird abgespielt')
    sonst:
        print (response.status_code)
    return Quellenname

def get_source_info (session_header, sourceID):
    get_url = api_url_base + '/api/sources/' + sourceID
    response = requests.get(url=get_url, headers=session_header)
    wenn response.status_code == 200:
        data = response.content
        dict = json.loads(data)
    sonst:
        print (response.status_code)
    return dict['sourceName'] 

  
 
X

Nachdem wir nun den Namen der aktuell wiedergegebenen Quelle ermittelt haben, können wir die Quelle für diese Zone ändern:


  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)
    value = False
    wenn response.status_code == 200:
        data = response.content
        value = json.loads(data)["isPlaying"]
        print('Quelle gewechselt')
    sonst:
        print (response.status_code)
    Wert zurückgeben 

  

 

 
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.


  # Anmeldung beim Userful-Server, um das Authentifizierungs-Cookie abzurufen         
                    session_header = login()
                    # Feststellen, was gerade auf den Bildschirmen abgespielt wird
                    source = is_playing(session_header, 'Zone-3')
                    # Inhalt auf den Bildschirmen auf eine vorkonfigurierte Quelle umschalten (in diesem Beispiel eine HTML-Warnmeldung)
                    switch_source(session_header,'Zone-3','HTML Warning')
                    # Warten Sie 5 Sekunden lang 
                    time.sleep(5)
                    # zurück zum ursprünglich abgespielten Inhalt wechseln
                    switch_source(session_header,'Zone-3', source)
                    #delete_source(session_header,'PIP_Dynamic')    
                    time.sleep(5) 
                    break 

  

Wir können dieses Skript erweitern, indem wir uns die Daten ansehen, die über den HTTP-Aufruf von der Kamera oder der VMS-Plattform empfangen wurden. Diese Daten können Informationen über die Kamera und/oder die Auslöserquelle enthalten, und diese Informationen können verwendet werden, um verschiedene Arten von Inhalten anzuzeigen. Denken Sie an Live-Kamera-Feeds oder - wenn die Kamera Personen zählt - an die Anzeige, wie viele Kunden sich im Geschäft befinden und wie viele zusätzliche Kunden das Geschäft betreten können.

Ein Monitor, der die aktuelle Anzahl der Kunden in einem Geschäft anzeigt, unterstützt durch REST-API.

Dank der Einfachheit der REST-API können Kunden und Systemintegratoren einfache Lösungen mit technisch beeindruckenden Funktionen einsetzen. Sie brauchen keine Punktlösungen von verschiedenen Anbietern. Mit ein wenig Fantasie und begrenzten Programmierkenntnissen kann man es weit bringen. Ich hoffe, dass wir Ihr Interesse geweckt haben und freue mich auf einen weiteren Austausch von Ideen und Beispielen.

 

 

Sehen Sie sich das On-Demand-Webinar an, um mehr über die Nutzung der API von Userful zu erfahren

Userful
Der führende Anbieter von AV as a Service (AVaaS)