GPIO am Raspberry Pi über ein Webinterface mit PHP schalten
Das Schalten der GPIO Ein-und Ausgänge über ein Webinterface ist natürlich viel komfortabler als über die shell über eine manuelle Eingabe.Voraussetzungen für dieses Tutorial
Dafür braucht man zuerst einen Webserver - zum Schalten müssen allerdings nur Apache2 und PHP installiert sein. SSH Zugriff und FTP Zugang sind sehr zu empfehlen um später die PHP Datei auf den Webserver zu legen.Außerdem wird in diesem Tutorial WiringPi zum Schalten verwendet, wie ihr WiringPi installiert und darüber GPIO’s schaltet erfahrt ihr hier: WiringPi installieren und GPIO’s über WiringPi schalten
Um das ganze reizvoller zu machen, sollte natürlich beim Schalten etwas passieren. Wie ihr eine LED als Testumgebung anschließt, sodass ihr diese über die GPIO’s schalten könnt erfahrt ihr hier: LED Über GPIOs schalten
Das Webinterface einrichten
Ein einfaches Webinterface ist eigentlich nichts außer eine Webseite bestehend aus HTML und CSS welche später noch PHP Code ausführt.
Nachfolgend findet ihr den Code für die HTML Seite. Diese beinhaltet ein Formular mit 2 Buttons welche später den GPIO schalten sollen (ich habe hier den GPIO17 gewählt). In diesem Beispiel könnte der GPIO zB an einer LED oder einem Licht angeschlossen sein. So kann zum Beispiel eine Lampe bequem mit dem Smartphone vom Sofa aus steuern.
Ein neues HTML Dokument erstellt ihr genauso wie ein PHP Dokument mit jedem gewöhnlichen Texteditor, einfach den Code reinkopieren und als .html oder .php Datei abspeichern. In diesem Fall speichern wir das Dokument als "gpio.php” ab und schreiben das HTML und den PHP Code in ein Dokument. Nachfolgend findet ihr den Code für das gesamte Dokument:

Erklärung des Codes:

Das nächste wichtige Element ist das "Form” Element. Dieses stellt die beiden Buttons bereit, welche später als Oberfläche zum Schalten des GPIO17 verwendet werden.
Dieses Formular verweist auf die Datei gpio.php. Die Zeile
$modeon17 = trim(@shell_exec("/usr/local/bin/gpio -g mode 17 out"));
legt den GPIO17 als Ausgang fest.
Das Anschalten erfolgt nun über
trim(@shell_exec("/usr/local/bin/gpio -g write 17 1"));
und das Ausschalten über
trim(@shell_exec("/usr/local/bin/gpio -g write 17 0"));.
"trim” entfernt Whitespaces oder andere ungewünschte Zeichen, und "shell_exec” führt den Befehl dann in der shell aus.
Das wars auch schon. Legt die gpio.php Datei in das Verzeichnis "var/www” eures Webeservers und ruft sie im Browser am PC oder über den Smartphonebrowser auf.
Das Dokument wird unter der IP Adresse des Raspberry Pi mit dem Zusatz "/gpio.php” zu finden sein. Wie ihr eure IP Adresse herausfindet, erfahrt ihr in dem Tutorial: SHH Zugriff auf dem Raspberry Pi einrichten
Es kann sein, dass es nicht funktioniert weil der Webserver nicht über die Rechte verfügt über Dateien Shell Befehle auszuführen. Dazu solltet ihr die Rechte vorher entsprechend gesetzt haben:
1 sudo chmod g+s /var/www 2 sudo chmod 775 /var/www 3 sudo chown -R www-data:www-data /var/www |
Falls es trotzdem nicht funktionieren will könnt ihr noch mit einem Eintrag in den "Sudoers” die vollen Rechte setzen. Aber Vorsicht! Hier gebt ihr vollen Zugriff ohne Passwort, das sollte nur getan werden, wenn der Pi nicht im Netz erreichbar ist, da es sonst ein großes Sicherheitsrisiko bedeutet. Dazu gebt ihr in der shell folgendes ein:
1 sudo visudo |
und tragt folgendes am Ende ein
1 www-data ALL=NOPASSWD: ALL |
Speichert und schließt das Dokument mit "STRG+O” und STRG+X”.
Jetzt sollte alles funktionieren. Wenn es immernoch nicht klappt schaut mal in den Apache2 Errorlog:
1 cat /var/log/apache2/error.log |
Fragen und Antworten zu dem Tutorial
Unter welchem User werden die Befehle in der Shell zur ausführung des Codes durchgeführt? Wie gross ist dabei das Sicherheitsrisiko bei der Benutztung, wenn der RPi im öffentlichen Netz erreichbar ist?
Der User sollte www-data sein. Normalerweise sollte im Netz nicht all zu viel passieren, aber möglich ist es natürlich immer! Daher der Sicherheitshinweis.
Funktoniert das auch wenn ich den URL aufrufe,also ohne zu klicken?
Wenn du die Parameter in der URL so wählst, wie du Sie haben willst ja. (Also so, wie wenn der Button gedrückt wurde)