Python WebSockets mit Tornado auf dem Raspberry Pi: Schritt-für-Schritt-Anleitung

Veröffenticht am 09.09.2023    von     in der Kategorie Raspberry Pi     bisher 2 Reaktionen    Zuletzt überarbeitet am 26.05.2024


In diesem Beitrag zeige ich, wie man mit Python und dem Tornado-Framework einen WebSocket-Server zur bidirektionalen Kommunikation auf einem Raspberry Pi aufbaut.

 

Das Tornado-Framework verwende ich unter anderem auch in den folgenden Beiträgen:

In Aktion zur Steuerung eines NIBOBee Roboters kannst du dir auch mein Video mit dem Titel NIBOBee Roboter mit Raspberry Pi auf YouTube ansehen.

Bevor wir uns näher mit dem Tornado Framework und dessen Konfiguration beschäftigen, möchte ich versuchen, dir das Grundkonzept von WebSockets zu erklären.

 

Was sind WebSockets?

WebSockets sind eine Technologie, die eine beidseitige, fortlaufende Verbindung zwischen einem Client (z. B. einem Webbrowser) und einem Server ermöglicht. Im herkömmlichen HTTP muss der Client jedes Mal die Kommunikation in Gang setzen und der Server antworten. Mit WebSockets können jedoch Server und Client jederzeit Daten hin- und her senden, ohne dass eine neue Verbindung aufgebaut werden muss. Dies ist gut für Programme geeignet, die sofortige Daten benötigen, wie Online-Spiele, Chat-Programme oder Börsenticker.

Wenn du etwas tiefer in das Thema einsteigen möchtest, kann ich dir das Buch “WebSockets: Moderne HTML5-Echtzeitanwendungen entwickeln” nur empfehlen.

 

Tornado und dessen Rolle in der Welt der WebSockets

Tornado ist eine leistungsstarke Python-Bibliothek, mit der du asynchrone Webserver erstellen kannst. Das bedeutet, dass es mehrere Anfragen gleichzeitig bearbeiten kann, ohne blockiert zu werden. Ein großer Vorteil von Tornado ist dabei seine eingebaute Unterstützung für WebSockets. Weitere Informationen findest du unter https://www.tornadoweb.org/.

 

Vorteile von WebSockets

Die Vorteile im Überblick:

  • Echtzeitkommunikation
  • Effizienz
  • Asynchronität

 

Einrichtung des Raspberry Pi

Schritt 1: Raspberry Pi vorbereiten

Stelle sicher, dass dein Raspberry Pi auf dem neuesten Stand ist. Gebe hierzu im Terminal folgende Befehle ein:

Schritt 2: Tornado installieren

 

Anmerkung vom 18.10.2023

Wie in meinem Beitrag “Ein Blick auf das Raspberry Pi OS “Bookworm”” zur neuen Version des Raspberry Pi OS Bookworm (Stand 10.10.2023) angemerkt, funktioniert die Einbindung von Python-Bibliotheken nicht mehr wie gewohnt und führt zu einem Fehler. Daher schon jetzt der Hinweis: Solltest du eine neuere Version des Raspberry Pi OS als Bullseye (Stand 03.05.2023) verwenden, musst du die Tornado-Bibliotheken anders einbinden. Der Befehl lautet:

 

 

Installiere das Tornado-Framework über pip mit dem Befehl:

 

Solltest du das Paketinstallationsprogramm PIP für Python bislang nicht installiert haben, kannst du dies mit folgendem Befehl nachholen:

 

Eine Übersicht über wichtige und häufig verwendete Befehle stelle ich dir auf einem kleinen Spickzettel für Raspberry Pi OS Befehle zur Verfügung.

 

Schritt 3: Einfacher WebSocket-Server erstellen

Erstelle eine einfache Python-Datei, zum Beispiel websocket_server.py, und füge folgenden Code ein:

 

Schritt 4: Server starten

Starte den WebSocket-Server mit dem Befehl:

 

Der WebSocket-Server läuft jetzt auf Port 9090 deines Raspberry Pi.

 

Schritt 5: Einfache HTML-Datei mit entsprechendem JavaScript

Der bereitgestellte Code erstellt einen einfachen WebSocket-Server mit Tornado. Um mit dem Server zu arbeiten, brauchst du eine HTML-Datei mit entsprechendem JavaScript, um eine Verbindung herzustellen und Nachrichten zu senden und zu empfangen.

Hier findest du ein einfaches Beispiel für eine solche HTML-Datei. Denke daran, dass diese im entsprechenden Ordner deines Webservers abgespeichert ist, um auch von externen Geräten erreichbar zu sein.

Die Einrichtung eines Webservers habe ich in meinem Beitrag “Apache Webserver, PHP, SQL Datenbank und FTP Zugang auf dem Raspberry Pi einrichten” beschrieben.

