Библиотека ESP8266: получено 2 запроса вместо 1

У меня возникла странная проблема со скетчем при использовании библиотеки WiFiEsp.h из https://github.com/bportaluri/WiFiEsp

Когда я отправляю 1 запрос на свой ESP8266 из браузера как http://192.168.0.25 , похоже, мой ESP8266 получает 2 запроса и запускается 2 раза. См. скетч здесь и последовательный терминал:

void loop()
{
  // прослушиваем входящих клиентов
  WiFiEspClient client = server.available();
  if (client) {
    Serial.println("New client");
    // http-запрос заканчивается пустой строкой
    boolean currentLineIsBlank = true;
    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read();
        Serial.write(c);
        // если вы дошли до конца строки (получили новую строку
        // символ) и строка пуста, http-запрос завершился,
        // чтобы вы могли отправить ответ
        if (c == '\n' && currentLineIsBlank) {
          Serial.println("Sending response");

          // отправляем стандартный заголовок ответа http
          // используем \r\n вместо множества операторов println для ускорения отправки данных
          client.print(
            "HTTP/1.1 200 OK\r\n"
            "Content-Type: text/html\r\n"
            "Connection: close\r\n"  // соединение будет закрыто после завершения ответа
            "\r\n");
          client.print("<!DOCTYPE HTML>\r\n");
          client.print("<html>\r\n");
          client.print("Hello World!\r\n");
          client.print("</html>\r\n");
          break;
        }
        if (c == '\n') {
          // вы начинаете новую строку
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // вы получили символ в текущей строке
          currentLineIsBlank = false;
        }
      }
    }
    // даем веб-браузеру время получить данные
    delay(10);

    // закрываем соединение:
    client.stop();
    Serial.println("Client disconnected");
  }
}

Серийный терминал:

[WiFiEsp] Initializing ESP module
[WiFiEsp] Initilization successful - 2.0.0
Attempting to connect to WPA SSID: Numericable-6010
[WiFiEsp] Connected to Numericable-6010
You're connected to the network
SSID: Numericable-6010
IP Address: 192.168.0.25

To see this page in action, open a browser to http://192.168.0.25.

[WiFiEsp] Server started on port 80
[WiFiEsp] New client 0
New client
GET / HTTP/1.1
Host: 192.168.0.25
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://192.168.0.25/
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7

Sending response
[WiFiEsp] Disconnecting  0
Client disconnected
[WiFiEsp] New client 1
New client
GET /favicon.ico HTTP/1.1
Host: 192.168.0.25
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://192.168.0.25/
Accept-Encoding: gzip, deflate
Accept-Language: fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7

Sending response
[WiFiEsp] Disconnecting  1
Client disconnected

Пожалуйста, объясните, почему подключились 2 клиента? Как я могу отключиться сразу после первого?

, 👍0

Обсуждение

браузеры автоматически запрашивают /favicon.ico для сайтов, @Juraj

https://stackoverflow.com/questions/1321878/how-to-prevent-favicon-ico-requests, @Juraj

Спасибо за информацию, но как мне закодировать запрос URL?, @Teddol

Не могли бы вы объяснить параметры href?, @Teddol

вместо указания на сервер значок кодируется в параметре href как строка base64., @Juraj


2 ответа


Лучший ответ:

1

Браузеры автоматически запрашивают /favicon.ico для сайтов. Добавьте это в раздел <head> вашего HTML, чтобы исключить запрос «favicon»:

<link rel="icon" href="data:;base64,iVBORw0KGgo=">

client.println("HTTP/1.1 200 OK\r\n" "Content-Type: text/html"); 
client.println("Connection: close"); 
client.println(); 
client.println("<!DOCTYPE HTML>"); 
client.println("<html><head>"); 
client.println("<link rel='icon' href='data:;base64,iVBORw0KGgo='>"); 
client.println("</head><body>"); 
client.println("Hello World!"); 
client.println("</body></html>");

на основе этого ответа SO вместо указания на сервер значок кодируется в параметре href как строка base64

,

Я изменил <ссылку> на последнее изменение ответа SO., @Juraj


0

Добавление заголовка со ссылкой на значок ярлыка в html-ответ устраняет проблему. Спасибо!!!

            client.print(
            "HTTP/1.1 200 OK\r\n"
            "Content-Type: text/html\r\n"
            "Connection: close\r\n"  // соединение будет закрыто после завершения ответа
            "\r\n");
          client.print("<!DOCTYPE HTML>\r\n");
          client.print("<head>\r\n");
          client.print("<link rel='shortcut icon' href='data:image/x-icon;,' type='image/x-icon'> \r\n");
          client.print("</head>\r\n");
          client.print("<html>\r\n");
          client.print("Hello World!\r\n");
          client.print("</html>\r\n");
,