Jump to content

PHP - was darf ich erwarten?


Recommended Posts

Hallo,

 

als ich von tinker in der CT las, war ich gleich angetan. ich bin gerade am Basteln eines Homecontrols. Klar, es gibt das schon einiges. Aber wie es oft so ist, nicht das was man möchte.

 

Meine Lösung sieht derzeit so aus: Ein Arudino Mini kommuniziert via seriell mit einem Linuxsystem (nächste Woche raspberry pi). Daten lesen und schreiben in die Datenbank erledigt ein Pythonskript. Das Zeitnahe bedienen eines Aktors über die Weboberfläche regelt SOAP. Also die PHP-Variableninhalte werde an Python-Variablen übergeben. Ich kann also künftig direkt mit PHP ansteuern? Das wäre schon was...

Gruß

Joachim Müller

Link to comment
Share on other sites

Servus,

 

also ich denke, dass es möglich sein wird. Es heißt, dass evtl sogar schon diese Woche die PHP Bindings fertig werden könnten... Ich freu mich auch schon sehr drauf! Hab heut auch schon meine 2te Lieferung bekommen...

 

Wie das letzt endlich aussieht bin ich auch mal gespannt. Gerade im Hinblick auf "Events"... Tue was, wenn die Helligkeit über 600 Lux steigt --> Rollo Runterlassen oder Tue was bei Tastendruck auf LCD-Taster1

 

Letztendlich kommuniziert man mit dem brick-daemon ja immer via tcp-ip. Das wird wohl auch über php machbar sein. ich bin auf jedenfall gespannt wie wir das nutzen können! Ich hätt jetzt selbst nur keine Ahnung wie man via php diese "speziellen" TCP-Pakete absetzen kann (sieh TCP-IP low-level Doku).

 

Gruß

Christian

 

Link to comment
Share on other sites

Und ich schätze immer noch, dass die PHP Bindings diese Woche verfügbar sein werden.

 

Hier mal ein Beispiel Programm, das die Versionsinformation und die aktuelle Position eine Linear Poti Bricklets ausliest.

 

<?php

require_once('Tinkerforge/IPConnection.php');
require_once('Tinkerforge/BrickletLinearPoti.php');

use Tinkerforge\IPConnection;
use Tinkerforge\BrickletLinearPoti;

$host = 'localhost';
$port = 4223;
$uid = '7jb';

$ipcon = new IPConnection($host, $port);
$lp = new BrickletLinearPoti($uid);

$ipcon->addDevice($lp);

echo "getVersion():\n";
var_dump($lp->getVersion());

echo "getPosition():\n";
var_dump($lp->getPosition());

?>

 

Hier die Ausgabe des Programms mit dem PHP Kommandozeilen Tool ausgeführt. Die Minimum PHP Version wird 5.3 sein. Das ganze funktioniert auch mit dem PHP Modul in Apache.

 

getVersion():
array(3) {
  ["name"]=>
  string(24) "Linear Poti Bricklet 1.0"
  ["firmwareVersion"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(1)
    [2]=>
    int(0)
  }
  ["bindingVersion"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(0)
    [2]=>
    int(0)
  }
}
getPosition():
int(43)

 

Hier noch ein Beispiel mit Callback

 

<?php

require_once('Tinkerforge/IPConnection.php');
require_once('Tinkerforge/BrickletLinearPoti.php');

use Tinkerforge\IPConnection;
use Tinkerforge\BrickletLinearPoti;

$host = 'localhost';
$port = 4223;
$uid = '7jb';

$ipcon = new IPConnection($host, $port);
$lp = new BrickletLinearPoti($uid);

$ipcon->addDevice($lp);

function cb_position($position) {
    echo "position changed: $position\n";
}

$lp->registerCallback(BrickletLinearPoti::CALLBACK_POSITION, 'cb_position');
$lp->setPositionCallbackPeriod(20);

$ipcon->dispatchCallbacks(-1);

?>

 

Und hier die Ausgabe nach Bewegen des Potis.

 

