Für manche Projekte ist es notwendig (oder bequem), dass man den Raspberry Pi über größere Distanzen steuern kann. Dabei bietet sich u.a. das Internet an. Es gibt etliche Beiträge, die beschreiben, wie man den RPi direkt über das WWW zugänglich machen kann, doch hier soll eine andere Methode vorgestellt werden.
(Einrichten des Raspberry Pi siehe: Setup des RPi)
Um eine Reaktion des RPi auf die gegebenen Befehle besser erkennen zu können, wird der
Aufbau wie in "LED mit Raspberry Pi ansteuern"
verwendet. Die hier verwendete LED soll dann im Folgenden durch eine WWW-Oberfläche gesteuert werden.
Die hier beschriebene Fernsteuerung über das WWW erfolgt indirekt, d.h. der Benutzer sendet vorgefertigte Befehle an eine webbasierte Anwendung (hier ein PHP-Script), welche die Befehle in eine Warteschlange speichert. Der RPi greift auf dieselbe Anwendung zu und holt sich pro Zeit-Intervall jeweils einen neuen Befehl von der Warteschlange und führt ihn aus.
Die Vorteile dieses Fernsteuerungsprinzips sind vor allem, die leichte und generelle
Implementierung unabhängig der verwendeten Infrastruktur und der Script- bzw. Programmiersprache.
Es sind also weder irgendwelche DNS-Einträge, IP-Konfigurationen noch Firewall-Regeln durchzuführen.
Außerdem ist ein Hacken des RPi und damit der Infrastruktur des verwendeten Netzwerkes recht unwahrscheinlich,
da niemals direkt auf den RPi zugegriffen wird.
Nachteile dieses Ansatzes sind offensichtlich, denn es müssen natürlich die Befehle auf
beiden Seiten zumindest definiert werden, und außerdem sind schnelle Reaktionen auf Seiten des RPi
durch die verwendete Warteschlange nicht möglich.
Damit der RPi überhaupt Befehle "empfangen" kann, benötigt man zunächst eine webbasierte
Anwendung. Hier wird ein PHP-Script verwendet, welches auch gleichzeitig die Web-Oberfläche zur Bedienung
generiert.
In dem hier ladbaren Beispiel-Script sollte vor der Verwendung der PSK
angepasst und die Berechtigung auf das /tmp
-Verzeichnis überprüft werden, damit die benötigten
Dateien geschrieben/gelesen werden können. Auch sind natürlich die drei Befehle LED_ON, LED_OFF, SHUTDOWN, EXIT
hier nur zu Demonstrationszwecken verwendet.
Natürlich muss das Script auf dem Webserver ausführbar sein. In diesem Fall reicht es, wenn es in ein
sog. Webroot-Verzeichnis gelegt wird (hier ist ein Webserver zusammen mit PHP konfigurier, wie es auf
vielen verfügbaren Angeboten zur Verfügung steht.
Auf der Seite des Raspberry Pi braucht man nun ein Script (hier: Python), welches in regelmäßigen Abständen
die Warteschlange der o.g. Anwendung im Web abfragt und -falls vorhanden- den nächsten gültigen Befehl
ausführt. (SERVER_URL
muss natürlich entsprechend angepasst werden)
import RPi.GPIO as GPIO
import time
import requests
import os
SERVER_URL = "https://elektro.turanis.de/rpi_cmd.php"
SERVER_PARAMS = {
"psk": "r6rlkzS90glk",
"request": "1"
}
LED_PIN = 27
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
t0 = time.time()
while True:
t1 = time.time()
if t1-t0 > 5:
t0 = time.time()
resp = requests.get(SERVER_URL, params=SERVER_PARAMS)
cmd = resp.content
if cmd == "LED_ON":
GPIO.output(LED_PIN, True)
elif cmd == "LED_OFF":
GPIO.output(LED_PIN, False)
elif cmd == "SHUTDOWN":
os.system("sudo shutdown -h now")
elif cmd == "EXIT":
break;
GPIO.cleanup()
Natürlich ist die hier beschriebene Steuerung nur mit sehr einfachen Scripten zu Demonstrationszwecken umgesetzt und kann nach Belieben auf das entsprechende Projekt adaptiert und erweitert werden. Naheliegend sind z.B. ein höherer Satz an Befehlen, eine Status-Ausgabe des RPi, um zu prüfen, welcher Befehl mit welchem Resultat ausgeführt wurde, eine Abfrage des generellen Status der RPi (Speicherverbrauch, Auslastung etc.).
zurück