SimpleWiFiServer.ino not work correct on new esptool, xtensa?

ArtemN
Posts: 13
Joined: Mon Sep 03, 2018 4:20 am

SimpleWiFiServer.ino not work correct on new esptool, xtensa?

Postby ArtemN » Tue Oct 02, 2018 11:59 am

I faced with strange problem - in old ver of libs HTTP server answer to browser very fast (about 20 request in sec). But with new libs (esptool 2.3.1 xtensa 5.2.0) basic example SimpleWiFiServer.ino answer and freze for some timeout. It seemed that client.stop() not kill connection and client.avalable() == true and program spin in while() cycle to timeout...

Code: Select all

/*
  WiFi Web Server LED Blink

  A simple web server that lets you blink an LED via the web.
  This sketch will print the IP address of your WiFi Shield (once connected)
  to the Serial monitor. From there, you can open that address in a web browser
  to turn on and off the LED on pin 5.

  If the IP address of your shield is yourAddress:
  http://yourAddress/H turns the LED on
  http://yourAddress/L turns it off

  This example is written for a network using WPA encryption. For
  WEP or WPA, change the Wifi.begin() call accordingly.

  Circuit:
   WiFi shield attached
   LED attached to pin 5

  created for arduino 25 Nov 2012
  by Tom Igoe

  ported for sparkfun esp32
  31.01.2017 by Jan Hendrik Berlin

*/

#include <WiFi.h>

const char* ssid     = "skynet";
const char* password = "sconnor";

WiFiServer server(80);

void setup()
{
  Serial.begin(115200);
  pinMode(5, OUTPUT);      // set the LED pin mode

  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

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

  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();

}

int value = 0;

void loop() {
  WiFiClient client = server.available();   // listen for incoming clients
  //client.setNoDelay(true);

  if (client) {                             // if you get a client,
    Serial.println("New Client.");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            // send a standard http response header
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");  // the connection will be closed after completion of the response
            //client.println("Refresh: 5");  // refresh the page automatically every 5 sec
            client.println();
            client.println("<!DOCTYPE HTML>");
            client.println("<html>");
            // output the value of each analog input pin
            //for (int analogChannel = 0; analogChannel < 2; analogChannel++) {
              //int sensorReading = analogRead(analogChannel);
              client.print("analog input ");
              client.print("AI0");
              client.print(" is ");
              client.print(analogRead(A0));
              client.println("<br />");
            //}
            client.println("</html>");
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(5, HIGH);               // GET /H turns the LED on
        }
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(5, LOW);                // GET /L turns the LED off
        }
      }
    }
    
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}
Terminal showes one call from firefox and timings:
Attachments
2018-10-02_18-47-44.png
serial output
2018-10-02_18-47-44.png (19.53 KiB) Viewed 5672 times

ArtemN
Posts: 13
Joined: Mon Sep 03, 2018 4:20 am

Re: SimpleWiFiServer.ino not work correct on new esptool, xtensa?

Postby ArtemN » Wed Oct 03, 2018 9:51 am

It seemed that the reason in WiFiClient.cpp code. Old version code different and work well (have no "*RxBuffer" instances).

ArtemN
Posts: 13
Joined: Mon Sep 03, 2018 4:20 am

Re: SimpleWiFiServer.ino not work correct on new esptool, xtensa?

Postby ArtemN » Tue Oct 23, 2018 3:19 am

I make backup files of old version that work fine:
https://github.com/espressif/arduino-esp32/issues/1921

ArtemN
Posts: 13
Joined: Mon Sep 03, 2018 4:20 am

Re: SimpleWiFiServer.ino not work correct on new esptool, xtensa?

Postby ArtemN » Fri Jan 18, 2019 2:52 am

It seemed that wifi goto in sleep mode. I disable sleep mode after Wifi.begin() and all work fine!

void setup()
{
...
WiFi.begin(ssid, password);
WiFi.setSleep(false);// this code solves my problem
...
}

Who is online

Users browsing this forum: Google [Bot] and 57 guests