Wie z.B. Scripte für eine VTO4202F-P (Dahua) verarbeiten

tomi6

Neuer User
Mitglied seit
25 Mrz 2020
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Hi, natürlich habe ich ip und Passwort korrigiert. Wenn ich das Script mit php aufrufe sieht es folgendermaßen aus:

Code:
[/share/Web] #  /mnt/ext/opt/apache/bin/php -v
PHP 7.3.7 (cli) (built: Jul  8 2021 05:35:27) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
[/share/Web] #  /mnt/ext/opt/apache/bin/php VTO.php
<** Dahua VTO Eventempfaenger START **>

Fatal error: Uncaught Error: Call to undefined method Dahua_Functions::Main() in /share/CACHEDEV1_DATA/Web/VTO.php:5
Stack trace:
#0 {main}
  thrown in /share/CACHEDEV1_DATA/Web/VTO.php on line 5
[/share/Web] #


..................................................
´Nachtrag --> sorry, da hat sich wohl bei mir ein Fehler im Script eingeschlichen.
Scheint jetzt zu laufen, war am Anfang etwas verzögert ...
 
Zuletzt bearbeitet:

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
113
Punkte für Reaktionen
14
Punkte
18
Hi,

das sieht jetzt so aus, als wenn das Skript startet. Allerdings hört hier mein Fachwissen auf. Irgendwie scheint das Skript, für mich, als Webseite aufgerufen zu werden.
Letzter Versuch meinerseits:
/usr/bin/php /Pfad zum Skript/vto.php

Dirk
 

tomi6

Neuer User
Mitglied seit
25 Mrz 2020
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Hallo, leider werden bei mir die Snapshots und der mp4 Stream nur mit 1 KB abgespeichert?
Pfad müsste stimmen sonst wäre ja die Datei mit 1 KB nicht vorhanden. Hat jemand eine Idee warum das eventuell nicht funktioniert?
Danke
Tomi
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
113
Punkte für Reaktionen
14
Punkte
18
Hi,

erst einmal wäre es gut, wenn Du die Lösung deines ersten Problems bekannt gibst (-:
Stell mal Deine Codeschnipsel (als Spoiler) hier rein.
Welche Kamera besitzt Du?

Dirk
 

tomi6

Neuer User
Mitglied seit
25 Mrz 2020
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Hallo Dirk, die Lösung meines ersten Problems habe ich als Nachtrag im Post eingetragen. Hat sich wohl mit deiner Antwort überschnitten.
Sorry dafür. Ich hab da am Script "gebastelt" und mir dadurch den Fehler eingebaut.

Zum 1 KB Problem - also die Kamera ist jene der VTO4202F-P und am Originalscript habe ich jetzt nur den Pfad für die Speicherung angepasst:
Code:
function SaveSnapshot($path="/share/Public/VTO/snapshots/") # Screenshots aufnehmen
    {
    $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");
    }

Danke
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
113
Punkte für Reaktionen
14
Punkte
18
Hi,

wenn Du http://deinBenutzername:dein [email protected] IP/cgi-bin/snapshot.cgi in deinen Browser einträgst hast Du ein Bild?

Du kannst Deine Funktion ja mal so ändern:
function SaveSnapshot($path="/share/Public/VTO/snapshots/")
{
$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);

// prüfen, ob ein Fehler aufgetreten ist
if(!curl_errno($ch))
{
$info = curl_getinfo($ch);
echo 'Es wurden ' . $info['total_time'] . ' Sekunden benoetigt fuer einen Request an Snapshot ' . $info['url'] ."\n";
}

// HTTP-Status-Code prüfen
if (!curl_errno($ch)) {
switch ($http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE)) {
case 200: # OK
break;
default:
echo 'Unerwarter HTTP-Code Snapshot: ', $http_code, "\n";
}
}
curl_close($ch);
fclose($fp);
copy($filename, $path."/Doorbell.jpg");
}

Alternativ:
curl_setopt($ch, CURLOPT_USERPWD, $this->username . ":" . $this->password);
durch
curl_setopt($ch, CURLOPT_USERPWD, "dein Benutzername:dein Passwort");
ersetzen.

Dirk
 

tomi6

Neuer User
Mitglied seit
25 Mrz 2020
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Hallo Dirk, vielen Dank für deine Geduld. Folgender Fehler wurde ausgegeben: Unerwarter HTTP-Code 302.
Wie sollte es anders sein - der Fehler lag wieder mal an mir.
Ich habe bei der VTO https aktiviert.
Lässt sich der Code hierfür anpassen? Ich hätte es gerne aktiv.
RecordStream funktioniert aber immer noch nicht. Ich erhalte zwar eine MP4 Datei mit knapp 4 MB - aber die lässt sich nicht richtig abspielen.
Sieht aus als ob die erste Sekunde (Bild ist ersichtlich) immer wiedergegeben wird ...
Im Browser erhalte ich einen Livestream unter der URL:
Code:
http://192.168.178.111/cgi-bin/mjpg/video.cgi?channel=1&subtype=1
Recht herzlichen Dank
Tomi
 
Zuletzt bearbeitet:

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
113
Punkte für Reaktionen
14
Punkte
18
Hi,

