WIFI_AP_STA --> AP nicht erreichbar wenn WIFI_SSID falsch?

Hi zusammen,

ich hab mal wieder eine Verständnisfrage.
Ich möchte den ESP8266 (Wemos D1 mini) im WIFI_AP_STA mode betreiben.

Dazu folgender Beispielsketch:


#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);

const char indexPage[] PROGMEM = R"=====(
<html>
  <head>
  </head>
  <body>
    Test
  </body>
</html>
)=====";

 
#define WIFI_SSID "MEINE_FALSCHE_SSID"
#define WIFI_PASS "MEIN_FALSCHES_PASSWORT"
 
#define AP_SSID "ESP8266Test"
#define AP_PASS "123456789"
 
void setup()
{
  Serial.begin(115200);
  Serial.println();
 
  // Accesspoint aufbauen --> Klappt wunderbar 
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAP(AP_SSID, AP_PASS);
  // Die IP-Adresse wird auch angezeigt (192.168.4.1)
  Serial.print(WiFi.softAPIP());
  
  // Hier versucht er sich nun mit den falschen Zugangsdaten zu verbinden
  WiFi.begin(WIFI_SSID, WIFI_PASS);
 
  unsigned long pause=10000;
  unsigned long connTimer = millis();
  int i=0;
  while (WiFi.status() != WL_CONNECTED && (millis()-connTimer < pause)) {
    Serial.print(".");
    i++;
    delay(500);
  }
  
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println(F("Verbunden mit lokalem-WLAN"));
    Serial.print(WiFi.localIP());
  } else {
    // Und hier landet er nun...
    Serial.println("Keine Internetverbindung");
  }
 
  // Leider bekomm ich dann keine Verbindung (auch nicht mit dem AP) zustande
  server.on("/", display_root);
  server.begin(); // Server starten
 
}
 
void loop() {
  server.handleClient();
  delay(100);
}

void display_root() {
  server.send(200, "text/html", indexPage);
}

Das seltsame ist: Wenn ich korrekte WLAN-Zugangsdaten als SSID und Passwort hinterlege, kann ich mich sowohl über die localIP (übers Netzwerk) als auch über die softAPIP (direkt mit dem ESP) verbinden.

Sind aber die WLAN-Zugangsdaten (SSID und Passwort) falsch oder mein WLAN ist ausgeschaltet, krieg ich auch keine Verbindung mehr mit dem AP zustande. Wenn ich mich mit dem Accesspoint "ESP8266Test" verbinden will, kommt dann eine Meldung "Keine Verbindung mit diesem Netzwerk möglich".

Kann es sein, dass der Wemos komplett den Zugriff blockiert, wenn er mit Wifi.begin() nichts erreicht? Das wäre ja doof. Denn wenn ich mal mein WLAN ausgeschaltet habe, muss der Zugriff auf den Accesspoint ja immer noch klappen.

Oder wenn man ein Userinterface bastelt in dem ein Benutzer seine WLAN-Zugangsdaten hinterlegen kann und sich da verschreibt, muss er doch immer noch eine Möglichkeit haben, per Accesspoint auf das GUI zuzugreifen um die WLAN-Zugangsdaten zu korrigieren.

Oder hab ich irgendwas im Code übersehen?

LG
Daniel

Hast Du überhaupt ein Gerät, dass sich ohne WLAN zur Standard-IP des AP 192.168.4.1 connecten kann?

Gruß Tommy

Hey Tommy,

Wie meinst das?
Ich nehm halt mein Handy und finde da dann den AP des ESP im WLAN Netzwerk.
Damit verbinde ich mich dann.
Und wenn die Verbindung hergestellt ist (was aber eben nicht klappt, wenn Wifi.begin fehlschlägt) verbinde ich mich mit 192.168.4.1

Lg Daniel

Dann probiere das doch erst mal mit reinem AP.
Der Zugriff auf den AB sollte nicht übers Heim-WLAN gehen, sondern direkt.

Gruß Tommy

Hi,

der Zugriff auf den AP direkt funktioniert.
Aber sobald ein Wifi.begin() mit falschen Zugangsdaten ausgeführt wird, klappt die Verbindung mit dem AP nicht mehr.

Kann es irgendwas mit der Thematik zu tun haben:

