[Info] VTO Event Empfänger

riogrande75

Mitglied
Mitglied seit
30 Okt 2017
Beiträge
754
Punkte für Reaktionen
108
Punkte
43
Habe beim Suchen nach eine besseren Lösung für den Empfang und die Bearbeitung von Events (Anläuten, FingerPrint, Türöffnen, etc.) meiner VTO2000A die Dahua-JSON-Debug-Console entdeckt.
Nach einigen Anpassungen des Entwicklers (Vielen Dank an bashis) funktioniert das Script auch an VTO's mit aktueller Firmware 4.3.
Auf Basis dessen startet ich meine Forschungen und konnte schnell einen Erfolg verbuchen. User philipp900 programmierte das Script dann in PHP nach und passte es unseren Wünschen an - Vielen Dank Philipp!
Ich habe noch einige kleine Erweiterungen vorgenommen, rausgekommen ist das hier: DahuaEventHandler.php

Jeder kann nun recht einfach Aktionen starten (z.b. Email schicken, Relais Schalten, etc.).
 

riogrande75

Mitglied
Mitglied seit
30 Okt 2017
Beiträge
754
Punkte für Reaktionen
108
Punkte
43
Wenn jemand noch "Unknown event received" empfängt, bitte um Debug Ausgabe des Scripts, werde das dann noch einbauen.
 

kuzco-ip

Mitglied
Mitglied seit
4 Feb 2019
Beiträge
305
Punkte für Reaktionen
16
Punkte
18
An Alle ein grosses Lob für dieses Script !!

Hier ein unknown Event beim Klingeln an meiner VTO2000A-c.
Es kommt vorher:
2020-01-26 11:47:09.000000: Event Call from VTO
2020-01-26 11:47:09.000000: Unknown event received

Code:
array(4) {
  ["id"]=>
  int(2)
  ["method"]=>
  string(24) "client.notifyEventStream"
  ["params"]=>
  array(2) {
    ["SID"]=>
    int(513)
    ["eventList"]=>
    array(1) {
      [0]=>
      array(4) {
        ["Action"]=>
        string(5) "Pulse"
        ["Code"]=>
        string(6) "Invite"
        ["Data"]=>
        array(7) {
          ["CallID"]=>
          string(1) "3"
          ["IsEncryptedStream"]=>
          bool(false)
          ["LocaleTime"]=>
          string(19) "2020-01-26 11:47:04"
          ["LockNum"]=>
          int(2)
          ["SupportPaas"]=>
          bool(false)
          ["TCPPort"]=>
          int(37777)
          ["UTC"]=>
          float(1580035624)
        }
        ["Index"]=>
        int(0)
      }
    }
  }
  ["session"]=>
  int(2147483147)
}
 

riogrande75

Mitglied
Mitglied seit
30 Okt 2017
Beiträge
754
Punkte für Reaktionen
108
Punkte
43
Ist drinnen.
 
  • Like
Reaktionen: kuzco-ip

philipp900

Neuer User
Mitglied seit
28 Feb 2009
Beiträge
17
Punkte für Reaktionen
2
Punkte
3
Ich hatte gestern noch einen Fall bei dem sich das Script in Zeile 137 in einer Endlosschleife verfangen hatte.
Das empfangene Packet war unvollständig und es könnte keine Länge ermittelt werden.
Wenn man LEN_RECVED und LEN_EXPECT jeweils mit 1 statt 0 initialisiert, dürfte das nicht mehr auftreten.
 

riogrande75

Mitglied
Mitglied seit
30 Okt 2017
Beiträge
754
Punkte für Reaktionen
108
Punkte
43
Ok danke, werde das anpassen.
 

philipp900

Neuer User
Mitglied seit
28 Feb 2009
Beiträge
17
Punkte für Reaktionen
2
Punkte
3
@kuzco-ip
Hier noch der Code für die von dir gewünschte Snapshot Funktion.
Einfach bei 'CallNoAnswered' mit $this->SaveSnapshot(); aufrufen.

