Dies ist eine alte Version des Dokuments!
Offloader auf Basis eines Raspberry PI 4B (WireGuard)
Disclaimer: Die Anleitung ist nur für Leute, die sich bereits mit dem Thema Linux auseinander gesetzt haben oder sich intensiv damit beschäftigen wollen!
Diese Anleitung geht von einem Linux Hostrechner aus - sie funktioniert auf quasi allen Linux basierten Betriebssystemen, mit ein paar Anpassungen.
In den nachfolgenden Beispielen zu den Shell-/Konsolen-Befehlen gelt folgende Formatierungen:
- Ein vorangestelltes Dollarzeichen
$
bedeutet, dass der bzw. die Befehle mit Userrechten des gerade angemeldeten Benutzers ausgeführt werden können. - Ein vorangestelltes Raute-Symbol
#
hingegen bedeutet, dass zum Ausführen des Befehls bzw. der Befehle Root-Rechte benötigt werden, die man z.b. mit Hilfe von$ sudo su -
erlangen kann.
Sollten trotz des eingehenden Studiums dieser Anleitung dennoch Fragen offen bleiben, oder unvorhergesehenen Problemstellungen auftreten, findet man im Chat sicher schnell Hilfe und Unterstützung.
Mit dem Raspberry PI 4 ist es das erste Mal möglich, einen Offloader sinnvoll auf einem PI zu betreiben. Denn in dieser Version bietet der Ethernet Anschluss genug Durchsatz, und die CPU ist leistungsfähig genug um eine ordentliche WireGuard Performance zu bieten. Dies war bei den Vorgänger Modellen so leider nicht der Fall.
Für kabelgebundene Clients und/oder Meshing per Kabel benötigt ihr einen VLAN-fähigen Switch!
Angeboten wird das PI in einer 1GB, 2GB und 4GB RAM Variante. Will man wirklich nur einen reinen Offloader ohne Zusatzfunktionen betreiben, reicht im Grunde die 1GB Version. Allerdings ist mehr RAM immer besser ;) und man weiß ja nicht, was man im Endeffekt noch alles darauf betreiben will.
Ansible-Playbook gesteuerter Bau des Offloaders
Wer nicht die nachfolgenden gut dokumentierten Schritte per Hand ausführen möchte, kann sich auch mit Hilfe von Ansible binnen 20 Minuten automatisiert einen Offloader Menü geführt und scriptiert erstellen lassen.
Raspberry Pi OS
Nachdem es aktuell1) noch kein fertiges Gluon Image für das Raspberry PI 4B gibt, holen wir uns nun das aktuelle Raspberry Pi OS (früher unter dem Namen Raspbian bekannt) auf unseren Rechner. Dies hat mitunter auch noch den Charme, dass wir bei Bedarf alle normalen Anwendungen wie Webserver, Chatserver oder z.B. den Unifi-Controller einfach installieren können.
Eine Anleitung zur manuellen Installation findet man auf der offiziellen Raspbian Seite.
Download
Kopieren des Images auf die MicroSD-Karte
Vorbereitende Konfigurationsschritte
Ändern des Default-Passwortes und kopieren des SSH-Public-Keys auf den Raspberry 4
Installation von VIM
Für die weiteren Konfigurationsschritte werden Root-Rechte benötigen, schlüpfen wir also als erstes in dessen Rolle:
$ sudo su -
Wi-Fi is currently blocked by rfkill. Use raspi-config to set the country before use. root@raspberrypi:~#
Anschließend installieren wir uns am besten die weiterentwickelte Variante vim des Standard-Editors vi - wir wollen uns ja später die Arbeit nicht unnötig schwer machen.
# apt install vim -y
Änderung des Hostnamens
Unser neuer Offloader braucht einen eigenen Namen, mit dem er sich von anderen eigenen Raspberry P4 unterscheiden lässt. In unserem Konfigurationsbeispiel soll der Name rpb4-wg-ol
lauten. Das Setzen des Nodenamens, mit der unser Offloader dann auch auf der Freifunk-Karte später erscheinen wird, erfolgt im Abschnitt Konfiguration des ext-respondd!
Wir setzen den Hostnamen wie folgt:
# hostnamectl set-hostname rpb4-wg-ol
Damit es beim späteren Wechsel der Userrechte zu keiner Warnmeldung kommt, weil der Hostname nicht aufgelöst werden konnte, korrigieren wir gleich noch die Konfigurationsdatei /etc/hosts
, und ändern auch dort den Standardnamen raspberrypi
auf unseren neuen individuellen Namen rpb4-wg-ol
ab.
# vim /etc/hosts
- /etc/hosts
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters # Django : 2020-12-16 # default: 127.0.1.1 raspberrypi 127.0.1.1 rpb4-wg-ol
Will man später nachvollziehen, welche Änderungen durch wen und wann gemacht wurden, kann es sehr hilfreich und zweckmäßig sein, entsprechende Änderungen in den Konfigurationsdateien, wie in dem gezeigtem Beispiel nachvollziehbar zu dokumentieren.
Entsperren des WiFi-Unterstützung
Möchte später auch das WLAN des Raspberry verwenden, so ist es zwingend von Nöten, dass WIFI explizit via rfkill freizugeben! Hier loggen wir uns per SSH ein und setzen folgenden Befehl ab:
# rfkill unblock wifi
Erst ein Reboot unseres Raspberry 4 aktiviert das WLAN tatsächlich!
# systemctl reboot
Initialer Update/Upgrade
Doch bevor wir unseren Raspberry 4 neu starten nehmen wir noch einen Update bzw. Upgrade aller installierten Pakete und -quellen vor!
# apt-get update
# apt-get upgrade -y
Nun ist es dann doch an der Zeit, dass wir unseren Kleinstrechner rpb4-wg-ol neu zu starten.
# systemctl reboot
BATMAN
Für das Routing der Layer-2-Verbindungen innerhalb des Freifunknetzes wird als Mesh-Protokoll B.A.T.M.A.N.-Advanced kurz batman-adv
eingesetzt, welches wir uns nun in diesem Abschnitt installieren und konfigurieren wollen.
Am Besten vergewissern wir uns noch vorab, welches die aktuelle BATMAN Version ist. Ende Dezember 2020 wäre dies die Version 2020.4
Download und entpacken
Kernelmodule
Installation und Konfiguration von batctl
Um BATMAN verwalten zu können müssen wir nun noch „batctl“ installieren.
# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-key 04EE7237B7D453EC
# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-key 648ACFD622F3D138
# echo "deb http://deb.debian.org/debian buster-backports main" | tee /etc/apt/sources.list.d/buster-backports.list
# apt update
# apt-get -t buster-backports install batctl
Anschließend überprüfen wir ob alles korrekt geladen wurde.
# batctl ra
Selected routing algorithm (used when next batX interface is created): => BATMAN_IV Available routing algorithms: * BATMAN_IV * BATMAN_V
Nachdem bei Freifunk München BATMAN_V verwendet wird, sehen wir dass aktuell der falsche Routing Algorithmus ausgewählt ist. Das korrigieren einmal sofort manuell.
# batctl ra BATMAN_V
Eine erneute Abfrage zeigt nun auf den korrekten Routing Algorithmus BATMAN_V.
# batctl ra
Selected routing algorithm (used when next batX interface is created): => BATMAN_V Available routing algorithms: * BATMAN_IV * BATMAN_V
Nun kommen wir zur Interface Konfiguration. In diesem Beispiel werden wir den RPi-Offloader im Segment „welt“ ansiedeln, deswegen benennen wir das zugehörige Interface br-welt
auch entsprechend. Hierzu benötigen wir noch die bridge-utils
, die wir uns noch installieren:
# apt install bridge-utils -y
Wir können mit nachfolgendem Befehl überprüfen, ob die Version von batctl
auch zur installierten Version von batman-adv
passt.
# batctl -v
batctl debian-2020.4-1~bpo10+1 [batman-adv: 2020.4]
Da beides in der Version 2020.4 vorliegt, können wir mit der weiteren Installation und Konfiguration wie gewohnt fortfahren.
Interface-Konfiguration
Die Konfiguration selbst nehmen wir über die Datei /etc/network/interfaces
vor, die wir nun entsprechend ergänzen werden.
# vim /etc/network/interfaces
- /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8) # Please note that this file is written to be used with dhcpcd # For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf' # Include files from /etc/network/interfaces.d: # Django : 2020-12-15 # default: source-directory /etc/network/interfaces.d auto eth0 iface eth0 inet dhcp auto br-welt iface br-welt inet dhcp bridge-ports bat-welt pre-up /usr/sbin/batctl ra BATMAN_V pre-up /sbin/ip link add dummy-welt type dummy pre-up /sbin/ip link set address $(ip -br l | grep eth0 | egrep -o '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' | head -1) dev dummy-welt pre-up /sbin/ip link set dummy-welt up pre-up /usr/sbin/batctl meshif bat-welt if add dummy-welt pre-up /sbin/ip link set bat-welt up pre-up /usr/sbin/batctl meshif bat-welt gw_mode client pre-up /sbin/ip link set address $(ip -br l | grep eth0 | egrep -o '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' | head -1) dev bat-welt post-up /sbin/ip link set address $(ip -br l | grep eth0 | egrep -o '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})' | head -1) dev br-welt
In diesem Beispiel setzen wir die MAC Addresse für BATMAN fest auf die MAC von eth0, damit wir später auch Statistiken etc abrufen können. Anschließend starten wir den Raspberry einmal neu!
# systemctl reboot
WIREGUARD
Grundlagen / Hintergründe
Installation
Konfiguration
WireGuard-Healthcheck
Im Betrieb kann es ab und an passieren, dass der WireGuard-Tunnel zusammenbricht, weil z.B. die Netzwerkverbindung abgerissen sit, oder ein Rebot der Gateways notwendig war. Damit in einem solchen Fall unser Offloader nicht offload geht, müssen wir die Verfügbar- und Nutzzbarkeit deer Tunnelverbindung in regelmäßigen Abständen prüfen und ggf. einschreiten und die Verbindung neu aufbauen.
Da wir das ntürlich nict manuell erledigen wollen und können, legen wir uns ein kleines bash-Script hierzu an.
# vim /usr/local/bin/checkup
- /usr/local/bin/checkup
#!/bin/bash # Django : 2020-12-15 # Check connectivity to supernode HTTP_STATUS_CODE=(`curl --silent --interface wg-welt --get --ipv6 --connect-timeout 5 --write-out '%{http_code}' --output /dev/null 'http://[fe80::27c:16ff:fec0:6c74]:80'`) if [ ${HTTP_STATUS_CODE} != "200" ]; then logger -t checkuplink "curl --silent --interface wg-welt --get --ipv6 --connect-timeout 5 --write-out '%{http_code}' --output /dev/null 'http://[fe80::27c:16ff:fec0:6c74]:80' faild with HTTP-errorcode: ${HTTP_STATUS_CODE}" logger -t checkuplink "... better we restart the wireguard-tunnel!" ip link set nomaster bat-welt dev vxlan-mesh &> /dev/null ip link del dev mesh-vpn &> /dev/null ip link del wg-welt &> /dev/null systemctl stop wg-quick@wg-welt systemctl restart networking logger -t checkuplink "Sending public-key to the broker." /usr/bin/wget -q -O- --post-data='{"domain":"ffmuc_welt","public_key":"HjDRCwE4Q7UPAKXrmM4s6VOgMK+HJZCixWTaVC8KiRU="}' http://broker.ffmuc.net/api/v1/wg/key/exchange logger -t checkuplink "Starting wireguard-daemon." systemctl start wg-quick@wg-welt logger -t checkuplink "Starting vxlan-meshing." vxlan else #logger -t checkuplink "wiregurad-tunnel is up an running : HTTP-statuscode: ${HTTP_STATUS_CODE}" fi
Zum Ausführen statten wir das Script mit den x
-Rechten aus.
# chmod +x /usr/local/bin/checkup
Damit das Script nun münütlich ausgeführt wird, legen wir noch einen hierzu benötigten Eintrag in der /etc/crontab
an.
# vim /etc/crontab
- /etc/crontab
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) # # Django : 2020-12-15 # check wireguard-connection * * * * * root /usr/local/bin/checkup 2>&1 /dev/null
Sollte der WireGuard-Tunnel nun zusammenbrechen, aus welchen Gründen das auch immer passieren möge, wird die Verbindung automatisch wieder aufgebaut und im syslog des Raspberry entsprechend dokumentiert.
Dec 16 19:40:09 rpb4-wg-ol checkuplink curl --silent --interface wg-welt --get --ipv6 --connect-timeout 5 --write-out '%{http_code}' --output /dev/null 'http://[fe80::27c:16ff:fec0:6c74]:80' faild with HTTP-errorcode: 500 Dec 16 19:40:10 rpb4-wg-ol checkuplink "... better we restart the wireguard-tunnel!" Dec 16 19:40:12 rpb4-wg-ol checkuplink "Sending public-key to the broker." Dec 16 19:40:16 rpb4-wg-ol checkuplink "Starting wireguard-daemon." Dec 16 19:40:18 rpb4-wg-ol checkuplink "Starting vxlan-meshing."
Mesh per vxlan
Hintergründe
Berechnung der vxlan id
Konfiguration
ext-respondd
Dieser Teil ist wichtig, da es sein kann dass man gegen die Nutzungsbedingungen seiner Community verstößt, wenn man sich nicht als Knoten im Netz meldet. Außerdem trägt es generell zur Netzhygiene bei, wenn alle Knoten in den Statistiken auftauchen.
Werteermittlung
Installation
Konfiguration
Daemon starten
Konfigurations-/Netzzwerkcheck
Nun wollen wir auch prüfen welche Verbindungen unser Offloader hält.
# ip addr show dev br-welt
6: br-welt: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1280 qdisc noqueue state UP group default qlen 1000 link/ether dc:a6:32:5c:46:07 brd ff:ff:ff:ff:ff:ff inet 10.80.204.2/21 brd 10.80.207.255 scope global dynamic br-welt valid_lft 409sec preferred_lft 409sec inet6 2001:678:e68:109:dea6:32ff:fe5c:4607/64 scope global dynamic mngtmpaddr valid_lft 7118sec preferred_lft 3518sec inet6 fe80::dea6:32ff:fe5c:4607/64 scope link valid_lft forever preferred_lft forever
Wie sehen also, dass unser Node die Adressen 10.80.204.2
sowie 2001:678:e68:109:dea6:32ff:fe5c:4607
hält.
Das Gleiche erreichen wir mit Hilfe dieses Befehls:
# ip -br a | grep br-welt
br-welt UP 10.80.204.2/21 2001:678:e68:109:dea6:32ff:fe5c:4607/64 fe80::dea6:32ff:fe5c:4607/64
Wir sehen somit die Adressen auf unseren Interfaces aus dem gewählten Segment.
Als nächstes prüfen wir, ob die beiden Interfaces dummy-welt
und mesh-vpn
aktiv sind.
# batctl meshif bat-welt if
dummy-welt: active mesh-vpn: active
Den Neighbor unseres Nodes finden wir wie folgt heraus:
# batctl meshif bat-welt n
[B.A.T.M.A.N. adv 2020.4, MainIF/MAC: dummy-welt/dc:a6:32:5c:46:07 (bat-welt/dc:a6:32:5c:46:07 BATMAN_V)] IF Neighbor last-seen 8a:5d:44:50:c3:f8 0.220s ( 10.0) [ mesh-vpn]
Zu guter Letzt sehen wir uns noch die Gateway-Liste an über bzw. mit denen unser Offloader verbunden ist.
# batctl meshif bat-welt gwl
[B.A.T.M.A.N. adv 2020.4, MainIF/MAC: dummy-welt/dc:a6:32:5c:46:07 (bat-welt/dc:a6:32:5c:46:07 BATMAN_V)] Router ( throughput) Next Hop [outgoingIf] Bandwidth * f2:00:25:10:00:00 ( 10.0) 8a:5d:44:50:c3:f8 [ mesh-vpn]: 1000.0/200.0 MBit f2:00:26:10:00:00 ( 10.0) 8a:5d:44:50:c3:f8 [ mesh-vpn]: 1000.0/200.0 MBit
Meshing per Kabel
Möchte man per Kabel meshen, so ist dies auf Grund dessen, dass unser Raspberry nur eine Netzwerkschnittstelle hat, im Grunde nur per VLAN realisierbar.
Dazu ist es erforderlich, dass zuerst ein VLAN Interface in /etc/network/interfaces
angelegt und an das BATMAN Interface anghängt wird.
# vim /etc/network/interfaces
- /etc/network/interfaces
auto eth0.666 iface eth0.666 inet manual post-up /usr/sbin/batctl ra BATMAN_V post-up /usr/sbin/batctl meshif bat-welt if add eth0.666
Bitte beachten:
Das Setup funktioniert nur in Umgebungen ohne VXLAN Meshing. Mit VXLAN Meshing braucht es auch noch ein VXLAN Interface. Details hierzu finden sich im Nachgang!
Mesh per vxlan
Für andere Communities benötigt man die entsprechenden VXLAN IDs zum Meshen - also bei Bedarf bei der lokalen Community nachhaken!
Um meshing per Kabel nutzen zu können, muss bei manchen Communities (wie zum Beispiel bei FFMUC) VXLAN benutzt werden.
Bei uns gibt es momentan folgende VXLAN IDs, diese werden von GLUON dynamisch aus dem domain_seed erzeugt.
Domain | vxlan id |
---|---|
ffmuc_muc_cty | 10758607 |
ffmuc_muc_nord | 15521492 |
ffmuc_muc_ost | 2948862 |
ffmuc_muc_sued | 8599288 |
ffmuc_muc_west | 7318933 |
ffmuc_uml_nord | 5705961 |
ffmuc_uml_ost | 4892713 |
ffmuc_uml_sued | 16544703 |
ffmuc_uml_west | 16677749 |
ffmuc_gauting | 16175732 |
ffmuc_freising | 12937858 |
ffmuc_welt | 16306234 |
ffmuc_augsburg | 10700201 |
Um die VXLAN ID aus einem domain_seed zu berechnen haben wir ein kleines Python Skript geschrieben.
python3 get_vxlan_id_from_domain_seed.py domain_seed
Die Konfiguration in /etc/network/interfaces sieht so aus, um per VLAN666 VXLAN Meshing für das Segment Welt zu machen. Wie ihr seht, wird dafür die ID aus der obigen Tabelle benötigt.
- /etc/network/interfaces
auto eth0.666 iface eth0.666 inet manual pre-up /sbin/ip link add vxlan-mesh type vxlan id 16306234 group ff02::15c dstport 4789 port 32768 61000 no udpcsum udp6zerocsumtx udp6zerocsumrx dev eth0.666 || true up /sbin/ip link set vxlan-mesh up post-up /usr/sbin/batctl ra BATMAN_V post-up /usr/sbin/batctl -m bat-welt if add vxlan-mesh down ip link set vxlan-mesh down post-down ip link del vxlan-mesh || true
Damit das vxlan-mesh Interface auch der bevorzugte Meshingpoint in BATMAN_V wird noch folgendes in die /etc/rc.local
hinzufügen.
# vim /etc/rc.local
- /etc/rc.local
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi # Django : 2020-12-15 /usr/sbin/batctl hardif vxlan-mesh throughput_override 1000000 exit 0
Zum Aktivieren unserer Konfigurationsänderung fahren wir entweder das Netzwerkiinterface hoch oder starten unseren Offloader einfach einmal neu:
# systemctl reboot
Wenn alles geklappt hat und ihr bereits einen Router zum Meshen in diesem VLAN habt, sollte danach folgendes in batctl zu sehen sein.
batctl meshif bat-welt n
[B.A.T.M.A.N. adv 2020.4, MainIF/MAC: dummy-welt/dc:a6:32:5c:46:07 (bat-welt/dc:a6:32:5c:46:07 BATMAN_V)] IF Neighbor last-seen 8e:89:98:45:6c:70 0.380s ( 1.0) [vxlan-mesh] a2:ca:66:65:30:40 0.050s ( 1.0) [vxlan-mesh] 9a:9b:66:30:d9:38 0.110s ( 1.0) [vxlan-mesh] 6a:b4:d0:73:15:47 0.100s ( 10.0) [ mesh-vpn]
Sollte sich kein Client am Mesh VLAN befinden, wird die vxlan-mesh Zeile nicht angezeigt.
Außerdem sollten die Interfaces wie folgt aussehen:
# batctl -m bat-welt if
dummy-welt: active vxlan-mesh: active fastd-welt: active
Leider ist der Link zum Gateway auf der Map nicht zu sehen.
Wifi Clients
Soll der Offloader auch ein WiFI-Clientnetz ausstrahlen, müssen wir hostapd
installieren und konfigurieren. Bei der Vergabe der SSID ist zu beachten:
Installation
Konfiguration
LAN Clients
Will man LAN Clients versorgen, so erstellt man am einfachsten ein VLAN getaggtes Clientnetz. Dazu erstellt man in der Konfigurationsdatei /etc/network/interfaces
die zugehörige Konfiguration. Im folgenden Beispiel nutzen wir die VLAN-ID 333
und definieren zunächst einmal das VLAn-Interface und fügen es anschließend in der vorhandenen Bridge hinzu.
# vim /etc/network/interfaces
- /etc/network/interfaces
auto eth0.333 iface eth0.333 inet manual auto br-welt iface br-welt inet dhcp bridge-ports bat-welt eth0.333
Geschwindigkeiten
Nun zur wichtigsten Frage, welche Performance kann man erwarten.
Hier ein paar Speedtest Ergebnisse:
$ wget -O /dev/null https://speed.hetzner.de/10GB.bin --report-speed=bits
--2019-07-01 09:12:45-- https://speed.hetzner.de/10GB.bin Resolving speed.hetzner.de (speed.hetzner.de)... 88.198.248.254 Connecting to speed.hetzner.de (speed.hetzner.de)|88.198.248.254|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 10485760000 (9.8G) [application/octet-stream] Saving to: ‘/dev/null’ /dev/null 2%[===> ] 288.96M 115Mb/s eta 14m 34s
Uplink per LTE via iOS Gerät
Nebenbei gibt es noch die Möglichkeit, Tethering z.B. mit iOS Geräten zu machen. Dazu muss usbmuxd installiert werden. Und in der /etc/network/interfaces
ein Interface angelegt werden.
# apt install usbmuxd libimobiledevice6 -y # vim /etc/network/interfaces
- /etc/network/interfaces
... allow-hotplug eth1 iface eth1 inet dhcp ...
Am Besten rebootet man den Raspberry Offloader einmal. Danach steckt ihr euer iOS Gerät per USB an während ihr im Hotspot Menü seid und werdet gefragt, ob das PI Zugriff bekommen kann. Das beantwortet ihr mit „Ja“.
Euer PI bezieht sich nun eine IP per DHCP vom iOS Gerät und kann darüber Verbindungen zu den Freifunk Gateways aufbauen.
Und so sieht ein Mobile PI mit iPad als Uplink aus:
OLED Display
Im nachfolgenden Beispiel verwenden wir ein OLED Display von AZDelivery mit 128×64 Pixeln. Das schöne an dem Display ist, es funktioniert auch mit 5V und ist damit noch einfacher anzuschließen.