Description
Basic Infos
- This issue complies with the issue POLICY doc.
- I have read the documentation at readthedocs and the issue is not addressed there.
- I have tested that the issue is present in current master branch (aka latest git).
- I have searched the issue tracker for a similar issue.
- [n/a ] If there is a stack dump, I have decoded it.
- I have filled out all fields below.
Platform
- Hardware: NodeMCU 1.0 or ESP-12E
- Core Version: 2.5.1, git 2.6.0-dev #455583b from 5-30-2019
- Development Env: Arduino IDE
- Operating System: Windows
Settings in IDE
- Module: NodeMCU or Generic ESP8266 Module
- Flash Mode: qio
- Flash Size: 4MB (1MB SPIFFS)
- lwip Variant: v2 Lower Memory
- Reset Method: nodemcu
- Flash Frequency: 40Mhz
- CPU Frequency: 80Mhz or 160MHz
- Upload Using: SERIAL
- Upload Speed: 921600
- SSL Support: either all or basic SSL ciphers
Problem Description
I am observing unstable behavior of the ESP8266 when I am turning on and off the Wifi frequently.
The example sketch is taken from my code and is greatly simplified. The point is to run ESP8266 with wifi turned off (low power consumption), accumulate data and send them to a server periodically. Here, the period is 30 seconds, in reality it is much longer, of course.
With axTLS the sketch runs easily overnight (e. g. 12 hours without reset, didn't test longer time), with BearSSL it does not survive 15 minutes, generally.
If you uncomment the prints in loop()
, you can see that the wdt fires outside the sketch, the last character printed is always '-'. In this case use putty as serial monitor, the arduino serial monitor does not interpret BS character and you will get full screen of dots and hyphens :)
I tried to add delays in wifiDisconnect
function, but no change.
I know your time is precious, so I tried to be as specific as I could. I am lost in debugging wdt outside the loop
function, though.
Do you have any idea what to test? I hope the sketch is ok.
The same mechanism with disconnecting wifi is running in my devices based on v 2.5.0 dated 8-2018 (commit 641c5cd) with axTLS for months without an issue.
MCVE Sketch
//#define USING_AXTLS
#include <ESP8266WiFi.h>
#ifdef USING_AXTLS
#include "WiFiClientSecureAxTLS.h"
using namespace axTLS;
#endif
#define SSID "***"
#define PASSWORD "***"
static uint32_t MILLIS_TO_WAKE_UP = 30*1000; // wake up after 30 seconds
const char* SERVERNAME = "www.example.com";
uint16_t PORT = 443;
#ifdef USING_AXTLS
axTLS::WiFiClientSecure wifiClient;
#else
BearSSL::WiFiClientSecure wifiClient;
#endif
uint32_t lastSleep = 0; // millis of the last time when forced to sleep
void setup() {
WiFi.setAutoConnect(false);
Serial.begin(115200);
pinMode(2, OUTPUT);
digitalWrite(2, LOW); // Start indicator
// Wait for GPIO0 down as a start condition (we want to stop here after a wdt reset)
/* Serial.println(F("\nConnect GPIO0 to GND to start"));
pinMode(0, INPUT_PULLUP);
while (digitalRead(0) == HIGH)
delay(100);
*/
pinMode(2, INPUT); // Back to default
Serial.print(ESP.getSdkVersion());
#ifdef USING_AXTLS
Serial.println(F(", axTLS"));
#else
Serial.println(F(", BearSSL"));
#endif
wifiConnect();
wifiSend(3);
wifiDisconnect();
}
void loop() {
//Serial.print("\x08.");
if (millis() - lastSleep > MILLIS_TO_WAKE_UP) {
wifiConnect();
wifiSend(2);
wifiDisconnect();
}
//Serial.print("\x08-");
}
void wifiConnect(void) {
WiFi.mode(WIFI_STA);
delay(100);
WiFi.begin(SSID, PASSWORD);
Serial.printf_P(PSTR("Connecting to %s "), SSID);
while (WiFi.status() == WL_DISCONNECTED) {
Serial.write('.');
delay(500);
}
Serial.println();
if (WiFi.status() == WL_CONNECTED) {
Serial.printf_P(PSTR("WiFi connected (RSSI %d), IP address: %s, "), WiFi.RSSI(), WiFi.localIP().toString().c_str());
Serial.printf_P(PSTR("mem: %d\r\n"), ESP.getFreeHeap());
if (time(nullptr) < 100000000)
readTime();
}
}
void wifiDisconnect(void) {
// Disconnecting wifi
Serial.print(F("Disconnecting client"));
wifiClient.stop();
Serial.print(F(", wifi"));
WiFi.disconnect();
WiFi.mode(WIFI_OFF);
delay(100); // FIXME
Serial.println(F(", sleeping"));
WiFi.forceSleepBegin(); // turn off ESP8266 RF
delay(100); // FIXME
lastSleep = millis();
}
boolean wifiSend(int8_t status) {
// Check the wifi
if (WiFi.status() != WL_CONNECTED) {
Serial.println(F("[WiFi] Not connected to AP"));
return false;
}
#ifndef USING_AXTLS
wifiClient.setInsecure(); // for testing ok
#endif
if (wifiClient.connect(SERVERNAME, PORT)) {
Serial.println(F("[WiFi] Connected to server"));
}
else {
Serial.println(F("[WiFi] Connection to server failed"));
return false;
}
if (wifiClient.connected()) {
// GET /test HTTP/1.1
wifiClient.printf_P(PSTR("GET /test HTTP/1.1\nHost: %s\n\n"), SERVERNAME);
Serial.print(F("[WiFi] Data sent, waiting for response ... "));
// Wait max 5 seconds for server response
long m = millis();
while (millis() - m < 5000 && !wifiClient.available()) {
delay(100);
}
// Read the response header
Serial.println();
while (wifiClient.connected()) {
String line = wifiClient.readStringUntil('\n');
Serial.println(line);
if (line == "\r") {
// Serial.println("headers received");
break;
}
yield();
}
// Read and discard the data
while (wifiClient.available() && wifiClient.connected()) {
String line = wifiClient.readStringUntil('\n');
yield();
}
}
return true;
}
void readTime(void) {
if (WiFi.status() != WL_CONNECTED) {
return;
}
Serial.print(F("Setting time using SNTP "));
configTime(1 * 3600, 0, "tik.cesnet.cz", "pool.ntp.org");
// Read time, wait 5 seconds
uint32_t m = millis();
time_t now = time(nullptr);
while (now < 100000000 && millis() - m < 5000) {
delay(100);
Serial.write('.');
now = time(nullptr);
}
Serial.println();
if (now < 100000000) {
Serial.println(F("Time was not set."));
}
else {
Serial.print(F("Current time: "));
Serial.println(ctime(&now));
}
}
Debug Messages
Note that the 404 response is ok, we are using www.example.com server to test.
Connecting to BILNet ..........
WiFi connected (RSSI -52), IP address: 192.168.1.102, mem: 44784
[WiFi] Connected to server
[WiFi] Data sent, waiting for response ...
HTTP/1.1 404 Not Found
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Sat, 01 Jun 2019 09:14:29 GMT
Expires: Sat, 08 Jun 2019 09:14:29 GMT
Last-Modified: Tue, 28 May 2019 06:46:04 GMT
Server: ECS (dcb/7EA6)
Vary: Accept-Encoding
X-Cache: 404-HIT
Content-Length: 1270
Disconnecting client, wifi, sleeping
ets Jan 8 2013,rst cause:4, boot mode:(3,6)
wdt reset
load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
vffffffff
~ld
2.2.1(cfd48f3), BearSSL