ESP8266 Wi-Fi не подключается к интернету без статического IP

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

Но после произвольного количества раз (например, когда я перезапускаю устройство) он пытается подключиться в течение многих лет (например, несколько минут). В конце концов он говорит "Подключен", но IP-адрес полностью неверен, и он не подключен к Интернету (запрос GET не выполняется).

Вот странные вещи:

  • Если я назначаю статический IP-адрес, он ВСЕГДА работает и подключается в течение нескольких секунд
  • Если я сброшу свой маршрутизатор с завода, он снова будет работать несколько раз
  • Я не видел этого ни с каким другим устройством (например, ноутбуками или мобильными телефонами)

Это почти как если бы DHCP не смог назначить IP-адрес, а затем возвращает случайное значение по умолчанию.

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

// Replace these with your WiFi network settings
const char* ssid = "MYSSID"; //replace this with your WiFi network name
const char* password = "MYPASSWORD"; //replace this with your WiFi network password

void setup() {
  Serial.begin(115200);
  delay(1000);
  
  IPAddress ip(192,168,1,77);
  IPAddress gateway(192,168,1,1);
  IPAddress subnet(255,255,255,0);
  
// If I uncomment this line then it works fine
//  WiFi.config(ip, gateway, subnet);

  WiFi.begin(ssid, password);

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

  Serial.println("success!");
  Serial.print("IP Address is: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  HTTPClient http;

  String serverPath = "http://www.google.com";
  http.begin(serverPath.c_str());
  
  // Send HTTP GET request
  int httpResponseCode = http.GET();
  Serial.print("HTTP Response code: ");
  Serial.println(httpResponseCode);
  String payload = http.getString();
  Serial.println(payload);
  // Free resources
  http.end();

  delay(1000);
}

Когда DHCP волшебным образом работает, он назначает: 192.168.1.159

Когда DHCP не работает, я получаю: 169.254.104.241

Когда я использую статический IP, то статический IP назначается.

Таким образом, вопрос заключается в следующем: Видел ли кто-нибудь такое поведение и, возможно, дал некоторые советы о том, как я могу обеспечить согласованность подключения к Интернету без необходимости статического IP-адреса?

Обновление: Если я выполню пинг до 169.254.104.241, я получу ответ. Но если я попытаюсь получить что-либо из Интернета, я получу код ответа HTTP = -1.

, 👍6

Обсуждение

Подключается ли esp к Wi-Fi в любом случае? Этот ip `169.254.104.241", я полагаю, недействителен, но действительно ли он получает этот ip (в этом случае вы сканировали сеть)?, @Sim Son

@SimSon Я только что отправил запрос на этот IP-адрес, и он отвечает, и если я выполняю "arp-a", то появляется IP-адрес. Я провел еще один тест, и кажется, что устройство не имеет подключения к Интернету (я думаю... Я получаю код ответа HTTP -1). Я обновил вопрос., @Armand Maree


3 ответа


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

1

Наконец-то я нашел решение. Я понизил версию платы ESP8266 в Arduino Studio до версии 2.5.2, и это сработало.

,

Это интересно. Есть ли какая-то особая причина, по которой вы перешли на версию 2.5.2 (текущая версия 2.7.4)? Какая версия была причиной проблемы? Вы пробовали другие версии?, @StarCat


4

Это нормальное поведение. ну, не совсем так, этот адрес называется адресом apipa.

Это нормальное поведение для многих операционных систем-указывать себе адрес в диапазоне 169.254.x.x, когда они не получают ответы DHCP.

Я предполагаю, что ваша библиотека делает это за вас.

Это похоже на специальную адресацию: если все устройства не получат ответ dhcp, все они будут назначены в одну и ту же подсеть и смогут взаимодействовать с этими адресами apipa.

Я подозреваю, что это может быть ваш маршрутизатор. Вы можете убедиться в этом, загрузив бесплатное приложение DHCP-сервера для вашей операционной системы. Подключитесь через Ethernet к компьютеру, на котором запущено приложение DHCP, отключите DHCP в маршрутизаторе. Если это перестанет происходить, вы будете знать, что это маршрутизатор.

Редактировать: Кроме того, это может быть оговорка в прошивке маршрутизатора. Проверьте веб-сайт производителя маршрутизатора и посмотрите, доступны ли какие-либо обновления встроенного ПО. если он зависает с DHCP, скорее всего, у каждого клиента с этой версией прошивки была эта проблема. Такие вещи обычно исправляются очень быстро.

,

Это была очень полезная информация. Спасибо! После вашего комментария я просто оставил ESP, чтобы продолжать пытаться получить страницу из Интернета, и в конце концов, как и через 10 минут, она успешно подключилась. Я до сих пор понятия не имею, почему это происходит, но ради того, что мне нужно, я готов оставить все как есть. Я протестирую тот инструмент DHCP, о котором вы упомянули, когда у меня будет перерыв в работе, и посмотрю, что произойдет., @Armand Maree


1

Спасибо за публикацию вопроса и решения. Я провел несколько часов в Google и читал форумы, прежде чем наткнулся на это. Я не уверен, что моя первопричина была той же самой, но для меня "странный" IP для моего ESP8266 (nodemcu) произошел от их подключения через Гостевую сеть моего маршрутизатора Asus. Это привело к идентичной проблеме с OP с полным случайным подключением и длительным отсутствием подключений к Wi-Fi, Интернету и Blynk

Возврат обратно к ESP8266 2.5.2 в студии Arduino, похоже, волшебным образом решил проблему. Кто - то должен предупредить создателей библиотеки.

,

Рад, что я не единственный, кто видел эту проблему! Потратил на это так много часов. Я думал, что я один. Хаха., @Armand Maree