Es ist Wahnsinn, welche technischen Neuerung in der Welt passieren und man bekommt jahrelang davon nichts mit. Bei meiner Bastelei mit PostmarketOS bin ich über die Schnittstelle p2p0 gestolpert, die sich als WLAN meldet, und habe mich gefragt, was das ist. Jo, da zeigt sich, ich habe seit 10 Jahren nicht mitbekommen, dass es einen anderen Funknetzwerktyp gibt: Wi-Fi-Direct (Wikipedia-Eintrag). Dieser nutzt zwar sehr viel der Technik des normalen WLAN-Standards IEEE 802.11, aber bringt auch einige Neuerungen mit.
Struktur von Wifi-Netzwerken
Bei Wifi-Direct ist die Denkweise nicht mehr die hierarchische Struktur mit Access-Point und Client, sondern Geräte finden sich als Partner (Peer-to-Peer/P2P) zusammen und bilden Gruppen. Dabei wird auch immer ein Gruppeneigentümer (GO/Group-Owner) bestimmt, der technisch die Rolle des Access-Points übernimmt. Daher können auch Geräte, die kein Wifi-Direct können, einer solchen Gruppe beitreten.
Der einfachste Fall sind zwei Geräte, die sich miteinander verbinden – zum Beispiel Handy und Laptop oder Handy und Fotokamera oder Handy und Handy. Aber es können auch mehrere Geräte in einer Gruppe sein. Der Unterschied zum hierarchischen Modell mit Access-Point ist dabei, dass man auf dem Client nicht mehr den Zugang zum Netzwerk einrichtet, sondern ein Gerät wird vom Gruppeneigentümer oder einem Gruppenmitglied eingeladen und die Anmeldedaten zur Gruppe werden per WPS (Wifi Protected Setup) ausgetauscht. Die Berechtigung kann im einfachsten Fall über die Bestätigung per Knopfdruck (pbc/Push Button Configuration), etwas sicherer über einen PIN-Abgleich oder sehr komplex über NFC oder einen externen Vermittler (er/externel registrar) erfolgen; genauer Informationen gibt es im Dokument README-WPS (auch im Dateisystem unter /usr/share/doc/wpasupplicant/ zu finden).
Vorteile für IoT
Diese neue Form des Netzwerkaufbaus finde ich vor allem für IoT-Geräte sehr nützlich. An einem Drucker oder Fernseher kann man noch mit viel Mühe über eine primitive Eingabe einen Schlüssel (WPA-PSK/pre-shared key) eingeben, aber an einer Lampe oder einer Wetterstation schon nicht mehr. Wenn aber auf diesen Geräten die MAC-Adresse und eine PIN aufgedruckt sind, könnten diese Geräte sich nach dem Einschalten für einige Minuten auf die Suche nach Netzwerken begeben und vom Handy oder über die Weboberfläche vom Router aus könnte die Einladung mit PIN erfolgen.
Wenn die Suche nach Netzwerken nur nach dem Einschalten erfolgt, ist auch gewährleistet, dass der Initiator physischen Zugriff auf das Gerät hat und sich nicht einfach nur in der Umgebung aufhält. Ist eine Verbindung einmal konfiguriert, erfolgen keine neuen Versuche, so dass das Gerät nach einer bewussten Inbetriebnahme nicht übernommen werden kann. Ein Reset (ggf. inklusive des Löschens der Daten) könnte über einen Knopfdruck erfolgen oder bei einer LED-Lampe habe ich es schon mit fünfmaligem Ein- und Ausschalten binnen drei Sekunden gesehen.
Nutzung unter Linux
Ob ein Laptop Wifi-Direct unterstützt, kann man mit dem Befehl iw list
(bei Debian im Paket iw) ermitteln. In dessen Ausgabe müssen bei
Supported interface modes die Angaben P2P-client, P2P-GO oder P2P-device
erscheinen. Unter Linux wird Wifi-Direct auch als P2P bezeichnet.
Unter Linux konfiguriert man Wifi-Direct mit wpa_supplicant. Ich nutze hierfür
das Kommandozeilenprogramm wpa_cli, weshalb ich keine GUI-Programme im
Folgenden beschreibe. Aufgrund der Zugriffsrechte kann es sein, dass wpa_cli
mit sudo als Root gestartet werden muss. Durch die Konfiguration der neuen
Verbindungen entstehen immer virtuelle WLAN-Geräte, deren Name mit p2p-
beginnt. Deshalb sollte beim Aufruf von wpa_cli das Gerät angegeben werden,
das man konfigurieren will: wpa_cli -i wlp59s0
. Während der Ausführung kann
man auch mit dem Befehl ifname
das aktuelle Gerät und mit interface
die
Liste der verfügbaren Geräte anzeigen lassen und mit interface …
das Gerät
wechseln.
Es gibt auch noch ein Pseudogerät p2p-dev-…, bei dem mehr Meldungen zu den
P2P-Vorgängen ausgegeben werden. Deshalb ist es das beste, alle Tätigkeiten von
diesem Gerät aus zu starten: wpa_cli -i p2p-dev-wlp59s0
.
Bei der Eingabe zu wpa_cli kann man mit help …
die Kurzhilfe zu den Befehlen
abfragen und auch mit Tabvervollständigung die Eingabe an einigen Stellen
erleichtern.
Ersteinrichtung und Verbindung zwischen Linux-Laptop und Android
Zuerst der einfache Fall, bei dem der Linux-Laptop als Client und Android als GO (Gruppeneigentümer/Access-Point) fungiert. Der Einfachheit halber verwende ich auch keine PIN, sondern nur pbc, aber erkläre die PIN-Parameter dann im Abschnitt über p2p_connect.
Die Konfiguration von Wifi-Direct findet man bei Android über die Liste der verfügbaren WLANs und dort im Dreipunktemenü bei Erweitert. Dort sollte man im Dreipunktemenü als erstes mit Gerät umbenennen dem Gerät einen sinnvollen Namen geben. Ich habe meines einfach i9100 genannt. Mit der Zeit tauchen in der Liste verschiedene Geräte auf.
Unter Linux sollte man in der Konfiguration für wpa_supplicant mit dem Eintrag
device_name=…
dem Gerät einen sinnvollen Namen geben. Einmalig geht dies auch
mit set device_name=zenbook
bei wpa_cli.
- mit
p2p_find 120
für zwei Minuten die Suche nach Geräten aktivieren, der Name des Laptops sollte auf dem Android-Handy erscheinen - mit
p2p_peers
sich die Liste der gefundenen Geräte anzeigen lassen - mit
p2p_peer 8a:32:9b:26:83:4f
sieht man die Informationen zum Gerät, u. a. device_name und manufacturer - mit
p2p_connect 8a:32:9b:26:83:4f pbc go_intent=0
die Verbindung aufbauen und am Handy den Aufbau bestätigen
Sollte der Verbindungsaufbau nicht funktionieren oder gar FAIL bei
p2p_connect erscheinen, dann muss man bei den Geräteinformationen die Einträge
age und flags prüfen. Die letzte Verbindung zum Gerät (age) sollte nur
wenige Sekunden her sein und bei flags muss REPORTED stehen. Sollte dort
PROBE_REQ_ONLY stehen, war die Erkennung nicht erfolgreich und mit p2p_find
120
sollte eine neue Suche gestartet werden.
Die Suche kann auch unbegrenzt ohne Zeitangabe durchgeführt werden und
manuell mit p2p_stop_find
beendet werden, wenn der gewünschte Partner
gesichtet wurde.
Wenn der Verbindungsaufbau geklappt hat, kann man sich vom Handy per DHCP eine
IPv4-Adresse holen oder mit ping -I p2p-wlp59s0-0 ip6-allnodes
die
IPv6-Adresse des Handys ermitteln.
Einstellungen für systemd-networkd
Für networkd habe ich als allgemeine Einstellung /etc/systemd/network/20-dhcp.network DHCP konfiguriert:
[Match]
Type=wlan ether
[Network]
DHCP=yes
Diese greift auch bei P2P-Verbindungen. Informationen kann man sich dann mit
networkctl list
und networkctl status p2p-wlp59s0-0
anzeigen lassen.
Der Linux-Laptop als GO mit Android
Wifi-Direct ermöglicht auch statische IP-Adressen oder auch nur mit IPv6 zu arbeiten. Aber bei Android (7.1/LineageOS 14.1) wird vorausgesetzt, dass der Gruppeneigentümer DHCP für IPv4 anbietet, sonst bleibt Android im Zustand »Eingeladen« und kappt die Verbindung nach etwa einer Minute wieder, obwohl die WLAN-Verbindung besteht.
Mit systemd-networkd kann man auch einen DHCP-Server mit Weiterleitung ins Internet einrichten:
[Match]
Type=wlan
WLANInterfaceType=p2p-go
[Network]
Address=10.42.42.1/24
DHCPServer=yes
IPForward=yes
IPMasquerade=yes
Der Verbindungsaufbau läuft dann wie folgt:
- mit wpa_cli die Suche starten:
p2p_find 10
- wenn das Gerät gefunden wurde, dieses mit
p2p_connect 02:37:6d:9e:ab:f3 pbc go_intent=15
einladen - am Android die Einladung bestätigen
Liste von Befehlen für wpa_supplicant
p2p_find
startet suche nach Geräten in der Umgebung, als Parameter kann auch eine Zeit in Sekunden angegeben werden, wie lange gesucht werden sollp2p_stop_find
beendet die Suchep2p_peers
listet die gefunden Geräte aufp2p_peer 00:00:00:00:00:00
gibt Informationen zum Gerät 00:00:00:00:00:00 ausp2p_flush
löscht die Liste der bekannten Geräte und beendet die Suchep2p_connect 00:00:00:00:00:00 pbc join
Verbindung mit dem Master-Gerät 00:00:00:00:00:00 herstellenp2p_group_remove p2p-wlp59s0-18
entfernt die Gerätegruppe vom Interface p2p-wlp59s0-18 (dieses kann mitinterface
ermittelt werden und sollte bei der Aktion nicht das aktuelle Interface (Befehlifname
) sein; ggf. mitinterface wlp59s0
wechseln)list_network
zeigt für eine Netzwerkgruppe die WLAN-SSID anwps_pbc
auf dem Master für das Interface der Gruppe, um Verbindungen zu akzeptieren
flags=[REPORTED][NOT_YET_READY]
PROBE_REQ_ONLY
age=…
GO = Group Owner
• P2P Group • P2P Device • P2P Group Owner (GO) • P2P Client
WiFi Direct Configuration Scripts - Texas Instruments Wiki
p2p_connect
- pbc: Knopfdruck, reine Bestätigung
mit PIN:
- pin: wpa_supplicant generiert eine PIN und gibt diese aus
- Eingabe einer PIN
- keypad
display
p2p_add_group [persistent]
interface …
set_network 0 ssid "…"
set_network 0 psk "…"
undp2p_get_passphrase
wps_pbc
oderwps_pin
oderwps_pin PIN
p2p_invite peer=…
pin display
wps_check_pin 1234
wps_pin get
p2p_connect … 1234|pin display
: Am Handy muss die PIN eingegeben werdenp2p_connect … 1234|pin keypad
: Am Handy wird die PIN angezeigtwps_pin 8a:32:9b:26:83:4f 43155408 p2p_prov_disc 8a:32:9b:26:83:4f keypad OK
mehrere Geräte
p2p_connect … pbc go_intent=15
für Client 1- ``
persistent
p2p_group_add persistent=…
id des Netzwerks von list_networks