Snapshot abholen mit php möglich?

Hallo in die Runde und speziell an die php-Mächtigen hier.

Ich bin betreffs php noch ein sehr blutiger Anfänger. Ich möchte mit einem php-Script den Snapshot von einer Kamera abholen und im Browser wiedergeben. Es gelingt mir einfach nicht! Es klappt mittels html-Code und es klappt mit einem schon auf dem Server vorhandenen jpg-Bild. Die Abfrage von der Kamera direkt mit …\snap.jpg funktioniert nicht.
Das jemand damit schon Erfahrungen oder geht das aus technischen Gründen nicht?

Ich wäre sehr dankbar für jede Hilfe!

Motte

mir ist klar, warum der nicht bei mir ran kommt - ich habe so etwas fuer Webcamcaches erstellt (Geocaching)

wenn ich das Snap-Bild rauskopiere

http://192.168.xxx.xxx:aaaaa/tmpfs/snap.jpg?usr=<USER>&pwd=<PWD>&<langeNummer>

willst Du es ueber das Internet holen… musst Du den im Router freiegegebenen DYNDNS-Namen:Port nehmen, dass der Server von extern drauf kommt. Versuchst Du es auf Deinem PC selbst… versuche mal, wenn Du nur User und Passwort uebergibst, ohne Zeitpunktangabe

Ja, schon klar. Also nochmal präziser gefragt: Snapshot abholen (lokal oder über Internet) funktioniert im Prinzip. Auch mit Passwortübergabe. Eine entsprechende html-Datei auf dem Server tut dies anstandslos. Nun wollte ich aber das gleiche mittels einer php-Seite bewerkstelligen, das Bild also serverseitig direkt von der Kamera abfragen und an eine Website übergeben. Oder, was auch denkbar wäre, auf dem Server speichern und dann die Website darauf zugreifen lassen.
Sobald der snapshot-Code in einer php-Seite ausgeführt wird, kommt kein Bild von der Kamera bzw. ist gar kein Zugriff auf die Kamera möglich. Benötigt die Kamera unbedingt html?

VG
Motte

Hi,
wenn ich es richtig verstehe benötigst du das (was ich bei mir so laufen habe):

function camera_takepicture($savePath)
{

$cameraData = array("ip" =&gt; "192.168.178.200", "port" =&gt; 80, "username" =&gt; "USERNAME", "password" =&gt; "PASSWORD");

$URL='http://'.$cameraData["ip"].':'.$cameraData["port"].'/tmpfs/snap.jpg';

$headers = array(
'Content-Type:application/json',
'Authorization: Basic '. base64_encode($cameraData["username"].":".$cameraData["password"]) // &lt;---
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);   //get status code
$result=curl_exec ($ch);
   
$myfile = fopen($savePath, "w");
fwrite($myfile, $result);
fclose($myfile);

curl_close ($ch);

}

Damit nimmst du das aktuelle Bild der Kamera auf und speicherst es dort hin, wo $savePath hinzeigt, zB $savePath="/var/www/test.jpg".

Falls du Fragen hast gib Bescheid :).

Viele Grüße
Marmil

Hallo Marmil,

genauuuuuu das ist es, was ich suchte. Vielen Dank!!! Leider komme ich nicht sofort zum Umsetzen bzw. Testen bei mir, aber in den nächsten Tagen leg ich los. Ich melde mich dann wieder, mit Erfolgsmeldungen oder schluchzend, flehend …

Viele, dankbare Grüße

Motte

Hallo Marmil,

habe den Code jetzt getestet, leider ohne Erfolg. Es wird nicht einmal der Snapshot abgeholt und gespeichert. Sicher habe ich irgendwo einen Denkfehler?! Kannst Du bitte noch mal mein Script prüfen:

