New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wifi.status #119

Closed
kdschlosser opened this Issue Apr 26, 2015 · 29 comments

Comments

Projects
None yet
@kdschlosser

kdschlosser commented Apr 26, 2015

not sure if this is a problem per say but the use of

WiFi.status() != WL_CONNECTED

is not a check to see if you are connected to the Wireless AP

it looks to see if it has an IP address

they are 2 completely different things.

maybe i am just misinterpreting the WL_CONNECTED but i would imagine that means Wireless LAN Connection

I have a server that is DHCP that server can go down and and not affect the AP connection. granted it can't talk to the Network. but I am trying to make a script that if the connection actually goes down it will reconnect. and if the server goes down it will just keep on broadcasting DHCP requests until it gets an IP

not actually have to reset the connection.

script is for redundancy. it's supposed to fire up other backup equipment if there is a problem. and then send me an e-mail and text message letting me know something's broke and what it is that's broken. I don't know if this is incorrect coding on my part or it's the coding in the IDE and how it deals with checking a connection. but an IP address is not a wifi connection.

if there is an alternate way someone please let me know. I have gone digging through the wificlient library and i am not seeming to be able to find what i am looking for.

I don't want this firing up equipment that doesn't need to be and not telling me what is exactly wrong.

thanks again for the assistance. and i do appoligize if this is my dumbass not reading the code correctly. lol

Want to back this issue? Post a bounty on it! We accept bounties via Bountysource.

@ajitam

This comment has been minimized.

Show comment
Hide comment
@ajitam

ajitam Jun 4, 2015

hi kdschlosser I'm interested in the same thing. Any progress?

ajitam commented Jun 4, 2015

hi kdschlosser I'm interested in the same thing. Any progress?

@Links2004

This comment has been minimized.

Show comment
Hide comment
@Links2004

Links2004 Jun 4, 2015

Collaborator

WL_CONNECTED is only returned if the wifi interface has connected an has IP address
in DHCP mode this means you got the IP form the DHCP server.
in Static mode you have set the IP yourself.

github has a nice search:

Collaborator

Links2004 commented Jun 4, 2015

WL_CONNECTED is only returned if the wifi interface has connected an has IP address
in DHCP mode this means you got the IP form the DHCP server.
in Static mode you have set the IP yourself.

github has a nice search:

@kdschlosser

This comment has been minimized.

Show comment
Hide comment
@kdschlosser

kdschlosser Jun 5, 2015

that didn't exactly answer my question or statement. the problem is the ESP reboots because of not having a "connection" which is determined by the IP and an IP address is not a wifi connection, so there is no cause for the module to keep on boot cycling, there are other functions that the ESP is able to perform without actually having an IP Address. is there a way to have the ESP operate without an IP address? and to send DHCP requests until it receives one?
here is an idea, how about it tries to get a dynamic one, and uses a static one if a dynamic server is unavailable kinda like windows APIPA

kdschlosser commented Jun 5, 2015

that didn't exactly answer my question or statement. the problem is the ESP reboots because of not having a "connection" which is determined by the IP and an IP address is not a wifi connection, so there is no cause for the module to keep on boot cycling, there are other functions that the ESP is able to perform without actually having an IP Address. is there a way to have the ESP operate without an IP address? and to send DHCP requests until it receives one?
here is an idea, how about it tries to get a dynamic one, and uses a static one if a dynamic server is unavailable kinda like windows APIPA

@Links2004

This comment has been minimized.

Show comment
Hide comment
@Links2004

Links2004 Jun 5, 2015

Collaborator

you can move the WiFi waiting to the loop like this:

void setup() {
    Serial1.begin(921600);
    delay(10);

    // We start by connecting to a WiFi network
    Serial1.println();
    Serial1.println();
    Serial1.print("Connecting to ");
    Serial1.println(ssid);

    WiFi.begin(ssid, password);
}

void loop() {
    if(WiFi.status() != WL_CONNECTED) {
        Serial1.println("[loop] no wifi");
        delay(500);
    } else {
        Serial1.println("[loop] WiFi connected");
        Serial1.print("[loop] IP address: ");
        Serial1.println(WiFi.localIP());
        delay(500);
    }
}
Connecting to Testwifi1
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] WiFi connected 
[loop] IP address:  11.11.1.2 
[loop] WiFi connected 
[loop] IP address:  11.11.1.2 

