WLAN Kommunikation mit weborf

» home «

Es gibt viele Projekte im Internet bei denen es um die Kommunikation zweier Raspberry Pi über WLAN geht. Ein grosser Teil nutzt Apache2 oder ligHTTP. Ich empfehle weborf, um im wesentlichen eine LED zu steuern.

Es gibt sehr viele Beispielprojekte im Internet bei denen es um die Kommunikation zweier Raspberry Pi über WLAN geht. Ein grosser Teil nutzt dazu Apache2 oder ligHTTP als Basis. Aus meiner Sicht ein viel zu "teurer" Ansatz, um im wesentlichen eine LED an einem anderen Raspberry ein- oder auszuschalten (wenn ich es mal so salopp formulieren darf. Bereits beim Aufestzen solcher Projekte scheitern viele Anwender zum Beispiel bei der Einrichtung der Benutzerrechte, denn beispielsweise kann PHP und Python unter dem Apache nicht auf die GPIO-Pins zugreifen, um das zu ermoeglichen ist einiges an Arbeit noetig.

Das folgende Projektbeispiel zeigt daher einen der leichtesten Ansaetze den bisher noch niemand im Web beschrieben hat - der Datenaustausch zwischen zwei Raspberry Pi im WLAN findet ueber Weborf statt. Das wird gebraucht

Sie benoetigen mindestens zwei Raspberry Pi Einheiten. Ich nutze fuer diesen Zweck immer sehr gerne den Raspberry Pi ZERO WH da er sehr geringe Hardwareanforderungen stellt und extrem sparsam in allem ist. Meine beiden Raspberrys heissen ZEROA, der den Master spielen wird und ZEROB, der die Rolle des Slave uebernehmen wird.

  • 2x Raspberry Pi (ohne Desktop, Buster lite)

Als naechstes benoetigen Sie den Webserver, dazu nutzt dieses Projektbeispiel den in Python geschriebenen Webserver weborf. Installieren Sie an der Konsole des Raspberry Pi den Webserver weborf mit dem Sudo-Kommando:

sudo apt-get install weborf

Um mit einem Python-Script vom Slave auf den Master zugreifen zu koennen, benoetigen Sie eine zusaetzliche Python-Bibliothek namens requests, installieren Sie diese mit dem folgenden Befehl:

sudo apt install python-requests

Den Webserver starten

Haben Sie den auf Python basierenden Webserver weborf installiert, dann koennen Sie diesen auch sofort starten. Weborf erwartet mindestens die Vorgabe eines Wurzelverzeichnis (-b) das gehostet werden soll. Ideal ist auch die Existenz einer index.html in diesem Verzeichnis die sofort auf der Gegenseite (Client) geladen wird.

weborf -b /home/pi

Existiert keine index.html, so wird die Verzeichnisstruktur angezeigt. Fuer dieses Beispiel ist die Existenz der index.html allerdings erforderlich.

Zur Kontrolle koennen Sie den Webserver mit dem Smartphone und der URL: http://zeroa:8080/ im Browser aufrufen. Es sollte mindestens der Inhalt des Wurzelverzeichnis oder die index.html angezeigt werden.

index.html auf dem Master (ZEROA)

Der Raspberry Pi der den weborf hostet, uebernimmt die Rolle des Masters (dies ist aber auch in beide Richtungen moeglich). In meinem Fall heisst dieser ZEROA (Hostname des Rechners kann mit sudo raspi-config eingestellt werden). Desweiteren unterstellen wir, das auf dem Master ein Python-Script laeuft das einen fiktiven Sensor ausliest und das Ergebnis zyklisch alle 30 Sekunden in die Datei index.html schreibt (testweise geht auch: watch -n 30 "vcgencmd measure_temp" >index.html). Die index.html koennte daher den folgenden Inhalt haben (ich habe die Datei exemplarisch von Hand mit nano index.html erstellt):

...
001  GPIO1=ON
...

Der Inhalt der Datei index.html

Der Eintrag GPIO1=ON oder GPIO1=OFF ist ein selbst definierter Steuerbefehl (diesen koennen Sie nach eigenen Wuenschen definieren) und soll auf der Gegenseite dazu dienen, zum Beispiel ein Relais anzusteuern.

HTTP Request auf dem Slave (ZEROB)

Auf dem zweiten Raspberry Pi, dem Slave, wird ein Python-Script gestartet das den URL-Request an den Master sendet. Mein Slave-Rechner heisst ZEROB. Das Python-Script hat den folgenden exemplarischen (einfachen) Inhalt:

001  import requests
002  import time
003
004  while True:
005          response_zeroa = requests.get('http://zeroa:8080/')
006          response_zeroa.encoding = 'utf-8'
007          poem = response_zeroa.content
008
009          print(poem)
010          time.sleep(10)

Python-Script, um remote vomm Server den Inhalt von index.html zu lesen

Als Ergebnis des Scripts erscheint an der Console des ZEROB (Slave) der Schriftzug:

GPIO1=ON

Damit wurde der Inhalt (Steuerbefehl) von ZEROA an ZEROB uebermittelt und das Python-Script des Slave kann den String in einem IF weiter verarbeiten, um das Relais an ZEROB ein- oder auszuschalten. Der Request wird alle 10 Sekunden erneut an ZEROA gesendet und der Inhalt kann erneut durch das Python-Script des ZEROB ausgewertet werden (sofern sich etwas veraendert hat).

Fazit

Die Nutzung des weborf stellt die kleinste und einfachste Umsetzung der Datenuebertragung zwischen zwei Raspberry Pi mittels WLAN dar. Auf dem Master wird mit einem Python-Script zyklisch eine index.html geschrieben die Steuerbefehle enthalten kann. Der Slave sendet einen Request an den Master, der diesen mit dem Senden der index.html beantwortet. Der Inhalt der index.html, also die selbst definierten Steuerbefehle, muessen vom Slave-Empfaenger Script natuerlich ausgewertet werden, hier koennen Sie Ihrer Kreativitaet freien Lauf lassen.

Der erfahrende HTML-Entwickler koennte natuerlich auch entgegnen, die index.html enthaelt keinerlei HTML-Formatangaben. Das stimmt, die sind aber nicht noetig und der HTML-Markupdialekt ist so ausgelegt, das der Server einfach das sendet was er interpretieren kann und dies ist in diesem Falls der simple String (Text). Das HTML-Statements fehlen, wird vom weborf ignoriert, es stoert ihn nicht.

Im uebrigen habe ich die klassische Einteilung in Master und Slave vorgenommen, um den Sachverhalt besser zu verdeutlichen. In der Praxis gibt es diese Rollen nicht, denn auf beiden Raspberry Pi kann der weborf laufen und die Kommunikation kann bidirektional laufen. Beide Geraete koennen daher Master sein.

Die Geschwindigkeit des Beispielprojekts legt den Fokus nicht auf Echtzeitverarbeitung wie es bei den grossen und teuren Loesungen der Fall ist. Dennoch ist es moeglich die Abfrage alle paar Millisekunden durchzufuehren, das ist fuer den Raspberry Pi ein Kinderspiel. Sinnvoller erscheint jedoch der Ansatz, den Request alle paar Sekunden abzusenden, um der Gegenseite genuegend Zeit zu lassen den Sensor in ausreichender Zeit auszulesen und die Daten bequem wegschreiben zu koennen, bevor sie an die Gegenseite uebermittelt werden.

Oliver Lohse   •  13.Jun.2020

Navigation


home
Omega 2
ESP32 NodeMCU
Arduino
Raspberry Pi
Python
PHP

Es geht um den heißem Scheiß über den alle reden - IoT (das Internet der Dinge). Doch zunächst der rechtliche Teil auf dieser rein privat betriebenen Webseite.

Die Webseite verwendet keine Cookies oder sonstigen Tracking-Tools, um das Leserverhalten zu speichern.

WLAN IP Adresse ermitteln


Dieser Beitrag zeigt Ihnen, wie Sie mit Python die lokale IP-Adresse des Raspberry Pi abfragen können. Es sind nur wenige Codezeile nötig.

Autostart


Die Autostartfunktion am Raspberry Pi lässt sich sehr einfach einrichten und Sie können Ihre Projekte automatisch nach dem booten starten lassen. Dieser Beitrag zeigt Ihnen wie einfach das ist.


© by O.Lohse • Impressumhome