Ein Raspberry Pi Pico 2 W wird zum oeffentlichen Webserver

Ein Raspberry Pi Pico 2 W ist ein sehr kleiner Mikrocontroller. Er ist nicht mit einem normalen Raspberry Pi zu verwechseln, auf dem Linux läuft und auf dem man einfach einen großen Webserver installieren kann. Der Pico ist viel kleiner, sparsamer und direkter. Trotzdem kann er eine echte Website ausliefern, die man von außerhalb des eigenen Heimnetzes erreichen kann.

In diesem Projekt habe ich genau das umgesetzt: Unter /pico liegt jetzt eine Website, deren Dateien und Logik wirklich vom Raspberry Pi Pico 2 W kommen.


Ein kleiner Computer mit einer echten Aufgabe

Viele kennen einen Webserver nur als großen Rechner in einem Rechenzentrum. Dort laufen Apache, Nginx, PHP, Datenbanken und viele weitere Dienste. Der Pico 2 W (die Platine) hat dagegen nur einen kleinen RP2350-Mikrocontroller, 4 MiB Flash-Speicher und rund 520 kB SRAM. Das klingt zuerst sehr wenig, ist aber für eine gezielte Aufgabe erstaunlich viel.

Auf dem Pico läuft MicroPython. Das ist eine sehr kleine Python-Variante für Mikrocontroller. Damit kann der Pico Dateien lesen, WLAN benutzen, Berechnungen machen und auf Anfragen reagieren. Genau daraus entsteht hier ein Mini-Webserver.

Die eigentliche Schwierigkeit: Das Heimnetz

Der Pico befindet sich im Heimnetz hinter einem Router. Von außen kann man normalerweise nicht einfach seine lokale IP-Adresse aufrufen. Die Adresse wie 192.168.x.x funktioniert nur im eigenen Netzwerk. Aus dem Internet wäre der Pico also nicht direkt erreichbar.

Man könnte Ports im Router freigeben. Das wollte ich hier aber nicht als Hauptlösung benutzen. Stattdessen baut der Pico selbst eine dauerhaft offene Verbindung zu meinem öffentlichen Server auf. Der Pico darf nach draußen verbinden, auch wenn er hinter NAT sitzt. Dadurch kann der Server eine Anfrage durch diese bereits bestehende Verbindung zurück an den Pico weiterreichen.

Besucher
  -> https://a38.corecosmetic.de/pico/
  -> öffentlicher Server
  -> dauerhaft offener Tunnel
  -> Raspberry Pi Pico 2 W
  -> /webroot auf dem Pico

Für den Besucher sieht das einfach wie eine normale Unterseite meiner Website aus. Technisch ist der öffentliche Server dabei ein Relay: Er nimmt die HTTPS-Anfrage an, leitet sie durch den Tunnel weiter und liefert die Antwort des Pico wieder an den Browser aus.

Was kommt wirklich vom Pico?

Die HTML-, CSS- und JavaScript-Dateien liegen im Verzeichnis /webroot des Pico. Auch das Favicon wird vom Pico ausgeliefert. Der Pico kann somit nicht nur eine einzelne Testseite anzeigen, sondern mehrere Seiten und Dateien bereitstellen.

Die aktuelle Website ist mehr als nur ein statisches Beispiel. Sie enthält eine kleine Notes-Anwendung:

  • Registrierung und Anmeldung mit maximal 20 Konten,
  • Notizen erstellen, bearbeiten und löschen,
  • bis zu 80 kB Notizinhalte pro Nutzer,
  • Markdown-ähnliche Notizen mit [[Verlinkungen]],
  • und einen Taschenrechner direkt in der Website.

Die Datenbank ist dabei keine große SQL-Datenbank. Sie ist bewusst klein gehalten und besteht aus Dateien auf dem Flash-Speicher des Pico. Nutzer und Notizen werden als strukturierte JSON-Daten gespeichert. Für diese Größenordnung ist das sinnvoll: wenig Overhead, keine große Installation und trotzdem dauerhaft gespeicherte Daten.

Wie viel Speicher bleibt noch?

Von den 4 MiB Flash-Speicher ist ein Teil bereits für MicroPython, die Firmware und die Speicheraufteilung reserviert. Das beschreibbare MicroPython-Dateisystem hat etwa 2,5 MiB. Davon waren beim Messen noch rund 2,35 MiB frei. Die Website selbst braucht nur einige zehn Kilobyte, und die Datenbank war zu diesem Zeitpunkt praktisch winzig.

Das zeigt eine interessante Sache: Bei einem Mikrocontroller ist nicht unbedingt der Speicher das erste Problem. Man muss eher darauf achten, wie viele Daten gleichzeitig im RAM liegen. Wenn eine sehr große Notiz gelesen, als JSON verarbeitet und dann noch für den Tunnel kodiert wird, existieren mehrere Kopien davon im Arbeitsspeicher. Deshalb sind die Grenzen für Notizen bewusst gesetzt und nicht einfach unendlich.

Warum kein PHP auf dem Pico?

Dies ist der Code, der im Hintergrund auf dem Server läuft während ihr eine Website besucht. PHP ist für einen Pico nicht die passende Umgebung. Es braucht deutlich mehr Speicher, eine umfangreichere Laufzeit und passt eher zu einem klassischen Linux-Webserver. MicroPython übernimmt hier die serverseitige Aufgabe direkt. Statt PHP-Dateien gibt es kleine API-Endpunkte, die der Pico selbst beantwortet.

Ein Browser kann zum Beispiel eine Anfrage wie /api/notes senden. Der Pico prüft die Anmeldung, liest oder speichert die Notiz und antwortet mit JSON. JavaScript in der Website nimmt diese Antwort entgegen und zeigt sie an. So bleibt die Website modern, obwohl ihr Kern auf einem sehr kleinen Mikrocontroller läuft.

Mehr als eine Website

Das Spannende an MicroPython ist, dass man die Website später sehr frei erweitern kann. Der Pico kann nicht nur Dateien ausliefern. Er kann auch messen, rechnen und auf Hardware reagieren. Denkbar wären zum Beispiel Sensorwerte, ein Temperaturverlauf, ein Besucherzähler, kleine Berechnungen oder eine Anzeige für den Zustand eines angeschlossenen Projekts.

Die Website und die Hardware müssen dabei nicht durcheinander geraten. Es gibt eine eigene Erweiterungsstelle für Pico-seitige Funktionen. Neue Ideen können also als kleine API hinzugefügt werden, ohne die Notes-Anwendung neu bauen zu müssen.

Fazit

Der Raspberry Pi Pico 2 W ersetzt keinen großen Server. Aber er zeigt sehr gut, dass eine Website nicht immer aus einem riesigen System bestehen muss. Mit MicroPython, WLAN, einem Tunnel und etwas eigener Logik kann ein kleiner Mikrocontroller seine eigenen Seiten, Daten und Berechnungen ins Internet bringen und damit zum kleinsten Webserver der Welt werden.

Gerade das macht das Projekt interessant: Die Website liegt nicht nur irgendwo auf einem normalen Server. Ein kleiner Computer im Heimnetz beantwortet Anfragen direkt vom Tisch aus.