but mixed mode (dhcp / static) is not possible.
the SDK from espressif only give the status of the Wifi like this:

enum {
    STATION_IDLE = 0,
    STATION_CONNECTING,
    STATION_WRONG_PASSWORD,
    STATION_NO_AP_FOUND,
    STATION_CONNECT_FAIL,
    STATION_GOT_IP
};

so you have no change to see if you are connected but not get an answer from the DHCP.
you can only try to setting it static and then call wifi_station_dhcpc_start();

what you exactly mean by "reboots" normaly the ESP try to get an DHCP IP endless.

Collaborator

Links2004 commented Jun 5, 2015

you can move the WiFi waiting to the loop like this:

void setup() {
    Serial1.begin(921600);
    delay(10);

    // We start by connecting to a WiFi network
    Serial1.println();
    Serial1.println();
    Serial1.print("Connecting to ");
    Serial1.println(ssid);

    WiFi.begin(ssid, password);
}

void loop() {
    if(WiFi.status() != WL_CONNECTED) {
        Serial1.println("[loop] no wifi");
        delay(500);
    } else {
        Serial1.println("[loop] WiFi connected");
        Serial1.print("[loop] IP address: ");
        Serial1.println(WiFi.localIP());
        delay(500);
    }
}
Connecting to Testwifi1
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] no wifi 
[loop] WiFi connected 
[loop] IP address:  11.11.1.2 
[loop] WiFi connected 
[loop] IP address:  11.11.1.2 

but mixed mode (dhcp / static) is not possible.
the SDK from espressif only give the status of the Wifi like this:

enum {
    STATION_IDLE = 0,
    STATION_CONNECTING,
    STATION_WRONG_PASSWORD,
    STATION_NO_AP_FOUND,
    STATION_CONNECT_FAIL,
    STATION_GOT_IP
};

so you have no change to see if you are connected but not get an answer from the DHCP.
you can only try to setting it static and then call wifi_station_dhcpc_start();

what you exactly mean by "reboots" normaly the ESP try to get an DHCP IP endless.

@kdschlosser

This comment has been minimized.

Show comment
Hide comment
@kdschlosser

kdschlosser Jun 5, 2015

it restarts, reboots like a computer, any time that W_CONNECTED returns false in any kind of a loop with it, sees it as an infinite loop so the ESP restarts i think. have put it in it's own function outside of loop and setup i have had it loop inside setup, have had it loop inside loop and use loop for the loop, it always resets the ESP. no matter what i do. it would have been nice to use it to jump to a different wifi netowrk (don't even know if that is possible) but that was the hope for it.

kdschlosser commented Jun 5, 2015

it restarts, reboots like a computer, any time that W_CONNECTED returns false in any kind of a loop with it, sees it as an infinite loop so the ESP restarts i think. have put it in it's own function outside of loop and setup i have had it loop inside setup, have had it loop inside loop and use loop for the loop, it always resets the ESP. no matter what i do. it would have been nice to use it to jump to a different wifi netowrk (don't even know if that is possible) but that was the hope for it.

@Links2004

This comment has been minimized.

Show comment
Hide comment
@Links2004

Links2004 Jun 5, 2015

Collaborator

if you need WiFi connection management for multiple APs you can use WiFiMulti
https://github.com/esp8266/Arduino/blob/esp8266-sdk-1.0/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino

a "loop" in setup is possible you only need to add a delay(0);
in there or the WDT will reset your ESP.

Serial.setDebugOutput(true);

gives you more info about reboots/crash.

Collaborator

Links2004 commented Jun 5, 2015

if you need WiFi connection management for multiple APs you can use WiFiMulti
https://github.com/esp8266/Arduino/blob/esp8266-sdk-1.0/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/examples/WiFiMulti/WiFiMulti.ino

a "loop" in setup is possible you only need to add a delay(0);
in there or the WDT will reset your ESP.

Serial.setDebugOutput(true);

gives you more info about reboots/crash.

@tecan

This comment has been minimized.

Show comment
Hide comment
@tecan

tecan Jun 14, 2015

the access point example in the arduino IDE should be fixed / updated. when connected all it does is spit out periods over console like nothings connected even when it is connected.

