Raspberry Pi fernsteuern

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.

Verwendete Bauteile

Aufbau

(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.

Steuerungsprinzip

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.

Funktionsprinzip der Fernsteuerung des Raspberry Pi über das Internet
Abb.: Funktionsprinzip der Fernsteuerung des Raspberry Pi über das Internet

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.

Script auf dem Webserver

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.

PHP-Script für Webserver [2 kB]

Python-Script auf dem RPi

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