Jump to content

[PHP]Motion Detector gibt keine Ausgabe zurück


Gast LinTec

Recommended Posts

Hallo zusammen,

bin grade dabei, mich mit PHP auseinander zusetzen und wollte das Beispiel für den MD mal ausprobieren. Problem ist, wenn ich die PHP Datei via Eclipse oder Browser aufrufe, dann passiert nichts. Noch nicht mal ein echo wird ausgegeben.

 

Wenn ich allerdings das Beispiel für den MasterBrick probiere, dann geht alles. Nur nicht mit dem MD.Die UID ist korrekt und auch die Angaben für HOST und PORT.

 

Das Apache Error Log zeigt auch keine Hinweise.

 

Kennst jemand von euch das Problem?

 

Gruß

LinTec

 

Link zu diesem Kommentar
Share on other sites

Hallo LinTec,

 

ich arbeite auch mit Tinkerforge und PHP und muss sagen, dass du mit dem Browser da nicht arbeiten kannst. Ich realisiere meine Projekte mit XAMPP unter Windows und sowie mit MAMP unter Mac und LAMP unter Linux (Raspberry Pi).

Gehen bei dir andere PHP-Seiten im Browser?

Also einfach sowas:

<?php
echo "Hallo Welt!";

 

Du kannst dir im Browser nur PHP-Seiten mit endlicher Scriptlaufzeit anzeigen lassen, sonst wartet der Browser bis zum Timeout.

Ich führe alle meine PHP-Scripte mit endloser Laufzeit generell unter Linux/Mac in der Console/Terminal aus. Auf Windows verzichte ich da komplett.

 

Was willst du denn machen?

Wie sieht dein Code aus?

Hast du Error-Reporting angestellt (in PHP direkt nach <?php)?

error_reporting(E_ALL);
ini_set("display_errors", 1);

 

Gruß,

Nemo

Link zu diesem Kommentar
Share on other sites

Hallo Nemo,

 

ich würde gerne das PHP Script mit click auf einem Button starten und beenden.

Der MD soll in Verbindung mit einem IQR als Alarmanlage fungieren. Wenn ich das Haus verlasse, dann will ich das Program starten, solange ich noch in meinem WLAN bin und somit den Alarm einschalten.

 

Alle anderen PHP Scripte die ich schreibe funktionieren ohne Probleme. Das Error Reporting habe ich nicht eingeschaltet.

 

Hier der Code

<?php
require_once 'Tinkerforge/IPConnection.php';
require_once 'Tinkerforge/BrickletMotionDetector.php';

use Tinkerforge\IPConnection;
use Tinkerforge\BrickletMotionDetector;

const HOST = "localhost";
const PORT = 4223;
const UID = "kg6"; // Change to your UID

$ipcon = new IPConnection(); // Create IP connection
$md = new BrickletMotionDetector(UID, $ipcon); // Create device object

$ipcon->connect(HOST, PORT); // Connect to brickd
// Don't use device before ipcon is connected

// Callback function for end of detection cycle
function cb_detection_cycle_ended()
{
echo "Detection Cycle Ended (next detection possible in ~3 seconds)\n";
}

// Callback function for detected motion
function cb_motion_detected()
{
echo "Motion Detected\n";
}

// Register detected callback to function cb_motion_detected
$md->registerCallback(BrickletMotionDetector::CALLBACK_MOTION_DETECTED, 'cb_motion_detected');

// Register detection cycle ended callback to function cb_detection_cycle_ended
$md->registerCallback(BrickletMotionDetector::CALLBACK_DETECTION_CYCLE_ENDED, 'cb_detection_cycle_ended');

$ipcon->dispatchCallbacks(-1);
echo 'IPConnection destroyed';
?>

 

Ich verwende Zend als Entwicklunsgumgebung auf einem Mac. Die Scripte führe ich in Safari und Firefox aus.

 

Ich probiere es mal mit dem Error Reporting. Mal sehen, was da raus kommt.

 

Aber was ich nicht verstehe ist, dass beim MD die Callbacks eine wichtige Rolle spielen. Das Program wartet auf den Callback und ist somit unendlich, wie soll das dann mit PHP funktionieren (Ajax???)

Link zu diesem Kommentar
Share on other sites

Hallo LinTec,

 

das du einen Mac verwendest finde ich praktisch. :-)

Die Callbacks spielen eine so wichtige Rolle, da sie sich melden und nicht ständig vom Programm der Status abgerufen werden muss.

Genau, die Scriptlaufzeit ist unendlich. Mit PHP realisiert man das über das Terminal, da dort die Scripte keinen Timeout bekommen und auch nicht weiter stören.

- Öffne dein Terminal

- Navigiere in den Ordner in dem dein Script liegt

- führe das Script mit "php scriptname.php" aus. (ohne "")

Dann wirst du sehen, dass das Script dir auch die echo Ausgaben in der Konsole zeigt, allerdings wird ein Zeilenumbruch dann mit \n erreicht und nicht mehr mit <br />

 