tecan commented Jun 14, 2015

the access point example in the arduino IDE should be fixed / updated. when connected all it does is spit out periods over console like nothings connected even when it is connected.

@wizard23

This comment has been minimized.

Show comment
Hide comment
@wizard23

wizard23 Jun 16, 2015

I have the same problem as @tecan. The AP example only spits out dots....
The AP exists and I can connect to it with my laptop. But WiFi.status() never gets set to WL_CONNECTED. It has the value 6 (WL_DISCONNECTED) for ever.

WiFi.localIP() returns 0.0.0.0 so I cant start a webserver.

wizard23 commented Jun 16, 2015

I have the same problem as @tecan. The AP example only spits out dots....
The AP exists and I can connect to it with my laptop. But WiFi.status() never gets set to WL_CONNECTED. It has the value 6 (WL_DISCONNECTED) for ever.

WiFi.localIP() returns 0.0.0.0 so I cant start a webserver.

@miky2k

This comment has been minimized.

Show comment
Hide comment
@miky2k

miky2k Jul 6, 2015

I'm in the same situation of @wizard23 some help ?

If i connect , ping to 192.168.4.1 work but only dots on serial.

miky2k commented Jul 6, 2015

I'm in the same situation of @wizard23 some help ?

If i connect , ping to 192.168.4.1 work but only dots on serial.

@igrr

This comment has been minimized.

Show comment
Hide comment
@igrr

igrr Jul 6, 2015

Member

@far5893 @wizard23 @tecan
Please remove

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

from your sketch when running in SoftAP mode.

edit: @wizard23 use WiFi.softAPIP() if you need to get IP address in SoftAP mode.

Member

igrr commented Jul 6, 2015

@far5893 @wizard23 @tecan
Please remove

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

from your sketch when running in SoftAP mode.

edit: @wizard23 use WiFi.softAPIP() if you need to get IP address in SoftAP mode.

@kapyaar

This comment has been minimized.

Show comment
Hide comment
@kapyaar

kapyaar Nov 11, 2015

Is the softAP resetted after every attempt to connect to a router?

I just happened to find a particular behavior on arduino core.
I start in softAP mode. Then I submit the ssid and password through a web form, via ajax (important because the ajax connection is is also key to my finding).

My code

WiFi.begin(ssid,Wrong_password);
unsigned long startMillis = millis();
unsigned long currentMillis = millis();
while (WiFi.status() != WL_CONNECTED) {
  delay(500);// refer->A
  currentMillis = millis();
  if ((currentMillis - startMillis) > 20000) {
    //return error code for not connecting even after 20 seconds.
    break;            
  }
}

//Handle Successfull connection.
if (WiFi.status() == WL_CONNECTED) {
    // Send valid ip reponse to AJAX call. 
}
else {
  // Send wifi.status() code as response to ajax.
  //WiFi.disconnect();
}
If I submit the ssid and wrong password, after around 6 seconds the ajax connection is aborted. Chrome shows net::ERR_CONNECTION_RESET.

Is there an internal function that resets/ restarts the softAP while waiting to connect to router? I tried the following tests.

  1. An intentional delay of 10 seconds before WiFi.begin. This has no effect on the ajax connection. all is good, connection is open. So it is not the delay itself that is closing the connection.
  2. Tried the ssid and correct password. After successful connection, inserted an intentional delay of 10 seconds before responding to the ajax call. All is good. Connection was not closed during this delay, and browser got the response correctly.
  3. I stopped checking for WiFi.status() at 6 (or less ) seconds, and replied to the ajax call waiting. All is good here.
  4. If I wait for 7 seconds or more, then I can see on chrome console that the ajax connection is disconnected.

And this behaviour is consistent, repeatable.

So, it seems like when pwd is wrong and while trying to connect, somehow the softAP is reset after?

kapyaar commented Nov 11, 2015

Is the softAP resetted after every attempt to connect to a router?

I just happened to find a particular behavior on arduino core.
I start in softAP mode. Then I submit the ssid and password through a web form, via ajax (important because the ajax connection is is also key to my finding).

My code

