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:
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()
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:
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.
Schritt 2: der HTTP-Listener
Ein HTTP-Webserver ist ein einfacher Prozess, der auf Ihrem Rechner läuft und genau zwei Dinge tut:
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()
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']
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
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.
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.