<?php
function camera_takepicture($savePath)
{

$cameraData = array(„ip“ => „adresse“, „port“ => 8081, „username“ => „gast“, „password“ => „gast“);

$URL=‚http://‘.$cameraData[„ip“].’:’.$cameraData[„port“].’/tmpfs/snap.jpg’;

$headers = array(
‚Content-Type:application/json‘,
'Authorization: Basic '. base64_encode($cameraData[„username“].":".$cameraData[„password“]) // <—
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //timeout after 30 seconds
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code
$result=curl_exec ($ch);

$myfile = fopen($savePath, „w“);
fwrite($myfile, $result);
fclose($myfile);

curl_close ($ch);

}

camera_takepicture("/alarm/test.jpg");
?>

Hi,
ich habe es gerade bei mir ausprobiert und es ging.
Dabei habe ich natürlich an meine Gegebenheiten angepasst. Und zwar folgende Parameter:
ip (192.168.17.50 )
port (80)
username (admin)
password (passwort halt ^^ )
pfad (test.jpg)

Hat die PHP Datei Schreibrechte um die Datei zu erstellen?
Hast du in deinem Webserver die CURL extension aktiviert ( über phpinfo(); und dann unter cURL support ) ?

Hallo und danke für die schnelle Antwort!
Mein Server ist bei 1&1, cURL support = enabled. Wie ich kann ich Schreibrechte überprüfen?

VG
Motte

Nachtrag:
Der Zugriff auf die Cam scheint nicht zu funktionieren. Wenn ich in der php keinen Unterordner angebe, sondern wie Du nur den Dateinamen, dann wird die „test.jpg“ angelegt. Aber sie beibt 0 kb groß, also leer.

Ich weiß nicht genau wie du darauf arbeitest, aber entweder über ein FTP Programm wie Filezilla, da kannst du die Rechte mit Rechtsklick->Dateiberechtigung prüfen oder du baust die Funktion ein wenig um:

Mit deinem Code von oben so:

if ( !is_writable("/alarm/") )
{
echo „Ordner nicht beschreibbar!“;
exit();
}
camera_takepicture("/alarm/test.jpg");

Dann sollte die Datei meckern wenn sie den Ordner nicht beschreiben kann.
Sag Bescheid wenn es läuft oder auch wenn nicht dann sehen wir weiter :).

LG

Ok, Codeschnipsel ergibt „Ordner nicht beschreibbar“. Ich greife mit dem Total Commander mit FTP zu. Aber gut, lasse ich das Bild halt in der Wurzel, dort wird es ja angelegt.
Warum gibt mir die Zeile „echo $URL;“ nichts aus? Ich wollte den konkreten Aufruf zur Cam mal prüfen?

Wenn du innerhalb der Funktion etwas ausgibst, musst du auch beim Funktionsaufruf ein echo davor setzen also
echo camera_takepicture("/alarm/test.jpg");

Ansonsten landet die Ausgabe innerhalb der Funktion im nichts.

LG

Hmmm, läuft bei mir dennoch nicht. Aber langsam hab ich ein schlechtes Gewissen, wenn ich Dich so lange in Anspruch nehme. Ich glaube, ich höre erst mal auf. :icon_frown:

Kleine Abschlussmeldung für alle anderen Foren-User:

Wir hatten inzwischen per PN weiter kommuniziert und schließlich das Problem lösen können. Das von marmil gepostete Script funktioniert einwandfrei! Es lag am Port für den zugriff von außen. Eine Änderung von 85 auf 8085 brachte den Erfolg, warum auch immer.

Vielen Dank an marmil für die Hilfe!

motte

Hallo zusammen.
Bei mir lief das Script auch nicht. Der Server hat sich primär am Login verschluckt, Bilder ohne auth funktionieren mit dem Script (bei mir) Problemlos.

Die Cams sind Physisch am Arsch der Welt via PFSense und bestenfalls mit HSDPA durch nen Tunnel angebunden. Da heisst es Traffic Sparen und möglichst viel auf der PFSense speichern. Direkten Zugriff auf das INet haben die Cams nicht, dafür hat einer der Webserver ein Beinchen im Tunnel.

Meine Lösung:

<?php
header(‚Content-Type: image/jpeg‘);
echo file_get_contents („http://10.4.2.30/tmpfs/snap.jpg?usr=admin&pwd=instar“);
?>

Mit F5 gibt’s dann auch ein aktelles Bild.