position changed: 45
position changed: 52
position changed: 56
position changed: 55
position changed: 48
position changed: 43
position changed: 39
position changed: 34
position changed: 30
position changed: 26
position changed: 23
position changed: 21
position changed: 20

 

Da PHP keine Threads unterstütz und die Workarounds alle recht plattformspezifisch sind muss man selbst dafür sorgen das Callbacks ausgeliefert werden.

 

Dafür ist die dispatchCallbacks Methode der IPConnection da. Der kann man ein Zeitspanne in Sekunden übergeben, die Callbacks ausgeliefert werden sollen bevor dispatchCallbacks returned. -1 wie im Beispiel bedeutet unendlich.

 

Falls ihr Vorschläge oder Kommentare dazu habe dann würde ich sie gerne hören.

Link to comment
Share on other sites

ja aber das war ja irgendwie klar, oder? Jeder der schon ein bisschen mit php rumgefrickelt hat weiß doch, dass ein Script nach dem "abarbeiten" idr. zuende ist...

 

Ich hab auch noch keine wirkliche Idee wie man das Nutzbar macht :). Eine kleine Anregung möchte ich aber noch liefern:

http://winbinder.org

Das ist ein System um nativ wirkende (!!) Windows-Anwendungen zu schreiben. Hab auch schon mal kurz mit rumgespielt und war mittelmäßig bis stark beeindruckt. Leider gibt’s seit fast 2 Jahren nichts neues mehr von dem Projekt.

 

Gruß

Christian

Link to comment
Share on other sites

Die Callback Lösung ist nicht wirklich berauschend. Wenn man das in eine Webapplikation einbauen würde, was bei PHP ja zu erwarten ist, ist das aus meiner Sicht unbenutzbar ?

 

Der Sinn der Callbacks ist, dass du nicht pollen musst um Ereignisse mitzubekommen. Man kommt aber an fasst alle Informationen auch ohne Callbacks. Typischerweise hast du da ein Programm das länger läuft wenn du Callbacks nutzt.

 

Im Rahmen einer Webapplikation wird aber PHP immer nur kurz ausgeführt um die Webseite zu erstellen. Dort hast du kein lange laufendes PHP Programm, daher machen dort Callbacks wenig Sinn. Oder verstehe ich jetzt hier was falsch?

 

In einem lange laufenden Standalone PHP Programm musst du eben dafür sorgen dispatchCallbacks regelmässig aufzurufen, wenn du Callbacks nutzt. Das ist bisher die portabelste Lösung auf die ich bis jetzt gekommen bin.

 

Christian, mir ist nicht ganz klar was du mir mit WinBinder sagen willst. Ich sehe zumindest nichts was dich hindern sollte WinBinder und Tinkerforge in einem Programm zu verwenden.

Link to comment
Share on other sites

Christian, mir ist nicht ganz klar was du mir mit WinBinder sagen willst. Ich sehe zumindest nichts was dich hindern sollte WinBinder und Tinkerforge in einem Programm zu verwenden.

 

Ne ich wollte darauf auch gar nicht hinaus sondern einfach mal auf dieses Projekt hinweisen bei dem man mit PHP an sich Windows-Anwendungen (mehr oder weniger) entwickeln kann. War mir bis letzte Woche völlig fremd dass so etwas geht :)

Link to comment
Share on other sites

Wenn du WebSockets verwendest hast du aber auch ein PHP Programm auf dem Server das dauerhaft (zumindest länger) läuft und dann kannst du in der Schleife die die Clients bedient auch zwischendurch mal dispatchCallbacks() aufrufen und alles ist gut :)

Link to comment
Share on other sites

ich hatte da jetzt eher an einen mehr oder weniger transparenten webserver gedacht, für den es dann javascript bindings gibt. Also dass man anstatt Phyton/Java/C... zu nutzen, einen Browser und Javascript nimmt.

Aber ich sehe ein, dass das wenig mit php zu tun hat :-)

Link to comment
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...