Raspberry Pi Pico W – Webseite ins Internet veröffentlichen

In diesem Beitrag zeige ich dir, wie du eine Webseite des Raspberry Pi Pico W ins Internet veröffentlichen kannst.

Dem Raspberry Pi Pico W habe ich bereits einige Beiträge gewidmet wie zbsp.:

Dort habe ich dir gezeigt, wie du eine Webseite auf dem Mikrocontroller erstellst und in dein lokales Wi-Fi-Netzwerk einbindest. Nun soll es darum gehen, wie du diese ins Internet veröffentlichst.

Der Einfachheit möchte ich nur eine einfache Webseite mit der Zeichenkette „Hello World!“ veröffentlichen. Du kannst dieses aber auch auf andere, komplexere Webseiten adaptieren.

Warum kann ich nicht direkt auf den Pi Pico zugreifen?

Dazu muss man erkennen, dass es zwei getrennte Netzwerke gibt, zum einen das Internet welches hinter einem Router (FritzBox!, SpeedPort, etc.) und das interne Wi-Fi, LAN Netzwerk welches in der Wohnung / im Haus zu erreichen ist.

Der Router übernimmt dabei die Schnittstelle zwischen diesen beiden Netzwerken. Im normalen Zustand können wir von jedem Gerät aus unserem internen Wi-Fi oder LAN Netzwerk auf das Internet zugreifen. Jedoch können wir nicht andersherum aus dem Internet auf ein Gerät zugreifen (das ist auch gut so).

vereinfachter Aufbau der Kommunikation
Vereinfachter Aufbau der Kommunikation

Wenn wir nun den Raspberry Pi Pico W für den Zugriff aus dem Internet berechtigen wollen, müssen wir im Router einige Einstellungen für diesen treffen.

Zum einen muss der Mikrocontroller immer dieselbe IP-Adresse erhalten und der Port über welchen dieser kommunizieren soll, muss geöffnet werden.

Achtung: ein geöffneter Port kann eine potenzielle Schwachstelle zum eigenen Netzwerk sein, daher sollte diese Freigabe nur solange existieren wie nötig. Und vor allem sollte nur ein Port geöffnet werden, keine Range!

Benötigte Ressourcen für dieses Projekt

Für den Nachbau benötigst du:

  • einen Raspberry Pi Pico W,
  • ein Micro-USB-Datenkabel

Da ich hier nur eine einfache Seite ohne Sensordaten etc. ausliefern möchte, benötigen wir nur den Mikrocontroller mit einem passenden USB-Kabel.

Aufbau der Verbindung und Webseite

Hier das kleine MicroPython Programm mit der ebenso einfachen Webseite.

Du musst an diesem Skript noch deine Daten (SSID und Passwort) in den entsprechenden Feldern eintragen.

import network
import socket
import time

from machine import Pin

ssid = '*****'
password = '******'

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

html = '<!DOCTYPE html><html><head><title>Raspberry Pi Pico W</title></head><body><h1>Hello World!</h1></body></html>'
print('waiting for connection...')
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('.', end='')
    time.sleep(1)

print('')

if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('listening on', addr)

while True:
    try:
        cl, addr = s.accept()
        print('client connected from', addr)
       
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send(html)
        cl.close()

    except OSError as e:
        cl.close()
        print('connection closed')

Wenn wir dieses Programm nun auf dem Mikrocontroller starten, dann wird eine Verbindung aufgebaut und die IP-Adresse in der Konsole angezeigt.

MicroPython v1.19.1-88-g74e33e714 on 2022-06-30; Raspberry Pi Pico W with RP2040

Type "help()" for more information.
>>> %Run -c $EDITOR_CONTENT
waiting for connection...
.......
connected
ip = 192.168.178.70
listening on ('0.0.0.0', 80)

Diese IP-Adresse können wir nun im Browser eingeben und erhalten unsere kleine Zeichenkette „Hello World!“.

Ausgabe der Zeile "Hello World!" im Browser
Ausgabe der Zeile „Hello World!“ im Browser

Erstellen eines DynDNS Accounts

Unser Router erhält nach 24h eine neue IP-Adresse, dieses bedeutet, dass wir, um sicher auf den Mikrocontroller zugreifen können immer erst diese IP-Adresse ermitteln müssen um dann die URL zu bilden. Das ist recht umständlich und daher nutzt man dazu einen DynDNS Service wie http://freedns.afraid.org/.

Ein Überblick zu den kostenfreien DynDNS Anbieter findest du unter https://www.ionos.de/digitalguide/server/tools/dyndns-anbieter-im-ueberblick/