WiFi.begin(ssid,Wrong_password);
unsigned long startMillis = millis();
unsigned long currentMillis = millis();
while (WiFi.status() != WL_CONNECTED) {
  delay(500);// refer->A
  currentMillis = millis();
  if ((currentMillis - startMillis) > 20000) {
    //return error code for not connecting even after 20 seconds.
    break;            
  }
}

//Handle Successfull connection.
if (WiFi.status() == WL_CONNECTED) {
    // Send valid ip reponse to AJAX call. 
}
else {
  // Send wifi.status() code as response to ajax.
  //WiFi.disconnect();
}
If I submit the ssid and wrong password, after around 6 seconds the ajax connection is aborted. Chrome shows net::ERR_CONNECTION_RESET.

Is there an internal function that resets/ restarts the softAP while waiting to connect to router? I tried the following tests.

  1. An intentional delay of 10 seconds before WiFi.begin. This has no effect on the ajax connection. all is good, connection is open. So it is not the delay itself that is closing the connection.
  2. Tried the ssid and correct password. After successful connection, inserted an intentional delay of 10 seconds before responding to the ajax call. All is good. Connection was not closed during this delay, and browser got the response correctly.
  3. I stopped checking for WiFi.status() at 6 (or less ) seconds, and replied to the ajax call waiting. All is good here.
  4. If I wait for 7 seconds or more, then I can see on chrome console that the ajax connection is disconnected.

And this behaviour is consistent, repeatable.

So, it seems like when pwd is wrong and while trying to connect, somehow the softAP is reset after?

@Links2004

This comment has been minimized.

Show comment
Hide comment
@Links2004

Links2004 Nov 11, 2015

Collaborator

the ESP need to switch to all channels for scanning and if its try to connect to some AP that Wifi channel of the softAP is changed.
the limitation comes from the Hardware, there is only one RF fronted.

try to use a WiFi scanner app or tool and look for your soft AP, then you shut see the channel changes.
on every change you will lose the connection to the softAP.

Collaborator

Links2004 commented Nov 11, 2015

the ESP need to switch to all channels for scanning and if its try to connect to some AP that Wifi channel of the softAP is changed.
the limitation comes from the Hardware, there is only one RF fronted.

try to use a WiFi scanner app or tool and look for your soft AP, then you shut see the channel changes.
on every change you will lose the connection to the softAP.

@rogerclarkmelbourne

This comment has been minimized.

Show comment
Hide comment
@rogerclarkmelbourne

rogerclarkmelbourne Nov 17, 2015

@Links2004

I don't think your explanation of this is correct.

I'm trying to do the same thing as @avarachanvc is doing, in fact my code looks very similar.

Anyway. I ran "Acrylic Wifi" which is a wifi scanner for Windows and the ESP8266 always seems to be on Channel 1, where as my target network is on channel 9.

But..., I can get an ajax response from the ESP8266 back to my PC (which is connected to the ESP8266 as an AP).

This means that the ESP8266 is operating on both channel 1 and also channel 9.

I think the issue is that @avarachanvc is calling things like wifi.disconnect() - although they are commented out in the code that is posted.

I think calling WiFi.disconnect() or WiFi.mode(WIFI_STA); at any time near where you send back the response to the ajax, is seriously messing things up.

I suspect the only way to be able to use WiFi.disconnect() is after a time delay, but this would need to be done on a timer callback I think rather than a delay, as delays are not good in this sort of system, as most things are asynchronous.

Although I wrote my code the same way, I also suspect that doing this

    while (WiFi.status() != WL_CONNECTED && millis()<timeOut) 
    {
      delay(500);
      DBG_OUTPUT_PORT.print(".");
    }

is not a good idea either, I've noticed that Windows sporadically sends requests for a file named ncsi.txt - which from what I've read is a file that sits on a windows server and Microsoft use as a flag to indicate if you are really connected to the internet or not.
Annoyingly windows keeps requesting this file quite often, including when the ESP8266 is trying to connect to another AP.

