Zum Inhalt springen

[Tutorial] Raspi: Steuern und Messen mit PHP

Quelle:

http://www.forum-raspberrypi.de/Thread-tutorial-raspi-steuern-und-messen-mit-php

Hallo Leute,

das folgende Tutorial zeigt euch, wie ihr mit Hilfe von PHP einfache Befehle dynamisch auf dem Raspberry Pi ausführen könnt. Das Tutorial ist vor allem für PHP Neulinge bzw. Anfänger gedacht und entstand unter Nutzung der Wheezy Distribution, es kann allerdings in abgeänderter Form, sicherlich auch für andere Distributionen als Inspiration dienen.

Das meiste in diesem Tutorial lässt sich über das Terminal/Nano erledigen. Wer möchte, kann allerdings auch andere Tools nutzen.

Was das Tutorial nicht ist
Obacht! Das Tutorial ist keine Schritt für Schritt-Anleitung für die Umsetzung der Heimsteuerung, die ich hier vorgestellt habe. Mit einwenig Geduld und dem Wissen, das ihr euch hier aneignen könnt, könnt ihr das aber mindestens genauso gut umsetzen. Wer keine Lust hat, die Erklärungen zu lesen, kann auch einfach die Code-Beispiele rauskopieren und rum probieren. Ich gehe nur auf die wichtigsten Befehle ein und das auch nur sehr kurz und knapp. Wenn ihr weitere Informationen benötigt, schaut doch im PHP Manual nach.

Quelltexte
Am Ende des Tutorials ist eine Quelltext Datei, die alle vorgestellten Funktionen beinhaltet. Ihr könnt diese ruhig als Anreiz nutzen. Icon_smile

Achtung! Die Beispiele hier sind sehr simpel gehalten. Sie sind nur zunächst nur zum Verdeutlichen und ausschließlich für das lokale Netzwerk gedacht! Den Raspberry also nicht öffentlich zugänglich machen!

Grundvoraussetzungen

  1. Raspberry Pi
  2. Eingerichteter HTTP-Server inkl. PHP (Empfehlung meinerseits: Lighttpd + php5-cgi)
  3. Nano oder anderen Text-Editor
  4. Grundkenntnisse in Bash und HTML sind wünschenswert

Inhalte
Hello World! – PHP Crashkurs

  1. echo
  2. Varaiablen & Arrays
  3. $_GET[]

Teil 1: System Kommandos ausführen

  1. Ausführen von ping google.de und Ausgabe
  2. Integration in HTML
  3. dynamisches Ausführen von ping über HTML-Formular

Teil 2: GPIO

  1. GPIO auslesen

Hello World – PHP Crash Kurs
Nach erfolgreicher Installation eures Servers geht ihr in dessen Dokumenten-Verzeichnis. Bei mir ist das /var/www.

cd /var/www

Mit ‘nano index.php’ eröffnen wir eine neue Datei und schreiben nur folgenden Code rein:

<?php
echo "Hello World!";
?>

Nun speichern wir dies mit STRG+O ab und öffnen nun unseren Browser: http://raspberrypi:8080/ (Die Adresse und der Port können natürlich von euer Konfiguration abweichen).
Anschließend solltet ihr eine weiße Seite mit dem Inhalt “Hello World!” sehen.

Mit dem <?php ?>-Tag markiert ihr mehr oder weniger euren PHP-Code. Damit weiß der Interpreter was er zu tun hat, ‘echo’ ist wie in vielen anderen Sprachen auch, für die Ausgabe verantwortlich. Jeder Befehl wird in PHP mit einem Semikolon ‘;’ abgeschlossen.

Nun gehen wir zurück in die index.php und ändern den Quelltext wie folgt ab:

<?php
$var=1;
echo $var;
?>

$var ist eine Variable, diese wird durch das $-Zeichen markiert. Mit Variablen könnt ihr beispielsweise Rechnungen oder einfach nur Ausgaben beeinflussen. Wenn ihr nun den Browser öffnet, sollte nur eine 1 erscheinen.

Mit PHP lässt sich mit Variablen auch sehr leicht rechnen:

<?php
$var=1;
$number=2;
echo $var+$number;
?>

Weitere Rechenoperatoren sind unter anderem: ‘-‘, ‘*’, ‘/’