In meinem Fall erstelle ich einen Account beim Dienst freedns.afraid.org. Dieser Dienst ist kostenfrei und recht gut dokumentiert.

Konto erstellen auf freedns.afraid.org
Konto erstellen auf freedns.afraid.org

Wenn du alles ausgefüllt und eine E-Mail mit dem Aktivierungslink erhalten hast, dann kannst du aus dem Dashboard deine erste Subdomain erstellen.

Subdomain auf freedns_afraid einrichten
Subdomain auf freedns_afraid einrichten

Fritz!Box einrichten

Im Nachfolgenden zeige ich dir, wie du eine Subdomain für diesen Dienst auf deiner Fritz!Box einrichtest.

Öffne dazu zunächst dein Dashboard der Fritz!Box unter fritz.box und klicke dich durch den Pfad „Internet“ > „Freigaben“ und wähle dort den Reiter „DynDNS“.

Zunächst musst du den Haken bei „DynDNS benutzen“ aktivieren und wählst aus der Auswahlliste „DynDNS-Anbieter“ den letzten Eintrag „Benutzerdefiniert“ aus.

Einrichten eines DynDNS Accounts in der Fritz!Box
Einrichten eines DynDNS Accounts in der Fritz!Box

Die benötigten Daten für die Felder findest du auf der Seite „Dynamic DNS„.

Hauptmenü von freedns_afraid
Hauptmenü von freedns_afraid

Auf der geöffneten Seite scrollen wir bis nach unten, wählen unserer zuvor erstellten Subdomain den Link „Direct URL“ (1) und öffnen das Kontextmenü mit der rechten Maustaste. Aus diesem Menü wählen wir den Eintrag „Adresse des Links kopieren“ (2) aus und kehren zurück zur Seite der Fritz!Box.

kopieren der "Direct URL"
kopieren der „Direct URL“

In das Feld „Update URL“ fügen wir den Link aus der Zwischenablage mit Strg+V ein.
Das Feld „Domainname“ wird mit der URL unserer erstellten Domain befüllt.
Die beiden Felder „Benutzername“ & „Kennwort“ werden jeweils mit „guest“ befüllt.

Portfreigabe

Im letzten Schritt müssen wir nun die Portfreigabe in der Fritz!Box für den Raspberry Pi Pico W einrichten.

Dazu wechseln wir in den Reiter „Portfreigaben“ (1) und wählen dort die Schaltfläche „Gerät für Freigaben hinzufügen“ (2).

Fritz!Box Dialog Portfreigaben
Fritz!Box Dialog Portfreigaben

Im neuen Fenster wählen wir nun aus der Liste der Geräte den Eintrag „PYBD“ aus (PYBD > PiBoard).

Portfreigabe für den Pi Pico W einrichten
Portfreigabe für den Pi Pico W einrichten

Es sollten nun die Felder „IPv4-Adresse“ & „MAC-Adresse“ vorbelegt werden.

Nun müssen wir noch den Port definieren, dazu klicken wir auf die Schaltfläche „Neue Freigabe“ unten rechts im Fenster.

Im neuen Dialog wählen wir zunächst den Punkt „Portfreigabe“ aus. Danach können wir aus der Auswahlliste „Anwendung“ den Eintrag „HTTP-Server“ auswählen und die Schaltfläche „OK“ betätigen.

HTTP Portfreigabe einrichten
HTTP Portfreigabe einrichten

Wenn wir nun auf die Übersichtsseite „Portfreigaben“ zurückkehren, dann sollten wir einen neuen aktiven Eintrag auffinden.

aktive Portfreigabe für den Raspberry Pi Pico W für das bereitstellen einer Webseite ins Internet
aktive Portfreigabe für den Raspberry Pi Pico W für das bereitstellen einer Webseite ins Internet

Die kleine grüne Lampe dient dabei zum Erkennen, ob der Mikrocontroller aktiv und somit erreichbar ist.

Testen der Konfiguration im Browser

Wenn wir nun die Adresse im Browser öffnen, dann wird uns die Zeichenkette „Hello World!“ angezeigt.

Fazit & Ausblick

Die Einrichtung eines DynDNS Accouns in der Fritz!Box ist recht einfach, zum Problem wird hier nur einen zuverlässigen Dienst zu finden.

Wir haben nun eine Adresse im Internet mit einem Zugriff auf den Raspberry Pi Pico W, da diese Seite jeder sehen kann, welcher die Adresse kennt, wollen wir im nächsten Schritt ein Login Dialog mit Benutzername & Passwort einbauen.

2 Kommentare

Kommentar hinterlassen

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