I've not quite worked out what's going on (and I still may need to use WiFi.disconnect(), but I find if I deliberately send a wrong password. Then even if I resent the ajax request a while later, with the correct password, that the ESP8266 fails to connect to the AP.

Anyway, I think there is more to this than something to do with the RF section of the chip

Edit..

Just an additional thought, returning a response when connecting to an AP seem unreliable.

I'm going to try sending a response straight await, ie just something like "OK", which I will probably ignore on the requesting page.

But add another ajax based service e.g. /isconnected, and get the ESP8266 to return the result of
WiFi.status() == WL_CONNECTED and what SSID it is connected to or was trying to connect to.

As from what I've observed it was possible for both AP and STA to be operating at the same time (though I could be wrong and its getting to late here to try that idea)

rogerclarkmelbourne commented Nov 17, 2015

@Links2004

I don't think your explanation of this is correct.

I'm trying to do the same thing as @avarachanvc is doing, in fact my code looks very similar.

Anyway. I ran "Acrylic Wifi" which is a wifi scanner for Windows and the ESP8266 always seems to be on Channel 1, where as my target network is on channel 9.

But..., I can get an ajax response from the ESP8266 back to my PC (which is connected to the ESP8266 as an AP).

This means that the ESP8266 is operating on both channel 1 and also channel 9.

I think the issue is that @avarachanvc is calling things like wifi.disconnect() - although they are commented out in the code that is posted.

I think calling WiFi.disconnect() or WiFi.mode(WIFI_STA); at any time near where you send back the response to the ajax, is seriously messing things up.

I suspect the only way to be able to use WiFi.disconnect() is after a time delay, but this would need to be done on a timer callback I think rather than a delay, as delays are not good in this sort of system, as most things are asynchronous.

Although I wrote my code the same way, I also suspect that doing this

    while (WiFi.status() != WL_CONNECTED && millis()<timeOut) 
    {
      delay(500);
      DBG_OUTPUT_PORT.print(".");
    }

is not a good idea either, I've noticed that Windows sporadically sends requests for a file named ncsi.txt - which from what I've read is a file that sits on a windows server and Microsoft use as a flag to indicate if you are really connected to the internet or not.
Annoyingly windows keeps requesting this file quite often, including when the ESP8266 is trying to connect to another AP.

I've not quite worked out what's going on (and I still may need to use WiFi.disconnect(), but I find if I deliberately send a wrong password. Then even if I resent the ajax request a while later, with the correct password, that the ESP8266 fails to connect to the AP.

Anyway, I think there is more to this than something to do with the RF section of the chip

Edit..

Just an additional thought, returning a response when connecting to an AP seem unreliable.

I'm going to try sending a response straight await, ie just something like "OK", which I will probably ignore on the requesting page.

But add another ajax based service e.g. /isconnected, and get the ESP8266 to return the result of
WiFi.status() == WL_CONNECTED and what SSID it is connected to or was trying to connect to.

As from what I've observed it was possible for both AP and STA to be operating at the same time (though I could be wrong and its getting to late here to try that idea)

@Links2004

This comment has been minimized.

Show comment
Hide comment
@Links2004

Links2004 Nov 17, 2015

Collaborator

the softAP is clearly moved to the channel of the AP.

some test code for the channel switching of the ESP:

    // clear all configs
    WiFi.disconnect();
    WiFi.softAPdisconnect();

    // open soft AP
    WiFi.softAP("softAP","123456789000", 1, false);

    // wait some time for making screenshot
      for(uint8_t t = 20; t > 0; t--) {
          Serial1.printf("[SETUP] WAIT %d...\n", t);
          Serial1.flush();
          delay(1000);
      }
   // connect to AP
      WiFi.begin("133744445678785154IoT", "pass here");

before ESP bower on:
image

ESP has opened softAP on channel 1
image

ESP connect to AP on channel 9 (soft AP is moved there too)
image

of course the web server will not response when there is a while (WiFi.status() != WL_CONNECTED).

but the switch of the channel, will lead too an disconnect of the WiFi.
normally the Computer scans again and auto connect to softAP at channel 9.
but the disconnect will end in a close of all tcp connections.

Collaborator

Links2004 commented Nov 17, 2015

the softAP is clearly moved to the channel of the AP.

some test code for the channel switching of the ESP:

    // clear all configs
    WiFi.disconnect();
    WiFi.softAPdisconnect();

    // open soft AP
    WiFi.softAP("softAP","123456789000", 1, false);

    // wait some time for making screenshot
      for(uint8_t t = 20; t > 0; t--) {
          Serial1.printf("[SETUP] WAIT %d...\n", t);
          Serial1.flush();
          delay(1000);
      }
   // connect to AP
      WiFi.begin("133744445678785154IoT", "pass here");

before ESP bower on:
image

ESP has opened softAP on channel 1
image

ESP connect to AP on channel 9 (soft AP is moved there too)
image

of course the web server will not response when there is a while (WiFi.status() != WL_CONNECTED).

but the switch of the channel, will lead too an disconnect of the WiFi.
normally the Computer scans again and auto connect to softAP at channel 9.
but the disconnect will end in a close of all tcp connections.

@rogerclarkmelbourne

This comment has been minimized.

Show comment
Hide comment
@rogerclarkmelbourne

rogerclarkmelbourne Nov 17, 2015

@Links2004

OK.
I think the Wndows 7 TCP stack must somehow be able to cope with the wifi switching channels, as occasionally, I get a perfectly valid response from the ajax request.
However this only happens on random occasions.

As this is random, I don't know if other OSs do the same.

Also, I do occasionally get disconnection errors from the ajax request.

I wonder if there is a workaround for this at all.
e.g on the ajaz request to connect to the AP, change the config of the Soft AP to change channel to the channel of the target AP.

Wait a few secs for the client OS to notice the Soft AP has moved

Then send an ajax request from the client to tell the ESP to connect to the AP ( which will now be on the same channel as the Soft AP)

However, It looks like its highly dependent on which OS is connecting to the AP.

rogerclarkmelbourne commented Nov 17, 2015

@Links2004

OK.
I think the Wndows 7 TCP stack must somehow be able to cope with the wifi switching channels, as occasionally, I get a perfectly valid response from the ajax request.
However this only happens on random occasions.

As this is random, I don't know if other OSs do the same.

Also, I do occasionally get disconnection errors from the ajax request.

I wonder if there is a workaround for this at all.
e.g on the ajaz request to connect to the AP, change the config of the Soft AP to change channel to the channel of the target AP.

Wait a few secs for the client OS to notice the Soft AP has moved

Then send an ajax request from the client to tell the ESP to connect to the AP ( which will now be on the same channel as the Soft AP)

However, It looks like its highly dependent on which OS is connecting to the AP.

@Links2004

This comment has been minimized.

Show comment
Hide comment
@Links2004

Links2004 Nov 17, 2015

Collaborator

there is a command wifi_set_channel in the SDK.

image

may it work to move the AP before the connect.
but you need the scan before to know the right one, hope this will not disconnect the client too.

here is an example how to scan for APs in a async way:
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp#L41

image

Collaborator

Links2004 commented Nov 17, 2015

there is a command wifi_set_channel in the SDK.

image

may it work to move the AP before the connect.
but you need the scan before to know the right one, hope this will not disconnect the client too.

here is an example how to scan for APs in a async way:
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.cpp#L41

image

@rogerclarkmelbourne

This comment has been minimized.

Show comment
Hide comment
@rogerclarkmelbourne

rogerclarkmelbourne Nov 17, 2015

Thanks

Actually, for some reason, scanning doesn't seem to drop the soft AP.

I'm using an ajax request to do the scan, just using

WiFi.scanNetworks();

I seem to have a very high success rate with this, and don't seem to have any problems on Windows or iOS with Wifi disconnection of an open ajax request.

Re: wifi_station_disconnect

As I have debug turned on, I noticed that if that the SDK kept trying to reconnect if the password etc was incorrect.

So I had already tried calling Wifi.disconnect() which basically calls, wifi_station_disconnect(), however this didnt seem to help.

I think the main problem is when the client OS connecting to the softAP decides to rescan.

Also part of the problem could be the way that we are detecting connection. i.e it looks like the presumption with WiFi.begin() is that the correct username and password will always be supplied.

I think I will investigate using wifi_station_set_reconnect_policy(false) to see if this improves things

Edit.

Using wifi_station_set_reconnect_policy(false) but this does not stop the random disconnection issue :-(

rogerclarkmelbourne commented Nov 17, 2015

Thanks

Actually, for some reason, scanning doesn't seem to drop the soft AP.

I'm using an ajax request to do the scan, just using

WiFi.scanNetworks();

I seem to have a very high success rate with this, and don't seem to have any problems on Windows or iOS with Wifi disconnection of an open ajax request.

Re: wifi_station_disconnect

As I have debug turned on, I noticed that if that the SDK kept trying to reconnect if the password etc was incorrect.

So I had already tried calling Wifi.disconnect() which basically calls, wifi_station_disconnect(), however this didnt seem to help.

I think the main problem is when the client OS connecting to the softAP decides to rescan.

Also part of the problem could be the way that we are detecting connection. i.e it looks like the presumption with WiFi.begin() is that the correct username and password will always be supplied.

I think I will investigate using wifi_station_set_reconnect_policy(false) to see if this improves things

Edit.

Using wifi_station_set_reconnect_policy(false) but this does not stop the random disconnection issue :-(

@Humancell

This comment has been minimized.

Show comment
Hide comment
@Humancell

Humancell Jan 4, 2016

I'm working on some code to detect different Wifi failures, and am trying to understand the best way to do this. From reading this thread, it seems that WiFi.status() == WL_CONNECTED will tell me "if I have an IP Address" ... but will that change if - for example - I turn off the AP? Or if I move out of range of the AP?

I'll do more testing myself, but am very curious what the "recommended" way is to handle Wifi failures and re-connection attempts?

Thanks!

Humancell commented Jan 4, 2016

I'm working on some code to detect different Wifi failures, and am trying to understand the best way to do this. From reading this thread, it seems that WiFi.status() == WL_CONNECTED will tell me "if I have an IP Address" ... but will that change if - for example - I turn off the AP? Or if I move out of range of the AP?

I'll do more testing myself, but am very curious what the "recommended" way is to handle Wifi failures and re-connection attempts?

Thanks!

@Humancell

This comment has been minimized.

Show comment
Hide comment
@Humancell

Humancell Jan 4, 2016

Nice! Thank you for the references!

Just as an update of my own testing ...

  1. If I turn off my AP after the ESP is connected, and I poll the WiFi.status(), it returns a WL_DISCONNECTED (6) most of the time, and WL_NO_SSID_AVAIL (1) sometimes ... I was polling at 500ms. It just bounces between these two.
  2. If I turn the AP back on, the ESP auto-reconnects! I didn't realize it would do this without code ... nice feature!

Now I'll add these events into my code ... thanks again!

Humancell commented Jan 4, 2016

Nice! Thank you for the references!

Just as an update of my own testing ...

  1. If I turn off my AP after the ESP is connected, and I poll the WiFi.status(), it returns a WL_DISCONNECTED (6) most of the time, and WL_NO_SSID_AVAIL (1) sometimes ... I was polling at 500ms. It just bounces between these two.
  2. If I turn the AP back on, the ESP auto-reconnects! I didn't realize it would do this without code ... nice feature!

Now I'll add these events into my code ... thanks again!

@Humancell

This comment has been minimized.

Show comment
Hide comment
@Humancell

Humancell Jan 4, 2016

@Links2004 is this new event callback in "stable" yet?

Humancell commented Jan 4, 2016

@Links2004 is this new event callback in "stable" yet?

@Links2004

This comment has been minimized.

Show comment
Hide comment
@Links2004

Links2004 Jan 5, 2016

Collaborator

no only straring

Collaborator

Links2004 commented Jan 5, 2016

no only straring

@cyberreefguru

This comment has been minimized.

Show comment
Hide comment
@cyberreefguru

cyberreefguru Mar 5, 2016

I think I have the opposite problem of everyone else. I have not narrowed it down yet, but when the board is powered up, I'm getting a connection status of WL_CONNECTED before I configure the node. Because of that, the software attempts to disconnect first and then segfaults. Some how wifi_station_get_connect_status is returning STATION_GOT_IP before I call begin. Any suggestions?

cyberreefguru commented Mar 5, 2016

I think I have the opposite problem of everyone else. I have not narrowed it down yet, but when the board is powered up, I'm getting a connection status of WL_CONNECTED before I configure the node. Because of that, the software attempts to disconnect first and then segfaults. Some how wifi_station_get_connect_status is returning STATION_GOT_IP before I call begin. Any suggestions?

@maxdd

This comment has been minimized.

Show comment
Hide comment
@maxdd

maxdd Apr 11, 2017

I leave these here since they are really similar problems

#3132
#3128

maxdd commented Apr 11, 2017

I leave these here since they are really similar problems

#3132
#3128

@devyte

This comment has been minimized.

Show comment
Hide comment
@devyte

devyte Oct 20, 2017

Collaborator

No complete sketch, basic info.
I think the original post should be addressed by the current event system plus a bit of support code.
Closing due to age and lack of info.
If you think there is still a problem, please open a new issue, and fill in the requested info.

Collaborator

devyte commented Oct 20, 2017

No complete sketch, basic info.
I think the original post should be addressed by the current event system plus a bit of support code.
Closing due to age and lack of info.
If you think there is still a problem, please open a new issue, and fill in the requested info.

@devyte devyte closed this Oct 20, 2017

@Anatoli113

This comment has been minimized.

Show comment
Hide comment
@Anatoli113

Anatoli113 Nov 29, 2017

Hi,
I want to know that how to detect that station go out of esp8266 softAP range.
I am going to make simple sketch code.
This code is to confirm that the mobile phone certified to esp8266 softAP is outside the wifi range.
In order to do, I used WiFi.softAPgetStationNum().
But once mobile certified to softAP, even though the mobile goes out of wifi range, this function always returns 1.
The esp82266 always has to be softAP.

I hope somebody to help me. Nothing is a correct way to confirm?
Thanks in advance.

Anatoli113 commented Nov 29, 2017

Hi,
I want to know that how to detect that station go out of esp8266 softAP range.
I am going to make simple sketch code.
This code is to confirm that the mobile phone certified to esp8266 softAP is outside the wifi range.
In order to do, I used WiFi.softAPgetStationNum().
But once mobile certified to softAP, even though the mobile goes out of wifi range, this function always returns 1.
The esp82266 always has to be softAP.

I hope somebody to help me. Nothing is a correct way to confirm?
Thanks in advance.

@devyte

This comment has been minimized.

Show comment
Hide comment
@devyte

devyte Nov 29, 2017

Collaborator

@Anatoli113 like I said in the previous comment, look into the wifi event system.

Collaborator

devyte commented Nov 29, 2017

@Anatoli113 like I said in the previous comment, look into the wifi event system.

@alimorawej

This comment has been minimized.

Show comment
Hide comment
@alimorawej

alimorawej Mar 24, 2018

Hi,
I have problem with WiFi.mode(WiFi_AP_STA), i get in WiFi.localIP() returns 0.0.0.0 so I cant start a webserver, but WiFi.softAPIP() are okay.

Connecting to SmartHome2
WiFi connected
IP address: 0.0.0.0
Mode: STA+AP
PHY mode: N
Channel: 1
AP id: 0
Status: 1
Auto connect: 1
SSID (10): SmartHome2
Passphrase (10): 1234567890
BSSID set: 0

Anyone can help?

alimorawej commented Mar 24, 2018

Hi,
I have problem with WiFi.mode(WiFi_AP_STA), i get in WiFi.localIP() returns 0.0.0.0 so I cant start a webserver, but WiFi.softAPIP() are okay.

Connecting to SmartHome2
WiFi connected
IP address: 0.0.0.0
Mode: STA+AP
PHY mode: N
Channel: 1
AP id: 0
Status: 1
Auto connect: 1
SSID (10): SmartHome2
Passphrase (10): 1234567890
BSSID set: 0

Anyone can help?

@barsznica

This comment has been minimized.

Show comment
Hide comment
@barsznica

barsznica Sep 15, 2018

#2593 (comment)

P.S. Well it didn't last overnight, so I'll try the bottom approach.

A workaround is to replace while ( status != WL_CONNECTED) { with while (WiFi.localIP().toString() == "0.0.0.0") {

P.S. I, also, found that in the BasicOTA example, it uses while (WiFi.waitForConnectResult() != WL_CONNECTED).
This works too (for now).

barsznica commented Sep 15, 2018

#2593 (comment)

P.S. Well it didn't last overnight, so I'll try the bottom approach.

A workaround is to replace while ( status != WL_CONNECTED) { with while (WiFi.localIP().toString() == "0.0.0.0") {

P.S. I, also, found that in the BasicOTA example, it uses while (WiFi.waitForConnectResult() != WL_CONNECTED).
This works too (for now).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment