Wechseln Sie zwischen AP- und Client-Modus

8

Ich arbeite an einem RPi-Radioprojekt und möchte zwischen einem "Setup-Modus" wechseln können, in dem das RPi als Wi-Fi-Zugangspunkt fungiert, sodass der Benutzer seine Wi-Fi-Anmeldeinformationen für zu Hause senden kann Schreiben Sie sie dann über eine dedizierte mobile App in die wpa_supplicantDatei und in einen "normalen Modus", in dem die Karte zum Wi-Fi-Client wird und eine Verbindung zum Wi-Fi-Netzwerk herstellt, das der Benutzer im Setup-Modus angegeben hat.

Ist es möglich?

Zbam
quelle

Antworten:

8

Es ist möglich, ich schlage vor, dass Sie ein lighttpd mit einem Webservice für Ihre App verwenden. Danach wechseln Sie einfach zwischen hostapd (AP-Modus) und wpa_supplicant (Client-Modus). Es ist so einfach wie einen Dienst zu stoppen und einen anderen Wia-Shell-Befehl zu starten.

UPDATE: Einige Tipps. Am einfachsten ist es, ein Systemd als Triggerhappy Switcheroo zu verwenden und es folgendermaßen ausführen zu lassen:

  • Verwenden Sie wpa_supplicant als Service
  • Ein Hostapd ist bereits ein Dienst in Ubuntu / Debian, Sie müssen also nichts dagegen tun.

Konfigurieren Sie als Nächstes ISC-DHCPD und Hostapd für Ihren AP-Modus, überprüfen Sie, ob sie als AP funktionieren. Sie können also einem Netzwerk beitreten und eine IP-Adresse erhalten. DNS von Ihrem DHCP kann von einem Gerät aus pingfähig sein und funktioniert. Verwenden Sie danach dieses Cheatsheet auf SystemD , damit dhcpd und hostapd beim Booten nicht automatisch gestartet werden :

#systemctl disable hostapd.service
#systemctl disable isc-dhcp-server.service

und hör auf mit SoBs;) einfach so:

#systemctl stop hostapd.service
#systemctl stop isc-dhcp-server.service

Danach über einen Link, auf den ich hingewiesen habe, machen Upstrings wpa_supplicant (installieren Sie es so :) ebenfalls zu apt-get install wpasupplicanteinem Dienst und richten Sie es so ein, dass es wie gewünscht funktioniert, dh Ihr RPi, das mit dem AP verknüpft ist, den Sie verwenden möchten, erhält IP + DNS, kann pingen / wget usw. Danach - deaktivieren und stoppen Sie den Dienst genau so, wie wir es getan haben :

#systemctl stop wpa_supplicant.service
#systemctl disable wpa_supplicant.service   

Danach geht hier die Magie :) Um vom Modus in einen anderen zu wechseln, stoppen Sie einfach die Dienste aus einem vorherigen Modus und starten Sie die benötigten (dh Stop wpa_supplicantand Start hostapdund isc-dhcp-server) wie folgt:

#systemctl stop wpa_supplicant.service && systemctl start hostapd.service && systemctl start isc-dhcp-service.service

Ja, in einer einzigen Zeichenfolge . Das Geheimnis hier liegt in der " && " -Konstruktion - es ist eine Art Warteschlange, in der das nächste Element nur ausgeführt wird , wenn das vorherige nicht fehlgeschlagen ist. Überprüfen Sie also, wo immer Sie diese Pipe anrufen, den Exitcode 0. Dies garantiert Ihnen, dass beim Umschalten der Modi alles in Ordnung war. Das ist es, zögern Sie nicht, Fragen zu stellen, wenn Sie weitere Hilfe benötigen!

Alexey Vesnin
quelle
Danke für deine Antwort. Daran habe ich gedacht, aber ich bin nicht so gut mit Shell-Skripten. Ich werde versuchen, einige Beispiele zu finden, weil ich denke, ich muss mit dhcpd.conf, / etc / default / isc-dhcp-server und / etc / network / interfaces
herumspielen,
@Zbam Benötigen Sie weitere Informationen, um Ihnen zu helfen?
Alexey Vesnin
Ein Einblick in die Art und Weise, wie ich von einem Modus in den anderen wechseln könnte, wäre großartig, denn nach dem, was ich gesehen habe, handelt es sich um viele Dateien
Zbam
@ Zbam werfen Sie einen Blick auf meine Bearbeitung, ich habe meine Antwort aktualisiert
Alexey Vesnin
Dies war sehr nützlich für mein eigenes "Turtles" -Projekt ... aber ich bin mir noch in einem Detail nicht sicher: Ich möchte im Idealfall "versuchen", eine Verbindung zu einer bekannten WLAN-Verbindung herzustellen, und wenn dies fehlschlägt, wird standardmäßig der AP-Modus verwendet. Gibt es eine einfache Möglichkeit, dies mit SystemD zu tun, oder sollte ich ein Shell-Skript schreiben, das die Verbindung versucht, und dann die oben genannten Schritte ausführen? Jede Anleitung wäre hilfreich! (Oder lassen Sie mich wissen, wenn Sie dies als separate Frage bevorzugen würden)
Aerophilic