Веб-сервер ESP8266 не отвечает

Я пытаюсь связаться с веб-сервером, работающим на моей мини-совместимой плате Wemos D1.

Я пробую один пример esp8266, используя приведенный ниже код Arduino examples "WifiManualServer". Я заменил SSI и пароль для своей сети Wi Fi в линиях

#define STASSID "my wifi ssid"
#define STAPSK  "my secret"
/*
    Этот скетч демонстрирует, как настроить простой HTTP-сервер.
    Сервер установит PIN GPIO в зависимости от запроса
      http://server_ip/gpio/0 установит GPIO2 на низком уровне,
http://server_ip/gpio/1 установит максимум GPIO2
    server_ip-это IP-адрес модуля ESP8266, который будет
напечатан в последовательный порт при подключении модуля.
*/


#include <ESP8266WiFi.h>

#ifndef STASSID
#define STASSID "my wifi ssid"
#define STAPSK  "my secret"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);

  // prepare LED
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 0);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

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

  // Start the server
  server.begin();
  Serial.println(F("Server started"));

  // Print the IP address
  Serial.println(WiFi.localIP());
  server = WiFiServer(80);
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println(F("new client"));

  client.setTimeout(5000); // default is 1000

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(F("request: "));
  Serial.println(req);

  // Match the request
  int val;
  if (req.indexOf(F("/gpio/0")) != -1) {
    val = 0;
  } else if (req.indexOf(F("/gpio/1")) != -1) {
    val = 1;
  } else {
    Serial.println(F("invalid request"));
    val = digitalRead(LED_BUILTIN);
  }

  // Set LED according to the request
  digitalWrite(LED_BUILTIN, val);

  // read/ignore the rest of the request
  // do not client.flush(): it is for output only, see below
  while (client.available()) {
    // byte by byte is not very efficient
    client.read();
  }

  // Send the response to the client
  // it is OK for multiple small client.print/write,
  // because nagle algorithm will group them into one single packet
  client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now "));
  client.print((val) ? F("high") : F("low"));
  client.print(F("<br><br>Click <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/1'>here</a> to switch LED GPIO on, or <a href='http://"));
  client.print(WiFi.localIP());
  client.print(F("/gpio/0'>here</a> to switch LED GPIO off.</html>"));

  // The client will actually be *flushed* then disconnected
  // when the function returns and 'client' object is destroyed (out-of-scope)
  // flush = ensure written data are received by the other side
  Serial.println(F("Disconnecting from client"));
}

Как только я скомпилирую и загружу скетч, он сможет подключиться к моей сети Wi-Fi. Ниже приведен вывод на последовательном мониторе.

20:45:12.633 -> Connecting to <text replaced xxxxxxx>
20:45:13.247 -> ........
20:45:17.551 -> WiFi connected
20:45:17.551 -> Server started
20:45:17.551 -> 192.168.0.39

Я могу проверить клиентское соединение в моем пользовательском интерфейсе управления сетью Wi-Fi маршрутизаторов. Espboard подключается и назначается IP-адрес, как на выходе (192.168.0.39).

Когда я запускаю браузер и пытаюсь получить http://192.168.0.39/gpio/0, время запроса истекло. с моего пк с Windows 10 попробовал пинговать 192.168.0.39, но время ожидания запроса истекло.

Из скетча я вижу следующие строки в функции loop ():

  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println(F("new client"));

Выполнение никогда не достигало строки Serial.println(F("новый клиент"));.

Я попытался вставить линейный сервер = WiFiServer(80); после того, как соединение Wi-Fi установлено.

Пожалуйста, поделитесь своими мыслями о том, почему сервер.available() не удался?

, 👍3

Обсуждение

Находится ли ваш компьютер с Windows 10 в той же подсети? Накладывает ли ваш Wi-Fi-маршрутизатор изоляцию Wi-Fi?, @Majenko

удалите строку " сервер = WiFiServer(80)";, @Juraj

Я думаю, вам нужно где-то вызвать " server.on ()", чтобы сервер действительно обслуживал URL-адрес. Какую библиотеку вы используете, кстати (для меня за "#include " ничего нет)?, @Sim Son

@SimSon, это не библиотека веб-сервера esp8266, @Juraj

@Juraj, спасибо за предложение. Теперь я удалил линейный сервер = WiFiServer(80). Вопрос решен. Теперь сервер доступен. Спасибо за помощь., @Joshua Francis