Es gibt eine besondere Form von Variablen. Das sind Arrays. Mit Arrays könnt ihr mehrere Werte zusammenfassen. Das ist sinnvoll wenn beispielsweise Werte eines besonderen Typs gespeichert werden sollen.

<?php

$array = array("Anton", "Petra", "Hans");

echo $array[2];
?>

Wenn ihr dies nun abspeichert und den Browser auf den Raspi richtet, solltet ihr “Hans” sehen. Arrays werden in PHP ab 0 gezählt. Ändert die Zahl in den Klammern bei echo $array[] ab und schaut was passiert.

$_GET[]
Es gibt einen System-Array der sehr hilfreich ist und im Laufe des Tutorials sicherlich mehrmals vorkommen wird: $_GET.

$_GET symbolisiert die übergebenen GET-Parameter aus der URL. Aber was sind das für Parameter?

Ruft einfach mal folgenden Link auf: http://www.google.de/?q=Hans

Es erscheint die Google Webseite, mit dem Ausgefüllten Suchfeld. Mit Hilfe von GET-Parametern lassen sich Informationen an den Server übertragen. Das ist Hilfreich, wenn ihr eine Schnittstelle zu einer anderen Anwendung umsetzen möchtet.

Mit folgendem Code könnt ihr den Parameter ‘parameter’ auslesen:

<?php
echo $_GET['parameter'];
?>

