ESP8266 - Als AP OK, als STA kein connect

Vor geraumer Zeit hatte ich mal mit einem ESP8266 (NodeMCU mit ESP-12E) erfolgreich getestet.
Nun hab ich das Teil wieder aus der Schublade geholt und wollte was neues probieren .... Es zeigte gestern sehr eigenartiges Verhalten:

Als AP funktioniert alles tadellos. Kann mich anmelden, Daten empfangen und senden.
Als STA (also Client) weigert sich das Teil vehemennt, sich mit meinem Router (FB 7490) zu verbinden !
Das hat aber definitiv schon mal funktioniert.

Ich habe dazu dutzende von Standard-Sketchen (sind ja alle irgendwie gleich) getestet.
Logo auch im Netz rumgesucht und etliche "Issues" mit dem gleichem Prob dazu gefunden. Vermeintlich gab es Lösungen und Tricks - die hab ich alle probiert, auch EraseFlash .... nix hilft hier.
Anstatt der aktullen ESP-Core 2.5.0 auch mal 2.2 und 2.3 getestet - NO GO.

An SSID und PW liegt es sicher nicht, hab ich mehrfach aus der FB kopiert. Auch hab ich einen Gast-Zugang mit und ohne PW sowie einen Hotspot (ist immer ohne PW) auf der FB probiert - kein connect.

WiFi.scanNetworks() funzt einwandfrei und listet alles auf.
Der Status nach WiFi.begin() ist immer 6/WL_DISCONNECTED.

Hat hier vielleicht jemand noch ne Idee ?

Hallo,

das Problem hatte ich so noch nicht. Es gab mal einen Bug von dem ich nicht weiß, ob er behoben wurde:
der ESP-Core hat nur entweder leere Passworte oder Passwaorte mit mindestens 8 Zeichen richtig verabrbeitet, mit ein paar Sonderzeichen gab es auch mal Probleme. Das kann aber alles schon behoben sein...

Ansonsten: nimm den Core 2.4.2, der 2.5.0 hat noch einige Probleme.

Gruß aus Berlin
Michael

Das mit den min. 8 Zeichen kannte ich. Ich hab's ja auch mit dem FB-Gastzugang als Hotspot probiert.
WiFi.begin("Hotspot", "") kommt auch immer mit ner 6 zurück.
Dito als Gast-Zugang mit WiFi.begin("GAST", "12345678").

Schaue ich in der FB dann unter 'WLAN/Funlnetz-> Erfolglose Anmeldeversuche zeigen' sehe nach jedem Versuch immer die MAC des ESP - egal ob als Gast, Hotspot oder der normalen SSID.

Ich kapier das Problem einfach nicht - zumal ich 100%ig sicher bin, das vor ca, 1 1/2 Jahren schon ausführlich als Client mit TCP und UDP probiert habe.

Der ESP kann ja wohl nicht kaputt sein, denn er tut's ja als AP - sendet und empfängt.
Liegt's an der Fritz-Box ? Mir fehlt der Glaube ...

EDIT:
Auch mit 2.4.2 das geiche Drama.
Hier mal die Ausgabe meines Test-Codes mit Debug-Info:

ESP8266 Demo (von mir)
2_4_2 (von mir)
scandone
del if0
usl
mode : null
mode : sta(bc:dd:c2:fe:2f:cc)
add if0
WiFi already connected ?: NO (von mir)
WiFi begin: 6 (von mir)
..scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 0 (12)
.reconnect
...scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 0 (12)
.reconnect
..timeout (von mir)
WiFi now connected ?: NO (von mir)

(von mir)
MAC Addr: BC:DD:C2:FE:2F:CC
IP Addr: 0.0.0.0
Subnet: 0.0.0.0
Gateway: 0.0.0.0
DNS Addr: 0.0.0.0
Channel: 13
Hostname: ESP_FE2FCC
Status: 6

(alles Debug)
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 0 (12)
reconnect
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 0 (12)
reconnect
scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 0 (12)
reconnect

..... und diese scandon-reconnect-Schleife läuft ewig so weiter.

Hallo,

TERWI:
Der ESP kann ja wohl nicht kaputt sein, denn er tut's ja als AP - sendet und empfängt.
Liegt's an der Fritz-Box ? Mir fehlt der Glaube ...

Fritzbox habe ich hier keine. Mit Deinen Testausgaben ist ohne den zugehörigen Sketch ja nicht viel anzufangen...
Stell mal den Sketch hier rein, dann flashe ich das mal auf einen ESP.

Gruß aus Berlin
Michael

Hier mal was zum ausprobieren.

// https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html#soft-access-point
// https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/server-examples.html
// https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-examples.html
// https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-class.html

#include <ESP8266WiFi.h>

int status = 0;
const char* ssid1 = "xxxxx";
const char* pw1   = "xxxxx"; 
const char* ssid2 = "GAST";
const char* pw2   = "12345678";  // set to "" for open access point w/o passwortd
const char* ssid3 = "Hotspot";
const char* pw3   = "";  // set to "" for open access point w/o passwortd

void setup() 
{
  Serial.begin(115200);
//  Serial.setDebugOutput(true);   // uncomment this for debug-info from core
  Serial.print("ESP8266 Core: ");
  Serial.println(ESP.getCoreVersion());

  Serial.println("");
  Serial.println("WIFI-DIAG 1:");
  WiFi.printDiag(Serial);
  Serial.println("");

  Serial.print("Scan available AP's: ");
  int n = WiFi.scanNetworks();
  Serial.print(n);
  Serial.println(" network(s) found");
  for (int i = 0; i < n; i++)
  {
    Serial.println(WiFi.SSID(i));
  }
  Serial.println();

  WiFi.mode(WIFI_OFF);
  WiFi.setAutoConnect(false);
  WiFi.mode(WIFI_STA);
  IPAddress ip(192, 168, 178, 41);
  IPAddress gateway(192, 168, 178, 1);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, 178, 1);
//  WiFi.config(ip, gateway, subnet, dns);
//  WiFi.persistent(false);
//  WiFi.disconnect(true);
//  delay(100);

  Serial.print("WiFi already connected ?: ");
  if (WiFi.status() != WL_CONNECTED)
    Serial.println("NO");
  else
    Serial.println("YES");
    
  WiFi.setOutputPower(0);
  WiFi.mode(WIFI_STA);
  Serial.print("... try connecting to: ");
  Serial.println(ssid3);
  if (WiFi.status() != WL_CONNECTED) 
  {  // FIX FOR USING 2.3.0 CORE (only .begin if not connected)
    Serial.print("WiFi begin: ");
    status = WiFi.begin(ssid3, pw3);       // connect to the network
  }    
  Serial.println(status);

/*
  status = WiFi.waitForConnectResult();  // default is 60000ms ???
  if (status != WL_CONNECTED) 
  {
    Serial.println("Connection Failed");
//    while (true) {}   // this reset's the ESP !!!
  }
*/

  int timeout = 20000; // => 20 Sekunden
  bool wait = true;
  long connectStart = millis();
  long connTest = millis();
  Serial.print("Wait for connection: ");
  while ( wait )
  {
    if( millis() > connTest + 1000 ) {
      connTest = millis();
      wait = WiFi.status() != WL_CONNECTED;
      Serial.print(".");
    }
    if( millis() > connectStart + timeout ) {
      wait = false;
      Serial.println("timeout");
    }
    delay(100);
  }
  Serial.print("WiFi now connected ?: ");
  if (WiFi.status() != WL_CONNECTED)
    Serial.println("NO");
  else
    Serial.println("YES");

  Serial.println("");
  Serial.print("MAC Addr: ");
  Serial.println(WiFi.macAddress());
  Serial.print("IP Addr:  ");
  Serial.println(WiFi.localIP());
  Serial.print("Subnet:   ");
  Serial.println(WiFi.subnetMask());
  Serial.print("Gateway:  ");
  Serial.println(WiFi.gatewayIP());
  Serial.print("DNS Addr: ");
  Serial.println(WiFi.dnsIP());
  Serial.print("Channel:  ");
  Serial.println(WiFi.channel());
  Serial.print("Hostname:  ");
  Serial.println(WiFi.hostname());
  Serial.print("Status: ");
  Serial.println(WiFi.status());

  Serial.println("");
  Serial.println("WIFI-DIAG 2:");
  WiFi.printDiag(Serial);
  Serial.println("");
}

void loop() 
{ 
}

Mein Ergebniss sieht so aus:

ESP8266 Core: 2_4_2

WIFI-DIAG 1:
Mode: STA
PHY mode: B
Channel: 1
AP id: 0
Status: 1
Auto connect: 1
SSID (7): Hotspot
Passphrase (0): 
BSSID set: 0

Scan available AP's: 7 network(s) found
FRITZ!Box WLAN 3370
Telekom_FON
WLAN-9XXTF6
Vodafone Hotspot
twn@JSS#1
Hotspot
twn@JSS#1

WiFi already connected ?: NO
... try connecting to: Hotspot
WiFi begin: 6
Wait for connection: ..................timeout
WiFi now connected ?: NO

MAC Addr: BC:DD:C2:FE:2F:CC
IP Addr:  0.0.0.0
Subnet:   0.0.0.0
Gateway:  0.0.0.0
DNS Addr: 0.0.0.0
Channel:  11
Hostname:  ESP_FE2FCC
Status: 6

WIFI-DIAG 2:
Mode: STA
PHY mode: B
Channel: 11
AP id: 0
Status: 1
Auto connect: 1
SSID (7): Hotspot
Passphrase (0): 
BSSID set: 0

Nachdem ich dann mal im Keller war zum weinen, kam mir eine Idee ....
JETZT FUNZT ES (WIEDER) !
Hier mal der Rest vom letzten LOG:

...
WiFi already connected ?: NO
... try connecting to: Hotspot
WiFi begin: 6
Wait for connection: ...WiFi now connected ?: YES

MAC Addr: BC:DD:C2:FE:2F:CC
IP Addr:  192.168.179.21
Subnet:   255.255.255.0
Gateway:  192.168.179.1
DNS Addr: 192.168.179.1
Channel:  10
Hostname:  ESP_FE2FCC
Status: 3

WIFI-DIAG 2:
Mode: STA
PHY mode: N
Channel: 10
AP id: 0
Status: 5
Auto connect: 1
SSID (7): Hotspot
Passphrase (0): 
BSSID set: 0

Na .... wer rät was es war ? Im Vergleich zum LOG vom vorherigen Post kann man es sehen.
Ich geh jetzt erst mal in den Garten ne Runde ablachen.
Erklärung kommt danach. Denke mal, das wird bei denen, die ähnliche Probs hatten auch zur Lösung führen und nicht diese "Tricky's" aus den allerlei Posting im WWW.

das Problem sitzt meist vor dem PC ...

... superschlaue Antwort - in diesem Fall definitiv nicht.
Die Ursache (nicht ein wirkliches Problem) liegt m.E.n. hier in diesem Fall bei der Fa. AVM. Unbeabsichtigterweise ...
Schon jemand auf die Lösung gekommen ?

Die Lösung:

Der Zauberbefehl lautet: WiFi.setPhyMode(WIFI_PHY_MODE_11N); (oder _11G)

Wie im ersten LOG zu sehen ist, hatte sich der ESP auf "PHY: B" also 802.11b eingestellt.
Warum & Woher ? keine Ahnung ...

Normalerweise sollte das eine 7490 aber können - hat sie ja auch mal. Warum nun nicht mehr ?
Ich denke, es lag an dem OS-Versions-Update von 6.x auf 7.x (August 2018 ?) mit geänderten Voreinstellungen.
Bei WLAN/Funkkanal -> Weiter Einstellungen ist/war hier für "WLAN-Standard 2,4-GHz: 802.11n+g" eingestellt.
Man kann auch auf 802.11n+g+b umstellen - das war denke ich früher mal Vorgabe.

Hier also kein Progger-Fehler, sondern eher etwas nach "never change a running system" wegen OS-Update der Box..
Der Einfachheit halber aber nun eben den ESP umgestellt. "b" ist eh der langsame Modus.
Er scheint sich das aber auf jeden Fall irgendwo zu merken - prüft man das wie hier im Sketch vor dem WiFi.setPhyMode() + WiFi.begin(), dann steht da immer die letzte Einstellung. Auch wenn der ESP stromlos war.

Na toll...

Kopf -> Tisch
Kopf -> Tisch
Kopf -> Tisch

Habe gerade bei mir auf der FritzBox 7490 nachgeschaut. Genau das gleiche. Gemein ist vor allem das bei mir die Einstellung auf "Funkkanal-Einstellungen automatisch setzen (empfohlen)" steht und somit die Einstellungen für WLAN-Standard nicht angezeigt werden.

Jetzt weiß ich auch warum mein alter Sketch nicht mehr funktioniert hat. Dachte schon da hätte sich was in der IDE geändert, weil ein neuer Beispielsketch dann durch Zufall funktioniert hat...

Gleiches Problem nach Update:

Danke TERWI!

Gruß, Jürgen

Hallo,

TERWI:
Die Lösung:

Der Zauberbefehl lautet: WiFi.setPhyMode(WIFI_PHY_MODE_11N); (oder _11G)

Wie im ersten LOG zu sehen ist, hatte sich der ESP auf "PHY: B" also 802.11b eingestellt.
Warum & Woher ? keine Ahnung ...
...
Der Einfachheit halber aber nun eben den ESP umgestellt. "b" ist eh der langsame Modus.
Er scheint sich das aber auf jeden Fall irgendwo zu merken - prüft man das wie hier im Sketch vor dem WiFi.setPhyMode() + WiFi.begin(), dann steht da immer die letzte Einstellung. Auch wenn der ESP stromlos war.

Danke für die Hinweise. Ja, der ESP merkt sich die WLAN-Sachen, kann man ihm abgewöhnen, müßte ich jetzt nachkramen...
Gerade mal nachgeschaut: mein D-Link steht auf b/g/n, dem kann ich aber auch nur n sagen, dann hätte ich das Problem vielleicht auch, also gut zu wissen.

Gruß aus Berlin
Michael

Hier die Infos zum Merken der WiFi-Einstellungen beim EP8266.

Gruß Tommy

Jau, Danke Tommy - mit
WiFi.persistent(false);
scheint der ESP sich das nicht mehr zu merken und löscht auch wohl bestehende Werte.
Mit Flash löschen waren u.a. SSID und PW (tstststsssss.....) noch vorhanden.
Zur Sicherheit hab ich noch
WiFi.setAutoConnect(false);
gesetzt.
Ich bastel jetzt noch ein wenig an meiner kleinen STA_connect-Routine und poste die hier - vielleicht kann das ja sonst noch jemnd brauchen.

PS - noch ein Prob taucht auf:
.... es gibt immer noch ein Connect-Prob - das hatte ich aber derzeit auch schon.
Wahrscheinlicher Grund:
Ich habe auf meiner Fritz neben 2.4 auch 5 GHz eingeschaltet.
Zum einfachen verbinden für Handy's und Schleppi's haben beide Funknetze die gleiche SSID.
(Dito am Repeater in der anderen Hausecke)

Schalte ich die 5GHz aus, klappt es i.d.R. immer mit dem Connect.
Sind 5GHz eingeschaltet, klappt es häufig, aber eben nicht immer.

Wenn ich mir das Ergebnis von WiFi.scanNetworks() steht ja auch 2x meine SSID drin.
Ich vermute mal, der ESP nimmt sich das erste passende Resultat aus der Liste und versuchts dann mal.
Nur welche SSID ist von welchem Netz ? Unterscheiden klnnte man das anhand der verschedenen MAC's von der Box - tut der ESP das auch ???