Hab ich grad im Netz gefunden.

Aber wenn die folgende Verbindungsreihenfolge (wie in meinem Sketch) eingehalten wird

 // Accesspoint aufbauen --> Klappt wunderbar 
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAP(AP_SSID, AP_PASS);
  // Die IP-Adresse wird auch angezeigt (192.168.4.1)
  Serial.print(WiFi.softAPIP());
  
  // Hier versucht er sich nun mit den falschen Zugangsdaten zu verbinden
  WiFi.begin(WIFI_SSID, WIFI_PASS);

Sollte doch auch bei fehlgeschlagenem Wifi.begin() noch die Verbindung mit dem AP und dann der Zugriff über 192.168.4.1 funktionieren.

So wie ich das verstanden habe, hab ich doch beim Mode "WIFI_AP_STA" immer die folgenden Verbindungsmöglichkeiten:

  • im WLAN-Netzwerk mit dem AP des ESP verbinden und dann im Browser 192.168.4.1
  • wenn Wifi.begin() klappt alternativ dazu mit dem "Heim-WLAN" verbinden und dann Zugriff über die angegebene WiFi.localIP()

aber ich hab da Gefühl, dass - wenn der ESP sich einmal mit falschen Zugangsdaten verbunden hat - irgendwie der Wurm drin ist und auch der AP-Zugriff nicht mehr klappt. Als ob die falschen Daten dann drin hängen und er immer wieder versucht, sich mit den falschen Daten einzuwählen und daher auch den AP blockt...kann das sein?

LG Daniel

Vorweg: Die Eigenarten des ESP8266 kenne ich nicht, da ich nur mit dem ESP32 programmiere. Praktische Erfahrungen zu Deiner Fragestellung habe ich keine.

Du könntest überprüfen, ob die Verbindung zum Router funktioniert, wenn nicht auf rein AP umschalten:

  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  if (WiFi.status() != WL_CONNECTED) {
      WiFi.disconnect();
      WiFi.mode(WIFI_AP);
  }
  WiFi.softAP(AP_SSID, AP_PASS);

Nicht getestet!

Die Idee stammt vom Login Manager von Fips, der auch Seiten für den ESP8266 bereitstellt.

Gute Idee.

Wäre aber noch interessant, wie es sich verhält, wenn man folgende Situation hat.

In void Setup() wird Wifi.begin() ausgeführt und zwar mit KORREKTEN Zugangsdaten.
Der Router ist aber gerade nicht erreichbar und Wifi.begin() schlägt daher fehl.
In deinem Beispiel würde er nun in den AP-Mode gehen und das Programm startet den void Loop().

Nun möchte ich aber, dass - sobald Jemand den Router einschaltet, nachträglich dann wieder in den WIFI_AP_STA Modus gewechselt wird.

Und hier blick ich noch nicht ganz durch, wie man so etwas am smartesten managed.
Baut man einen Timer ein, dass z.B. im Abstand von 10 Minuten immer mal wieder ein Wifi.begin() versucht wird? Man kann ja anscheinend auch ein AutoConnect Setzen.
Aber wenn ich - wie in deinem bzw. Fips Beispiel im Setup direkt umschalte auf AP Mode, greift das AutoConnect ja dann wahrscheinlich nicht mehr.

Also nochmal zusammenfassend.

Der Wunsch wäre quasi, dass der ESP sobalds er eingeschaltet ist, immer per AP erreichbar ist und sobald das lokale WLAN verfügbar ist, ZUSÄTZLICH auch noch im STA mode.

Bin für jeden Tipp dankbar. Ich steig hier noch nicht ganz durch.

Grüßle
Daniel

Regelmäßig mit AP_STA und wifi.begin prüfen, ob das funktioniert.
Evtl. noch eine Sperre einbauen, wenn gerade eine Abfrage läuft.

Gruß Tommy

OK....
ich dachte, da gibts Möglichkeiten, dass diese regelmäßige Prüfung vom ESP selber im Hintergrund übernommen wird (Stichwort "AutoConnect")

Ich hab u.a. das hier gefunden:

und das hier

https://hieromon.github.io/AutoConnect/index.html

Da les ich mich mal rein...

Hallo,
du kannst eventuell hier was finden
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/generic-class.html
Heinz