das hat nichts mit Geduld zu tun (-:
Als ich angefangen habe, hat man mir auch geholfen.

Sollte Dein Skript auch mit https laufen und nur der Snapshot Probleme machen ändere bitte die folgende Zeile in der Funktion Snapshot ab:

$url = "https://".$this->host.":443/cgi-bin/snapshot.cgi";
---------------------------------------------------------------------------------------------------------------------------------------------------------
Wenn Dein Skript nach Umstellung auf https gar nicht mehr läuft ersetze mal Zeile 4 mit diesem Code:

$Dahua = new Dahua_Functions("deine IP:443", "dein Benutzername", "dein Passwort"); # VTO's IP and user/pwd

und ändere bitte die folgende Zeile in der Funktion Snapshot ab:

$url = "https://".$this->host."/cgi-bin/snapshot.cgi";
----------------------------------------------------------------------------------------------------------------------------------------------------------
Bzgl. Stream ersetze die Funktion RecordStream:

function RecordStreamVTO(){
echo "Starting ffmpeg...\n";
echo shell_exec("/usr/bin/ffmpeg -loglevel warning -guess_layout_max 0 -i 'rtsp://".$this->username.":".$this->password."@deine IP:554/cam/realmonitor?channel=1&subtype=1' -vcodec copy -acodec ac3_fixed -strict -2 -b:a 384k -t 15 '/DoorBell_".date("Y-m-d_H-i-s").".mp4'");
}

-t15 => 15 Sekunden Aufnahme

Sollte ffmpeg nicht installiert sein, musst Du dieses tun.

Nur so zur Info:
Es kann sein, dass meine Art der Lösung nicht die beste ist, aber es funktioniert.

Dirk
 

tomi6

Neuer User
Mitglied seit
25 Mrz 2020
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Hi Dirk, irgendwie stecke ich hier fest und ich überlege schon ob ich https doch deaktivieren muss. Das Script selbst läuft. (Zeile 4 wird nicht verändert)
Allerdings funktioniert das Umstellen auf https auch nicht mit Portangabe.
Habe dann in php in die Richtung
Code:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  false);
versucht. Aber bis jetzt bin ich nicht weiter gekommen. Die Bilder haben leider immer nur 0 KB.

Beim Video gibt es noch ein Problem mit dem Codec: Unknown encoder 'ac3_fixed'
Sorry aber ich bin PHP Newbie ...
Tomi
 

riogrande75

Aktives Mitglied
Mitglied seit
30 Okt 2017
Beiträge
1,185
Punkte für Reaktionen
213
Punkte
63
Dass das mit dem Port-Umstellen alleine für https nicht reicht, ist klar.
Hab vor einiger Zeit mal sowas (php-curl -> https) für etwas anderes gebaut - muss mir mal die Codeschnipesl raussuchen und dann hier posten.

Das mit den 0kB könnte aber auch ein (Schreib-)Rechte Thema sein. Versuch das mal auf einen Pfad zu legen, wo du bzg. da Script garantiert Schreibrechte hat.
 

tomi6

Neuer User
Mitglied seit
25 Mrz 2020
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Hallo riogrande75,
für einen passenden https code wäre ich sehr dankbar.
Bezüglich (Schreib-)Rechte. Soviel ich verstehe, kann das kein Thema sein. Der Pfad ist der Selbe, an den die Snapshots ohne https korrekt erstellt werden.
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
113
Punkte für Reaktionen
14
Punkte
18
Hi Tomi,

auch ich habe keine Ahnung von PHP (-:
Habe viel ausprobiert. Suche mal nach curl und PHP. Da wirst Du bestimmt fündig. Hier wird Dir @riogrande75 aber bestimmt helfen.
Bzgl. ffmpeg musst Du ausprobieren. Entweder Codec nach installieren, einen anderen Codec versuchen oder den Teil " -acodec ac3_fixed" mal weglassen. Auch hier habe ich viel ausprobiert, weil ich keine Ahnung habe (-:

Habe noch mal geschaut. Versuch es mal mit:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

Dirk
 
Zuletzt bearbeitet:

riogrande75

Aktives Mitglied
Mitglied seit
30 Okt 2017
Beiträge
1,185
Punkte für Reaktionen
213
Punkte
63
Hab das nun gefunden, was ich damals eingestellt hatte (war aber ein anderes embedded Linux System, kein's von Dahua):
PHP:
curl_setopt($ch, CURLOPT_URL, $website . "/login/home_login_admin.htm");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIE, $cookie);  //sende Cookie vom vorherigen Login mit!
$result = curl_exec ($ch);
curl_close($ch);

Hoffe ihr könnt damit etwas anfangen.
Ich rate aber, der Einfachheit wegen, im internen LAN bei HTTP zu bleiben. Versuch mal, aus ner HTTPS Verbindung etwas zu debuggen...o_O
 

ramazotti7

Neuer User
Mitglied seit
14 Feb 2014
Beiträge
4
Punkte für Reaktionen
0
Punkte
1
Hallo Dirk,
ich habe Eure Ausführungen mit Spannung gelesen und möchte das auch bei mir unbedingt einrichten (z.B. eine Email mit Snapshot). Ich habe auch eine Synology auf der ich das gerne laufen lassen möchte.
Hierzu habe ich die Webstation installiert, aber was nun? Wie lasse ich das Script von riogrande75 automatisch ausführen?
Ich freue mich über Deine Antwort
Lg Rainer
 

DirkMa

Neuer User
Mitglied seit
4 Apr 2016
Beiträge
113
Punkte für Reaktionen
14
Punkte
18
Hallo Rainer,

Webstation benötigst Du nicht. Benötigt wird PHP7.3
Anschließend passt Du das Event-Haendler Script an (Benutzername, Passwort, Pfad...)
Dieses Script startest Du dann in der Aufgabenplanung der Synology: php scriptname.php

Lies diesen Thread genau durch!

Für weitere Fragen einfach melden. Helfe gerne, aber es steht hier schon einiges. Ich hatte im Vorfeld auch keine Ahnung. Wird schon (-:

MfG

Dirk
 

Erhalten Sie 3CX für 1 Jahr kostenlos!

Gehostet, in Ihrer privaten Cloud oder on-Premise! Ganz ohne Haken. Geben Sie Ihren Namen und Ihre E-Mail an und los geht´s:

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.
oder via