PHP:
function SaveSnapshot($path="/tmp/")
{
    $filename = $path."/DoorBell_".date("Y-m-d_H-i-s").".jpg";
    $fp = fopen($filename, 'wb');
    $url = "http://".$this->host."/cgi-bin/snapshot.cgi";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
    curl_setopt($ch, CURLOPT_USERPWD, $this->username . ":" . $this->password);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_HTTPGET, 1);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
    copy($filename, $path."/Doorbell.jpg");
}
 
  • Like
Reaktionen: kuzco-ip

Lithium07

Neuer User
Mitglied seit
17 Jan 2020
Beiträge
6
Punkte für Reaktionen
0
Punkte
1
Super Arbeit. Funktioniert mit der neuen VTO4202F sehr gut. Zwei Sachen hätte ich allerdings noch gefunden:

1. Auf dem Banana PI (Debian Buster, Armbian Linux, Little Endian) funktioniert die Version nicht. Der Fehler liegt beim PHP Befehl Pack()

PHP Warning: pack(): 64-bit format codes are not available for 32-bit versions of PHP in DahuaEventHandler.php on line 82

Ausgabe lscpu

Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Vendor ID: ARM
Model: 5
Model name: Cortex-A7

Hier jemand einen Tipp? PHP in 64Bit scheint nicht für die Version verfügbar zu sein.

2. Ein neues Event beim Tamper Alarm

Code:
2020-01-26 21:27:05.000000: Unknown event received

array(4) {

  ["id"]=>

  int(2)

  ["method"]=>

  string(24) "client.notifyEventStream"

  ["params"]=>

  array(2) {

    ["SID"]=>

    int(513)

    ["eventList"]=>

    array(1) {

      [0]=>

      array(4) {

        ["Action"]=>

        string(5) "Start"

        ["Code"]=>

        string(20) "ProfileAlarmTransmit"

        ["Data"]=>

        array(6) {

          ["AlarmType"]=>

          string(13) "PreventRemove"

          ["DevSrcType"]=>

          string(5) "Digit"

          ["LocaleTime"]=>

          string(19) "2020-01-26 21:27:04"

          ["SenseMethod"]=>

          string(13) "PreventRemove"

          ["UTC"]=>

          int(1580074024)

          ["UserID"]=>

          string(4) "Door"

        }

        ["Index"]=>

        int(1)

      }

    }

  }

  ["session"]=>

  int(2147483639)

}

20
 

Lithium07

Neuer User
Mitglied seit
17 Jan 2020
Beiträge
6
Punkte für Reaktionen
0
Punkte
1
Kleine Ergänzung: Auch auf dem Raspberry PI (3) im Docker Container hab ich das selbe Problem. Umstellen der Pack Funktion von J auf P hat leider auch nicht geholfen:
  • J - unsigned long long (always 64 bit, big endian byte order)
  • P - unsigned long long (always 64 bit, little endian byte order)
Das Problem scheint die 32 Bit Version von PHP zu sein, die die 64 Bit Codes nicht integriert hat:
 
Zuletzt bearbeitet:

philipp900

Neuer User
Mitglied seit
28 Feb 2009
Beiträge
17
Punkte für Reaktionen
2
Punkte
3
Ich denke ihr müsst die HEX Zahl in 2 32Bit Zahlen aufteilen und dann "N" statt "J" verwenden.

Habe auch noch 2 Events gefunden welche bei der Verwendung der App auftreten.
1. Stream in der App anzeigen. 2. Stream bzw. App wieder schließen

Code:
{"id":2,"method":"client.notifyEventStream","params":{"SID":513,"eventList":[{"Action":"Start","Code":"RequestCallState","Data":{"LocaleTime":"2020-01-26 17:48:54","UTC":1580057334},"Index":0}]},"session":26748672}
{"id":2,"method":"client.notifyEventStream","params":{"SID":513,"eventList":[{"Action":"Pulse","Code":"PassiveHungup","Data":{"LocaleTime":"2020-01-26 17:49:32","UTC":1580057372},"Index":0}]},"session":26748672}
 

riogrande75

