Bewegungserkennung mit Hikvision-Kamera DS-2CD2032-I

Hallo zusammen,

ich habe eine Webcam (HIKVISION DS-2CD2032-I) und möchte die Bewegungserkennung der Kamera dazu verwenden bei Dunkelheit das Licht einzuschalten. Wonach und wo ich suchen muss, weiss ich zwischenzeitlich. Alleine bei der Umsetzung in IP Symcon happert es noch. Mit dem „Testtool for Integrators“ von Hikvision kann ich den GET Befehl auslösen und erhalte eine Antwort. Siehe Bild:

Der Befehl ist vermutlich folgender: „http://admin:12345@192.168.100.231:80 GET /ISAPI/Event/notification/alertStream“

Als Antwort erhalte ich den Status im XML-Format.

Wenn der Wert des rot markierten Bereiches <activePostCount>2</activePostCount> ungleich 0 ist wurde eine Bewegung erkannt.

Wäre euch sehr dankbar, wenn ihr mich hier mit einem Script unterstützen könntet.

Besten Dank
Alfred

Hallo zusammen,

habe zwischenzeitlich sehr viel recherchiert und bin sehr nahe an der Lösung dran.
Hierzu verwende ich folgendes Script

<?php
$xml_data = ''."
";
 
  $user = "admin";
  $pass = "Alf*2909";

$host = '192.168.100.231';
$path = '/ISAPI/Event/notification/alertStream';
 
//Socket öffnen
$fp = @fsockopen("tcp://".$host, 80, $errno, $errstr, 10);
if (!$fp)
{
    die($errstr.':'.$errno);
}
else
{
        $header  = "GET $path HTTP/1.1
";
        $header .= "Authorization: Basic ".base64_encode("$user:$pass")."
";
        $header .= "Host: $host
";
        $header .= "Content-Type:text/xml
";
        $header .= "Content-Length:0

";
 
    //senden von Daten
    fwrite($fp, $header.$xml_data);
 
    $headers='';
 
    //Header lesen
    while ($str = trim(fgets($fp, 4096)))
    $headers .= "$str
";
 
    $body='';
 
    //Antwort lesen
    while (!feof($fp))
    $body.= fgets($fp, 4096);
 
    //Soket schliessen
    fclose($fp);
}
 
//Daten ausgeben
echo $headers.'<hr/>'.$body;
 
?>

Dieses Script ( entsprechende Anpassung im $path ) funktioniert mit zahlreichen Befehlen, die so aufgebaut sind.
Nur nicht mit /ISAPI/Event/notification/alertStream. Hier bringt mir IP Symcon folgenden Fehler:

Fatal error: Maximum execution time of 30 seconds exceeded in C:\IP-Symcon\scripts\27266.ips.php on line 37

was diese Zeile betrifft: $body.= fgets($fp, 4096);

Die Antwort mit dem Test-Tool sieht so aus:

HTTP/1.1 200 OK
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=boundary

–boundary
Content-Type: application/xml; charset=„UTF-8“
Content-Length: 483

<EventNotificationAlert version=„2.0“ xmlns=„http://www.hikvision.com/ver20/XMLSchema“>
<ipAddress>192.168.100.231</ipAddress>
<portNo>80</portNo>
<protocol>HTTP</protocol>
<macAddress>3c:8c:f8:a0:6f:3a</macAddress>
<channelID>1</channelID>
<dateTime>2016-09-24T10:39:51+01:00</dateTime>
<activePostCount>0</activePostCount>
<eventType>videoloss</eventType>
<eventState>inactive</eventState>
<eventDescription>videoloss alarm</eventDescription>
</EventNotificationAlert>
–boundary
Content-Type: application/xml; charset=„UTF-8“
Content-Length: 483

<EventNotificationAlert version=„2.0“ xmlns=„http://www.hikvision.com/ver20/XMLSchema“>
<ipAddress>192.168.100.231</ipAddress>
<portNo>80</portNo>
<protocol>HTTP</protocol>
<macAddress>3c:8c:f8:a0:6f:3a</macAddress>
<channelID>1</channelID>
<dateTime>2016-09-24T10:39:51+01:00</dateTime>
<activePostCount>0</activePostCount>
<eventType>videoloss</eventType>
<eventState>inactive</eventState>
<eventDescription>videoloss alarm</eventDescription>
</EventNotificationAlert>
–boundary
Content-Type: application/xml; charset=„UTF-8“
Content-Length: 483

<EventNotificationAlert version=„2.0“ xmlns=„http://www.hikvision.com/ver20/XMLSchema“>
<ipAddress>192.168.100.231</ipAddress>
<portNo>80</portNo>
<protocol>HTTP</protocol>
<macAddress>3c:8c:f8:a0:6f:3a</macAddress>
<channelID>1</channelID>
<dateTime>2016-09-24T10:39:52+01:00</dateTime>
<activePostCount>0</activePostCount>
<eventType>videoloss</eventType>
<eventState>inactive</eventState>
<eventDescription>videoloss alarm</eventDescription>
</EventNotificationAlert>
–boundary
Content-Type: application/xml; charset=„UTF-8“
Content-Length: 483

<EventNotificationAlert version=„2.0“ xmlns=„http://www.hikvision.com/ver20/XMLSchema“>
<ipAddress>192.168.100.231</ipAddress>
<portNo>80</portNo>
<protocol>HTTP</protocol>
<macAddress>3c:8c:f8:a0:6f:3a</macAddress>
<channelID>1</channelID>
<dateTime>2016-09-24T10:39:52+01:00</dateTime>
<activePostCount>0</activePostCount>
<eventType>videoloss</eventType>
<eventState>inactive</eventState>
<eventDescription>videoloss alarm</eventDescription>
</EventNotificationAlert>

Hat jemand eine Ahnung? Wäre toll wenn mir hier jemand weiter helfen könnte.

Grüße
Alfred

Hallo zusammen,
bin ein kleines Stück weitergekommen, hänge aber immer noch, weil ich von PHP keine Ahnung habe.
Wie es scheint, erfüllt die Antwort der Kamera, bei dieser Anfrage, nicht die Bedingungen, dass die while-Schleife beendet wird.

    //Header lesen
    while ($str = trim(fgets($fp, 4096)))
    $headers .= "$str
";
 
    $body='';
 
    //Antwort lesen
    while (!feof($fp))
    $body.= fgets($fp, 4096);

Ich habe mir über den Microsoft Netmonitor mal angesehen was so passiert. Während mit dem Testtool 4 Pakete von der Kamera zurückkommen, siehe oben, liefert sie mit dem PHP-Script endlos Pakte (bis zum Abbruch wegen timeout). Abwechselnd erst header dann body. Ich wäre mit einem Paket schon glücklich. Wie gesagt, ich habe von PHP keine Ahnung und wäre daher sehr dankbar, wenn jemand mal über das obige Script darüberschauen könnte und die while-Scheilfe so umbaut, dass ich nur noch ein Paket bekomme.

Danke Alfred

Hallo Alfred,

ich habe ebenfalls Hikvision Kameras und bin auch gerade auf der Suche nach einer Möglichkeit die Alarme der Kameras in IP Symcon abzubilden.

Wie ist bei dir der aktuelle Stand? Wenn du von dem XML Stream nur ein Paket haben möchtest, kannst du anstatt der While Schleife folgende Zeile einfügen:

stream_get_line($fp, 4096, ‚</EventNotificationAlert>‘);

Es wird dann der Stream nur bis zu dem Text </EventNotificationAlert> gelesen.

Allerdings bin ich mir noch nicht schlüssig wie es dann weitergeht. Eigentlich müsste ja pausenlos der Stream ausgewertet werden und bei einer Bewegungserkennung eine Varialbe in IPS gesetzt werden. Das würde heißen ein PHP Script müsste pausenlos laufen. Das denke ich ist auch nicht optimal. Liest man nur ein Paket pro Scriptlauf, so müsste das Script in kurzen Abständen hintereinander gestartet werden. Auch nicht ideal.

Besser wäre aus meiner Sicht wenn die Kamera bei einer Bewegungserkennung Daten an einen IPS Server Socket schickt, die dann entsprechend ausgewertet werden können. Dann müsste kein Script pausenlos laufen. Das funktioniert auch grundsätzlich, wenn man auf der Kamera über /ISAPI/Event/notification/httpHosts das vorher erstellte IPS Server Socket konfiguriert (funktionierte bei mir nur über curl und nicht über das Hikvision Test Tool). Die Daten würden dann sauber in IPS ankommen, allerdings wenn man auf dem Smartphone die Alarmfunktion der Hikvision APP iVMS4500 verwendet, wird die httpHost Einstellung wieder überschrieben und an IPS werden keine Daten mehr gesendet.

Das würde auch funktionieren: Günstige WebCam als Bewegungsmelder mit Motion Detection
Allerdings nur mit der zusätzlichen SMTPBridge.

Hallo,
oben beschriebene Aufgabenstellung wurde dank Premiumsupport gelöst und möchte sie hier niemanden vorenthalten.
Ich bin mit meinem Projekt dank der Community sehr weit gekommen und möchte deshalb auch einen Teil zu Community beitragen.

Für die Lösung sind eine Client-Socketverbindung, ein Cutter, 1 RegVar und 2 Scripte einzurichten.

1.Client-Socket-Verbindung unter I/O-Instanzen einrichten:

Client socket 2.PNG

  1. Cutter unter Splitter-Instanzen einrichten:

Der auszuwertende String in der XML-Datei ist innerhalb dieses Feldes:

<eventDescription> </eventDescription>

  1. RegVar Einrichten:

  1. Foldende Scripte einbinden:

4.1 Name des 1.Scriptes: ( in meinem Fall ) init alertstream Kamera 1

<?php
$ClientSocketID = 27739 /*[Client Socket Kamera 1]*/;

if ($_IPS['STATUS'] == 102) {
	$user = "admin"; 
	$pass = "12345"; 
	
	$url = '192.168.100.231'; 
	$path = '/Event/notification/alertStream';
	
	$Xml = ""; 
	
	$header  = "GET ".$path." HTTP/1.1
"; 
	$header .= "Authorization: Basic ".base64_encode($user.":".$pass)."
"; 
	$header .= "Content-Length: ".strlen($Xml)."

";
	$header .= $Xml;
	
	CSCK_SendText($ClientSocketID , $header.$Xml); 
 }
?>

4.2 Name des 2.Scriptes: ( in meinem Fall ) Verarbeite Alertstream Kamera 1

<?

if ($_IPS['VALUE'] == "Motion alarm") {
	SetValueBoolean(21463 /*[Technik\Kamera 1\Motion Alarm Kamera 1]*/ ,true);
} else {
	SetValueBoolean(21463 /*[Technik\Kamera 1\Motion Alarm Kamera 1]*/ ,false);
}
if ($_IPS['VALUE'] == "linedetection alarm") {
	SetValueBoolean(22410 /*[Technik\Kamera 1\Linedetection Alarm Kamera 1]*/ ,true);
} else {
	SetValueBoolean(22410 /*[Technik\Kamera 1\Linedetection Alarm Kamera 1]*/ ,false);
}
if ($_IPS['VALUE'] == "fielddetection alarm") {
	SetValueBoolean(39712 /*[Technik\Kamera 1\Fieldetection Alarm Kamera 1]*/ ,true);
} else {
	SetValueBoolean(39712 /*[Technik\Kamera 1\Fieldetection Alarm Kamera 1]*/ ,false);
}
?>

Zum Testen habe ich für mich noch 3 Bool-Variablen eingefügt. Nach alledem bitte IP-Symcon stoppen und starten.

Das sollte es gewesen sein.

Beste Grüße
Alfred

Hallo,

danke für die Bereitstellung der Lösung zum Auswerten des Alertstreams. Ich habe es ausprobiert und es funktioniert, allerdings ist mein Raspberry PI schon mit einer Kamera deutlich überfordert durch die vielen Daten (<eventType>videoloss</eventType> <eventState>inactive</eventState> Meldungen). Ich habe bis dato keine Möglichkeit bei der Kamera gefunden, diese irgendwie abzustellen.

Ich möchte deshalb auch kurz erläutern, wie weit ich mit der ISAPI/Event/notification/httpHosts Funktion der Kamera gekommen bin. Als erstes konfiguriert man einen Server Socket in IPS mit einem beliebigen freien Port.

Serversocket.JPG

Dann eine RegisterVariable, die die Daten vom Serversocket erhält und an ein Script (z. B. Notification) weiterleitet.

Das Script (Notification) wertet die XML Daten aus und speichert die relevanten Informationen in IPS Variablen. Z. B.


<?
	if ($_IPS['SENDER'] == "RegisterVariable")
	{
		$sData = $_IPS['VALUE'];
		$sXML = substr($sData, stripos($sData, "<?xml"));
		$sXML = str_replace('&&', '|' , $sXML);
		$oXMLData = new SimpleXMLElement($sXML);

		SetValueInteger(59656 /*[Scripts\Kamera\Nordseite_Motion_Counter]*/, (int)$oXMLData->activePostCount);
      
//		echo "Event: " . $oXMLData->eventDescription;
//		echo "PostCount: " . $oXMLData->activePostCount;
//		echo "Date: " . $oXMLData->dateTime;

  	}
?>

Um das ganze zu aktivieren, muss man folgende XML Datei anlegen (z. B. httpHosts.xml) und per curl an die Kamera schicken.


<?xml version="1.0" encoding="UTF-8"?>
<HttpHostNotificationList version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<HttpHostNotification version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<id>1</id>
<url>/</url>
<protocolType>HTTP</protocolType>
<parameterFormatType>XML</parameterFormatType>
<addressingFormatType>ipaddress</addressingFormatType>
<hostName></hostName>
<ipAddress>192.168.1.13</ipAddress>
<portNo>1024</portNo>
<userName></userName>
<httpAuthenticationMethod>none</httpAuthenticationMethod>
</HttpHostNotification>
</HttpHostNotificationList>

curl -T httpHosts.xml http://admin:passwort@192.168.1.65/ISAPI/Event/notification/httpHosts

Zurück sollte dann folgende XML kommen:


<?xml version="1.0" encoding="UTF-8"?>
<ResponseStatus version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
<requestURL>/ISAPI/Event/notification/httpHosts</requestURL>
<statusCode>1</statusCode>
<statusString>OK</statusString>
<subStatusCode>ok</subStatusCode>
</ResponseStatus>

Ab jetzt schickt die Kamera bei einem Ereignis die Daten an den Serverport in IPS. Ein großer Vorteil ist, dass nur dann Daten kommen, wenn ein Ereignis erkannt wird und das System nicht überlastet ist.

Allerding musste ich feststellen, dass bei einer Bewegung die Daten von der Kamera fünf mal geschickt werden (im 10 Sekunden Takt). Ich vermute mal das liegt daran, dass die Kamera erwartet, dass irgendeine Form von Bestätigung (XML) zurückkommt. Das wäre grundsätzlich über den ServerPort auch möglich, allerdings weiß ich nicht wie diese auszusehen hätte, so dass es von der Kamera akzeptiert wird.

Die Funktion ISAPI/Event/notification/httpHosts wird eigentlich von der Hikvision Smartphone APP konfiguriert, wenn man die Alarme in der APP einschaltet. Dann schickt die Kamera bei einer Bewegung die Daten an einen Hikvision Server bei AWS, der dann wiederum die Smartphone APP darüber informiert.
Ich haben schon mal versucht mit einem Netzwerktrace die Rückantwort anzusehen, allerdings ist das nicht ganz so trivial. Die Antwort kommt wiederum von einer anderen IP Adresse. Ganz komisch.

Vielleicht hat ja jemand eine Idee bezüglich der passenden Rückantwort. Dann denke ich wäre es eine schöne Lösung.

Viele Grüße

Hallo zusammen.
Also erstmal vielen Dank an alle, die bei der Lösung des Problems unterstützt haben.

Ich habe auch eine Hikvision Kamera, und das Problem, dass die Bewegungserkennung nicht funktioniert.

Ich habe das XML zur Kamera geschickt und folgende Antwort erhalten:

<?xml version=„1.0“ encoding=„UTF-8“?>
<HttpHostNotificationList version=„2.0“ xmlns=„http://www.hikvision.com/ver20/XMLSchema“>
<HttpHostNotification version=„2.0“ xmlns=„http://www.hikvision.com/ver20/XMLSchema“>
<id>1</id>
<url>/</url>
<protocolType>HTTP</protocolType>
<parameterFormatType>XML</parameterFormatType>
<addressingFormatType>ipaddress</addressingFormatType>
<ipAddress>192.168.10.77</ipAddress>
<portNo>6162</portNo>
<userName></userName>
<httpAuthenticationMethod>none</httpAuthenticationMethod>
</HttpHostNotification>
</HttpHostNotificationList>

Aber leider bekomme ich (Auch im Wireshark) nichts, wenn ich die Bewegungserkennung auslöse.
Hat noch jemand einen Tipp für mich?

Danke, Gruß, Torben