Wenn ihr nun euren Browser öffnet, steht wahrscheinlich nichts drin (oder eventuell auch ein Fehler). Ändert ihr die URL allerdings ab (http://raspberrypi:8080/index.php?parameter=RaspberryPi) sollte “RaspberryPi” erscheinen.

Falls ihr einen Fehler bekommt, wenn ihr keinen Parameter übergibt, müsst ihr um das echo noch eine kleine Bedingung setzen:

<?php
if(isset($_GET['parameter'])){
echo $_GET['parameter'];
} else {
echo "Kein Parameter ";
}
?>

Die if-Bedingung prüft vor der Ausgabe, ob ein Parameter namens “Parameter” übergeben worden ist. Ist dies der Fall so wird der Parameter-Wert angezeigt, wird keiner Übermittelt erscheint die Meldung “Kein Parameter Icon_nosmile“.

Teil 1: System Kommandos ausführen

Mit Hilfe von PHP könnt ihr ganz leicht System Kommandos ausführen. Dafür gibt es den ‘shell_exec’ Befehl:

<?php
echo shell_exec("ping -c 1 google.de");
?>

Wenn ihr euren Browser aufruft, sollte nun die Ausgabe des PING-Befehls erscheinen. Jetzt wird es Zeit einwenig zu kombinieren. Nicht immer möchte man nur Google anpingen, sondern auch dynamisch andere Seiten. Das geht ganz einfach:

<?php
echo shell_exec("ping -c 1 ".$_GET['host']."");
?>

Obacht! Wenn ihr einen Array in Strings (damit mein ich nicht die Unterwäsche, sondern die Zeichenfolgen die in den Anführungsstrichen stehen) setzen wollt, müsst ihr Anführungsstriche um den Array setzen und mit Punkten verbinden.

Wenn ihr nun index.php?host=bild.de öffnet, wird jetzt nicht mehr google.de sondern Bild.de angepingt. Analog zu dem, könnt ihr das natürlich auch mit anderen Befehlen ausführen.

Integration von HTML
Wirklich elegant ist es natürlich nicht, den Parameter in die URL zu tippen. Deswegen verbinden wir das ganze jetzt mit ein paar Zeilen HTML:

<html>
<head>
<title>Ping</title>
</head>

<body>
<form method="get" action="index.php">
<input type="text" name="host">
<input type="submit" value="ping" name="ping">
</form>

<?php
if(isset($_GET['ping'])){
echo shell_exec("ping -c 1 ".$_GET['host']."");
}
?>
</body>

</html>

Erläuterung:
Der <form>-Tag definiert das HTML-Formular. Es teilt dem Browser im Prinzip nur mit, an welche URL der Parameter aus der Textbox angefügt werden soll.
<input type=”text” name=”host”> erzeugt eine Textbox, die ihr in PHP mit $_GET[‘host’] auslesen könnt.
<input type=”submit”> erzeugt den Button zum Absenden der Formulardaten.

Nun könnt’ ihr das Beispiel noch weiter dynamisch gestalten:

<html>
<head>
<title>Ping</title>
</head>

<body>
<form method="get" action="index.php">
Host:<br>
<input type="text" name="host"><br>
Anzahl der Rings:<br>
<input type="text" name="n"><br>
<input type="submit" value="ping" name="ping">
</form>

<?php
if(isset($_GET['ping']) && isset($_GET['n'])){
echo shell_exec("ping -c ".$_GET['n']." ".$_GET['host']."");
}
?>
</body>

</html>

Teil 2: GPIO
1. Auslesen der GPIO-Ports
Kommen wir nun zum etwas spannenderen Teil: Dem Auslesen der GPIO Ports. Als Vorbereitung aktivieren wir den GPIO 17 als Ausgang im Terminal und schalten ihn auf High:

echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
echo "1" > /sys/class/gpio/gpio17/value

Den aktuellen Status des Ausganges können wir mit Hilfe von ‘cat’ auslesen.

cat /sys/class/gpio/gpio17/value

Das sollte uns nun eine ‘1’ zurückliefern. Genau das selbe setzen wir nun in PHP um. Dafür bieten sich grundsätzlich (mindestens) zwei Möglichkeiten an:

  1. Wir öffnen die virtuelle Datei ‘/sys/class/gpio/gpio17/value’ mit der PHP Funktion ‘file_get_contents’
  2. Wir führen den Befehl ‘cat /sys/class/gpio/gpio17/value’ mit shell_exec(); aus

Beide Varianten werden uns zum Ziel bringen, die sauberere Lösung ist meiner Meinung nach die erste.

<?php
file_get_contents("/sys/devices/virtual/gpio/gpio17/value");
?>

Nun liefert uns das Script hoffentlich eine ‘1’ zurück. Wir wissen also, dass der GPIO 17 auf High steht. Die Information sollte für uns eigentlich ausreichen, das kann man aber noch einwenig schöner gestalten. Wir schreiben das Script einwenig um, um entweder die Ausgabe “EIN” oder “AUS” zu erhalten.

<?php
$status = file_get_contents("/sys/devices/virtual/gpio/gpio17/value");
if($status==1){
echo "AN";
} else {
echo "AUS";
}
?>

Erläuterung: Wir rufen uns den Inhalt der Datei in die Variable ‘$status’. Anschließend prüfen wir, ob der Inhalt 1 entspricht. Ist dies der Fall geben wir “AN” aus, für jeden anderen Wert wird “AUS” ausgegeben. Beachtet hierbei bitte, dass ihr zwei Gleichheitszeichen benutzt, andernfalls bekommt ihr immer den Wert “AN”, da PHP die Bedingung einwenig anders interpretiert.

Jetzt ist es natürlich sehr mühselig für mehrere Ports immer wieder das selbe auszuführen. Deswegen lagern wir das in eine Funktion aus. Das ist immer sinnvoll, wenn ihr wisst, dass ihr etwas mehr als einmal ausführen werdet. Grundsätzlich kann jeder Anweisung als Funktion eingesetzt werden, achtet dabei allerdings auf sinnvolle Funktions- und Parameternamen. Dann könnt ihr eure Funktionen auch in anderen Scripten nutzen.

Eine Funktion wird mit ‘function’ eingeleitet, anschließend folgt der Name der Funktion und die Parameter, die entgegengenommen werden können. Das sieht dann so aus:

function gpio_wert($GPIO){
$status = file_get_contents("/sys/devices/virtual/gpio/gpio".$GPIO."/value");
if($status==1){
echo "AN";
} else {
echo "AUS";
}
}

Üblicherweise werden Funktionen in PHP-Scripten direkt an den Anfang gestellt oder in separate Dateien ausgelagert. Das Aufrufen der Funktion erfolgt dann wie folgt:

<?php

function gpio_wert($GPIO){
$status = file_get_contents("/sys/devices/virtual/gpio/gpio17/value");
if($status==1){
echo "AN";
} else {
echo "AUS";
}
}

gpio_wert(17);
?>

Das spart im eigentlichen Script dann nicht nur platz, sondern hält euren Quelltext auch übersichtlicher.

Und das war es fürs erste. Bald geht’s dann mit dem Schalten weiter.

Gruß
Christian