Wenn du diese Webseite in deinem Browser öffnest und eine Nachricht über das Eingabefeld sendest, wird der Tornado-WebSocket-Server sie empfangen und eine Antwort zurückschicken. Die Antwort, welche “Du hast gesagt: ” gefolgt von deiner Nachricht zeigt, wird dann im messages-Div der Webseite angezeigt.

 

Die folgende Slideshow zeigt die 3 Phasen einer Verbindung zwischen dem Client (Browser) und dem WebSocket Server (Python Skript).

  • WebSocket Verbindung - nach Aufruf im Browser

 

 

Fazit

Die relativ einfache Einrichtung eines WebSocket-Servers mit Python und Tornado auf einem Raspberry Pi bietet unglaublich spannende Möglichkeiten, insbesondere im Bereich des Internets der Dinge (IoT). Mit WebSockets kannst du eine schnelle und reaktionsfähige Kommunikation zwischen deinem Raspberry Pi und anderen Geräten oder Clients aufbauen.

 

Bereitgestellte Dateien und Links

Wenn du dir das Abtippen oder Kopieren des Codes sparen möchtest, steht dir der Code in einer ZIP-Datei zum Download bereit.

Gib im Terminal folgenden Befehl ein, dieser lädt die ZIP-Datei auf deinen Raspberry Pi herunter.

 


Transparenz-Hinweis:

Die auf dieser Seite verwendeten Produktlinks sind sogenannte Affiliate-Links zu einem Partnerprogramm. Für dich entstehen dadurch keine Mehrkosten, ich erhalte durch deinen Kauf über den Link eine kleine Provision.


Wolfgang Raab – Betreiber von webnist.de

Mein Name ist Wolfgang, ich beschäftige mich nun schon seit 1985 mit der EDV und im Besonderen mit der Software- und Webentwicklung.

Auf diesem Blog schreibe ich über Dinge, die mich begeistern, beschäftigen und ich der Meinung bin, es könnte für andere interessant und hilfreich sein.

Als großer Fan des Raspberry Pi finde ich es spannend, wie man den kleinen Computer in Verbindung mit dem IoT und Smart Home nutzen kann. Deshalb behandeln viele Beiträge auch genau dieses Thema.

Ich bin ein leidenschaftlicher Leser und Fotograf. Wenn ich nicht gerade in einem spannenden Roman versinke, bin ich oft unterwegs, um die Schönheit der Welt mit meiner Kamera einzufangen und zu teilen.

Weitere Infos und Fotos findest du auf einem der folgenden Plattformen.






Mehr erfahren?

Besuche die "About"-Seite meines Blogs und finde heraus, wie du mit mir in den Bereichen Web- und Mobile-Programmierung und Raspberry Pi zusammenarbeiten kannst. Hier beginnt deine digitale Reise.


Unterstützen

Dieser Beitrag hat dir gefallen und konnte dir bei deinem Projekt oder Problem behilflich sein? Dann würde ich mich sehr freuen, wenn du dich mit einer noch so kleinen Spende erkenntlich zeigen möchtest.




  • Tobias Luthner schrieb am 25. Januar 2024:

    Hallo Herr Raab
    können Sie mir sagen wo der Ordner des Webservers liegt in den ich die HTML datei abspeichern muss? Ich bekomme den befehl Websocket geöffnet nicht wenn ich die Webseite im Browser öffne, bzw. wenn ich das Programm ausführe.
    Ich bin in der Ordnerstruktur mit dem Raspberry noch nicht so bewandert.

    Vielen dank schon mal für ihre Hilfe.

    VG

    • Raab Wolfgang schrieb am 25. Januar 2024:

      Hallo Herr Luthner,
      die html-Datei gehört in das vom Webserver bereitgestellte Verzeichnis /var/www/html/ gespeichert und über den Webserver (auf dem Raspberry Pi über localhost oder per IP des Raspberry aufgerufen).
      Die Installation des Apache Webserver habe ich hier beschrieben: https://webnist.de/webserver-php-sql-datenbank-und-ftp-zugang-einrichten/

      Viele Grüße
      Wolfgang


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Notwendige Felder sind mit * markiert.

 

Kleiner Hinweis, alle Kommentare werden moderiert.

Dies bedeutet, der Kommentar wird vor der Veröffentlichung durchgelesen und von mir geprüft. Auch behalte ich mir vor, jeden Kommentar zu löschen, der nicht direkt auf das Thema abzielt oder nur den Zweck hat, Leser oder Autoren herabzuwürdigen.

Entdecke die Welt von Webnist.de

Erfahre mehr über die Hintergründe meines Blogs und wie ich dich bei deinen digitalen Projekten unterstützen kann.

Aktuelles Video auf YouTube

Beschreibung der Verwendung eines TTP223B Touch Sensors am GPIO Port des Raspberry Pi mit Python.