Wenn du auf einer Webseite den momentanen Status abrufen willst, kannst du auch jede Veränderung in eine Datenbank schreiben und aus dieser dann die Infos auslesen.

 

Gruß,

Nemo

Link zu diesem Kommentar
Share on other sites

Hallo Nemo,

aber wie kann ich das Programm über den Apache starten und stoppen? Ich habe die Funktionalität bereits in C geschrieben. Ich dachte mir jetzt, dass ich mit passthru das C Programm ausführen kann, aber das funktioniert auch nicht.

 

Gruß,

Lintec

Link zu diesem Kommentar
Share on other sites

Hallo Nemo,

ich habe es mit shell_exec probiert. Wenn ich index.php im Terminal aufrufe, dann funktioniert es, aber wenn ich es über Apache im Browser aufrufen, dann bekomme ich nur den HTML Teil angezeit und das Programm rührt sich nicht.

 

Kann es an der Apache oder Browser Konfiguration liegen? Oder kann es sein, dass mein Browser/Apache eine andere PHP Version nutzt als die Shell? Kann man das prüfen?

 

Gruß,

Lintec

Link zu diesem Kommentar
Share on other sites

Hallo Lintec,

 

mich würde es wundern, wenn du verschiedene Versionen von PHP verwendest. Um es aber auszulesen kannst du die Funktion phpversion(); aufrufen und die liefert dir dann Klarheit.

Was noch sein kann ist, dass der Benutzer mit dem du im Terminal bist den shell_exec() Befehl ausführen darf und der Browser nicht.

 

Gruß,

Nemo

Link zu diesem Kommentar
Share on other sites

Hallo LinTec,

 

ich habe mich selber damit noch nicht befasst, aber auf die schnelle konnte ich das finden:

Link 1 und Link 2.

Beide befassen sich mit dem Thema, alternativ Google fragen.

 

Ansonsten ein paar Tipps:

- php save mode ausschalten

- alle Fehler anzeigen lassen

- nach den Berechtigungen deines ausführenden Webserver-Benutzers schauen ob dieser Scripte ausführen darf.

 

Gruß,

Nemo

Link zu diesem Kommentar
Share on other sites

Hallo Nemo,

 

das mit den Callbacks funktioniert jetzt. Das Programm läuft ewig.

Der Witz ist aber, ich weiss nicht warum. Ich habe nichts an der PHP oder Apache Konfiguration geändert. Ich bekomme zwar nicht eine einzige Anzeige im Browser, aber ich habe es jetzt mal mit einem Industriel Quad Relay + Led kombiniert, wenn der Motion Detector anschlägt, dann geht die LED an. Das war zwar auch vorher so, aber jetzt funktioniert es. ???

 

Ich danke dir auf jeden Fall für deine Hilfe. Habe wieder einiges dazulernen dürfen.

 

Gruß,

LinTec

Link zu diesem Kommentar
Share on other sites

Hallo LinTec,

 

:D das ist ein PHP typisches Verhalten.

Du hast das Script durch den Browseraufruf angestoßen.

Der Browser wartet 30 sec und meldet keine Rückmeldung, da dass Script von PHP noch ausgeführt wird. Danach ist der Browser außen vor, PHP allerdings arbeitet weiter.

Ich habe danach mein Pi immer neu gestartet, da ich nicht wusste wie ich das Script beende, obwohl ich weiß, dass es da Prozess IDs gibt und man darüber die Ausführung irgendwie stoppen kann.

Mittlerweile arbeite ich mit screen, das ist ein Linux Programm um ein Terminal zu öffnen dessen Ausführung nicht abgebrochen wird sobald die SSH-Verbindung abbricht oder beendet wird.

 

Eine Idee die ich jetzt noch hätte wäre ein zweites PHP script zu schreiben, welches das erste mit shell_exec() Befehlen über Ajax steuert und so keine unendliche Laufzeit hat um etwas in Browser darzustellen.

 

Eine weitere Möglichkeit wäre mit einer Datei oder einer Datenbank zu arbeiten welche die unendlich ausgeführte Datei z.B. alle 5 Sekunden ausließt und wenn eine 1 drin steht sich selbst beendet.

 

Gruß,

Nemo

Link zu diesem Kommentar
Share on other sites

Hallo Nemo,

ich glaube, dass ich mit PHP zu keinem vernünftigen Ergebnis komme, ohne irgendwelche Workarounds zu bauen. Ich war am Überlegen, den Apache neu zu starten, da dann das Script beendet wird. Problem, um den Apache neu zu starten, braucht es SUDO. Das würde auch nur mit Workarounds funktionieren.

 

Das mit PHP und den Callbacks funktioniert nur, wenn das Program nach ausführen des Callbacks sofort mit EXIT() beendet wird. Aber ich möchte über einen Button auf der Website das Programm beenden.

 

Ich schaue mir jetzt mal JAVAScript an, vielleicht erziele ich damit das gewünschte Ergebnis.

 

Gruß,

André

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...