Mitglied
Mitglied seit
30 Okt 2017
Beiträge
754
Punkte für Reaktionen
108
Punkte
43
Hab die fehlenden Events noch eingebaut. Wenn jemand spezielle Wünsche bzgl. Anzeige/Aufschlüsselung der Events hat, bitte ich um Info dazu.
 
  • Like
Reaktionen: kuzco-ip

Patt

Neuer User
Mitglied seit
19 Dez 2004
Beiträge
142
Punkte für Reaktionen
2
Punkte
18
Hallo,
hört sich interessant an. Könnt ihr mir als Laie mal ein paar Anwendungsbeispiele nennen, was ihr so damit anstellt?
Lieben Dank.
 

kuzco-ip

Mitglied
Mitglied seit
4 Feb 2019
Beiträge
305
Punkte für Reaktionen
16
Punkte
18
Könnt ihr mir als Laie mal ein paar Anwendungsbeispiele nennen, was ihr so damit anstellt?
z.B. sich eine email mit Snapshots der VTO und/oder anderen Kameras senden lassen wenn jemand klingelt oder den FP benutzt.
 
Zuletzt bearbeitet:

Lithium07

Neuer User
Mitglied seit
17 Jan 2020
Beiträge
6
Punkte für Reaktionen
0
Punkte
1
Habs nun auch auf dem Raspberry hinbekommen. Dazu hab ich die Zeile 82 durch folgenden Code ersetzt:
PHP:
        $header = pack("N",536870912);
        $header .= pack("N",1145588048);
Desweiteren habe ich die Zeile 138 angepasst und prüfe nur noch auf den Text "DI" (Vergleich ab substr, da mir die Forensoftware hier eine Fehlermeldung wirft:
PHP:
 ($data,0,4) == pack("N",536870912)){ # DH
Damit läuft das Script nun auch beim mir. Evtl. sind die zwei Änderungen für alle gut, denke die müssten auf 64 Bit System auch laufen (habs aber noch nicht ausprobiert)
 
Zuletzt bearbeitet:

philipp900

Neuer User
Mitglied seit
28 Feb 2009
Beiträge
17
Punkte für Reaktionen
2
Punkte
3
Ich habe das Script heute Nachmittag schon angepasst damit es für alle läuft und noch 2 kleine Fehlerbehebungen gemacht.
Rio wird es vermutlich morgen auf dem GIT updaten.
 
  • Like
Reaktionen: kuzco-ip

riogrande75

Mitglied
Mitglied seit
30 Okt 2017
Beiträge
754
Punkte für Reaktionen
108
Punkte
43
32Bit Fixes sind eingearbeitet - müsste also nun auch auf RPi&Co. laufen.
 

Lithium07

Neuer User
Mitglied seit
17 Jan 2020
Beiträge
6
Punkte für Reaktionen
0
Punkte
1
Ja, läuft nun auch ohne Änderung am RPI :) Danke!
 

jeezz

Neuer User
Mitglied seit
4 Jul 2019
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
Hallo, hätte mal eine ganz blöde Frag, wie bekomme ich das Script auf dem RPI zum laufen?

Ich habe aktuell auf dem RPI lighthttpd und PHP 7.3 installiert. Dann habe ich eine Testdatei mit <?php phpinfo(); ?> abgelegt und die funktioniert soweit. Wenn ich nun das Dahua Script ablege (IP und Zugangsdaten natürlich angepasst), dann bleibt beim Aufruf die Seite leer und das Ladesymbol läuft für immer. Woran könnte das liegen?
 

kuzco-ip

Mitglied
Mitglied seit
4 Feb 2019
Beiträge
305
Punkte für Reaktionen
16
Punkte
18
Das Script ist nicht für einen Webserver gedacht, sondern nur für die CmdLine.
 

anethum

Neuer User
Mitglied seit
16 Sep 2009
Beiträge
7
Punkte für Reaktionen
0
Punkte
1
Wie funktioniert der Skript genau? wird der per cron regelmäßig gestartet und guckt der ob events ankommen?
 

3CX PBX - GRATIS
Linux / Win / Cloud

Statistik des Forums

Themen
234,350
Beiträge
2,045,319
Mitglieder
353,978
Neuestes Mitglied
voipmo