Irgendwie komm ich nicht weiter... ;-(

Ich schieb mal noch ne Frage nach:
Ist es möglich, wenn bereits eine Verbindung mit dem Server per WIFI_AP besteht, einen Verbindungsversuch im Modus WIFI_AP_STA zu versuchen, OHNE die aktuelle Verbindung zum Server zu verlieren?

Ich stelle mir folgendes Szenario vor:
Der ESP wird zum ersten mal gestartet und der User hat noch keine Verbindungsdaten zu seinem WLAN-Router hinterlegt. Daher scheitert die erste Verbindung im WIFI_AP_STA Modus und es wird umgeschwenkt auf WIFI_AP.

Der User verbindet sich nun mit dem ESP und gelangt über 192.168.4.1 ins User-Interface.
Dort gibt es zwei Eingabefelder, in die er die SSID und das Passwort eingeben kann.
Nun verschreibt er sich avber und klickt dann auf einen "Verbinden" Button.

Jetzt wird versucht eine Verbindung mit dem Router (also WIFI_AP_STA) aufzubauen.
Diese scheitert nun wieder, aber die bestehende Verbindung bleibt bestehen, d.h. der Server läuft im WIFI_AP weiter.

Geht sowas?

Denn wenn ich es auf diese Art mache, wird ja die bestehende Verbindung komplett getrennt und der User verliert den Zugriff aufs Userinterface...

Ich hoffe, ihr wisst was ich meine....

Nach meinem Kenntnisstand: Nein.

Gruß Tommy

Dann wird wieder in den AP-Modus gewechselt. Wo ist das Problem? Ist bei Fips als Beispiel drin.

Gruß Tommy

Hi,

das Beispiel von Fips hab ich schon begriffen, aber leider geht eben die Verbindung zum Server verloren. Der AP wird neu aufgebaut (obwohl er das vorher ja schon war) und man muss den ESP im WLAN wieder neu anwählen und sich neu mit dem AP verbinden.

Wäre halt schön gewesen, wenn die bereits bestehende Verbindung aufrechterhalten wird, d.h. der Benutzer NIE die Verbindung zum Server verliert.

Das passt aber nicht zu Deinem skizziertem Anwendungsfall. Wenn der AP nur zum Eintragen der WLAN-Daten dienen soll, brauchst Du dessen Verbindung nicht zu halten.

Oder beschreibe mal ordentlich, was Du eigentlich erreichen willst.

Gruß Tommy

OK:
Grundregel soll sein, dass der ESP

  • IMMER im AP erreichbar ist und
  • falls möglich auch zusätzlich noch im STA-Modus.

Damit ist sichergestellt, dass der Bediener immer einen Zugriff auf die App hat, auch wenn sein Router mal ausgeschaltet wird (und dann später wieder eingeschaltet).

Und wenn der Router mal ausgeschaltet uns später wieder eingeschaltet wird, soll der ESP sich dann automatisch wieder ZUSÄTZLICH zum AP auch im STA-Modus verbinden.
Also summa summarum: Ziel soll immer WIFI_AP_STA sein und nur im Notfall nur WIFI_AP.

Der Plan wäre:

  1. Der ESP wird zum allerersten Mal eingeschaltet.
  2. Der ESP schaltet in den Modus WIFI_AP_STA und versucht eine Verbindung mit dem Router aufzubauen. Da der User aber noch gar keine Zugangsdaten über das Userinterface eingegeben hat, weil er sich ja zum ersten Mal verbindet, scheitert WiFi.begin() natürlich direkt.
  3. Der ESP wechselt nun in den WIFI_AP Modus und baut den AP auf.
  4. Der User findet den ESP im WLAN seines Handys und verbindet sich mit dem AP.
  5. Er ruft die App über 192.168.4.1 auf. Dort navigiert er zu einem Untermenü "Zugangsdaten" und findet dort zwei Felder (SSID / Passwort) und einen "Verbinden"-Button
  6. Er gibt seine Zugangsdaten in die Felder ein und drückt auf Verbinden.
  7. Der ESP versucht, sich mit dem Router zu verbinden, sprich von WIFI_AP auf WIFI_AP_STA zu wechseln. Der User wird in der App über den Erfolg oder das Scheitern der Verbindung informiert.
  8. Falls die Verbindung scheitert (weil sich der User z.B. bei seinen Zugangsdaten verschrieben hat) ist das aber kein Problem, weil die unter 3. aufgebaute AP-Verbindung immer noch steht und auch der Server immer noch läuft, d.h. die App noch ganz normal erreichbar ist.
  9. Der User kann, wenn er will, ein anderes Menü in der App ansteuern oder aber direkt die Zugangsdaten korrigieren und nochmal einen Verbindungsversuch starten.

Bis 7. läuft alles super - geschnallt.
Aber sobald in 8. die Verbindung scheitert, wird ja ein Wifi.disconnect() ausgeführt und dann im Modus WIFI_AP neu gestartet. In dem Moment reißt kurz die Verbindung zum ESP/Server ab.
Die App ist zwar im Browser noch auf, aber wenn ich irgendwo draufklicke kommt "Seite kann nicht geladen werden".

Man muss dann erst den Browser schließen und wieder bei 4. starten.

Und nun ist die Frage, ob ich einen Denkfehler habe, oder ob mein Vorhaben so gar nicht umsetzbar ist.

Schau Dir mal dieses Tutorial
an. Das kommt ohne AP_STA aus und evtl. bringt es das, was Du suchst (alles lesen).
Ich habe es nicht getestet, das musst Du selbst austesten.

Gruß Tommy

1 Like

Leider hat das Tutorial auch nicht die Lösung gebracht (ich habs tatsächlich ganz gelesen) ;-(

Der finale Code ist der hier

#include <ESP8266WiFi.h>
 
 
// Set WiFi credentials
#define WIFI_SSID "YOUR WIFI NETWORK SSID"
#define WIFI_PASS "YOUR WIFI PASSWORD"
 
// Set AP credentials
#define AP_SSID "ESP8266"
#define AP_PASS "magicword"
 
void setup()
{
  // Setup serial port
  Serial.begin(115200);
  Serial.println();
 
  // Begin Access Point
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAP(AP_SSID, AP_PASS);
 
  // Begin WiFi
  WiFi.begin(WIFI_SSID, WIFI_PASS);
 
  // Connecting to WiFi...
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }
 
  // Connected to WiFi
  Serial.println();
  Serial.println("Connected!");
  Serial.print("IP address for network ");
  Serial.print(WIFI_SSID);
  Serial.print(" : ");
  Serial.println(WiFi.localIP());
  Serial.print("IP address for network ");
  Serial.print(AP_SSID);
  Serial.print(" : ");
  Serial.print(WiFi.softAPIP());
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
}

Und der unterscheidet sich ja nicht von dem Sketch, den ich bereits hatte.
Er baut einen AP auf, dann Verbindung mit Station und das wars.
Im Tutorial wird nicht drauf eingegangen, was passiert, wenn die Zugangsdaten nicht stimmen.
Im Gegenteil: an dieser Stelle hier:

 while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }

Geht er ja nicht weiter, ehe er die Verbindung hat.
D.h. wenn SSID und Passwort nicht stimmen, bricht er nicht ab und switched auch nicht um auf AP usw.

Danach kommen ja dann nur noch Tipps, wie man einen anderen AP Kanal wählt oder die Maximale Anzahl an Verbindungen begrenzt oder eine IP-Adresse statisch macht.

Also falls noch jemand hier ne Idee hat, freu ich mich.
Ansonsten greift das Motto "Man kann nicht alles haben :wink:

Dachte ich auch erst, bis mir aufgefallen ist, daß WiFi.mode() fehlt :thinking:

Wieso? In meinem Beispiel ist Wifi.mode() drin und in seinem Beispiel auch.

Hier wird auch ganz gut beschrieben, was mein Problem ist:

https://www.esp32.com/viewtopic.php?t=1192

Der Beitrag bezieht sich zwar auf einen ESP 32 aber hat die gleiche Aussage.

Anscheinend kann der ESP keine AP Verbindung halten während er versucht einen WIFI_AP_STA neu aufzubauen.
Es kommt zu einer kurzen Unterbrechung und damit verliert der User die Verbindung zur App und muss sich wieder neu verbinden

Stimmt, habe mich vertan. Dann verstehe ich auch nicht, welche neue Erkenntnis der Link beinhalten soll.