PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ESP8266 / Arduino: Verbindungsproblem zum Router bei blockierter IP nach Neustart



HaWe
05.06.2018, 11:11
hi,
mein esp8266 Wifi Server funktioniert zwar meist gut, aber manchmal (gerade über Nacht) verliert er wohl die Verbindung zu meinem Speedport Router, und wenn ich dann morgens aufs Display gucke, sehe ich, dass er in der setup-Routine festhängt, sich versucht einzuloggen/anzumelden, aber es wohl nicht klappt (Anzeige Progress zwischen 80 und 98%):



#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
WiFiServer wifiserver(http_port);
ESP8266WebServer lanserver(8081);

void setup() {
// **SNIP**

WiFi.begin(ssid, password);
WiFi.config(this_ip, gateway, subnet); // feste IP

while (WiFi.status() != WL_CONNECTED) { // <<<<<<<<<<<<<<<<<<<<<<<<
if(digitalRead(PIN_BTND5)) display.setRotation(0);
else display.setRotation(2);
delay(500);
Serial.print(".");

display.clearDisplay();
display.setCursor( 0, 20); display.print("WiFi connecting...");
drawHorizontalBargraph( 0, 30, (int16_t) display.width(), 9, 1, progress); // <<<<<<<<<<<<<<<<<<<<<<<<
display.setCursor( 0, 40); display.print((String)progress + "%");
if (progress >= 98) {
progress = 80;
Serial.println();
}
display.display();

if (progress < 10) progress += 5;
else if (progress < 50) progress += 2;
else if (progress < 90) progress += 1;
}
display.clearDisplay();
progress = 100;
display.setCursor( 0, 20); display.print("WiFi connecting...");
drawHorizontalBargraph( 0, 30, (int16_t) display.width(), 9, 1, progress);
display.setCursor( 0, 40); display.print((String)progress + "%");
display.display();
delay(300);

Serial.println("");
Serial.print("WiFi connected: ");
Serial.println(WiFi.gatewayIP());


//----------------------------------------
// Start the WiFi server (-> www)
wifiserver.begin();
Serial.println("WiFi Server started");

//----------------------------------------
// Start the ESP LAN server (-> ESP client)
lanserver.on("/",handleRoot) ;
lanserver.on("/client/client0/", handleClientIOs);
delay(100);
lanserver.on("/client/client1/", handleClientIOs);
delay(100);
lanserver.on("/client/client2/", handleClientIOs);
delay(100);
lanserver.begin();
Serial.println("ESP Server started");

// **SNIP**

}



Auch durch resetten am esp klappt es nicht (er startet dann zwar neu, blockiert aber sofort erneut wieder), offenbar ist die statische IP (x.x.x.200) am Router (noch) blockiert, erst wenn ich kurzzeitig das Netzteil komplett ausstöpsele und dann neu einstecke, funktioniert es wieder (sofort, ohne Probleme) .

Das gleiche Problem tritt auf, wenn der ESP via USB-Kabel mit meiner Arduino-IDE auf dem PC verbunden ist und ich eine neue Programmversion aufspiele, auch dann versucht er sich am Router anzumelden, wird aber blockiert. Auch hier hilft nur kurzzeitige Entfernung des USB/Stromkabels (Stromversorgung via USB-Kabel), danach läuft alles wieder.

Ich müsste jetzt also irgend welche Befehle einfügen, die dieses Verbindungsproblem bei blockierter IP nach Neustart kurzfristig händeln, nur wie könnte man das machen?

Ceos
05.06.2018, 11:16
Komfortfrage:

Wäre es nicht sinnvoller DHCP zu verwenden und dem ESP (Mac Adresse ist ja bekannt) eine feste IP im Router zu geben? (ich meine damit reservieren, keine fest IP und DHCP-Mischung)
So würde der ESP immer die gleiche IP haben und du würdest irgendwelche Adresskonflikte vermeiden.


Ich meine das wäre der einfacherere Weg als im Code jetzt noch Kopfstände zu machen um Edge Cases zu behandeln.

HaWe
05.06.2018, 11:44
Komfortfrage:

Wäre es nicht sinnvoller DHCP zu verwenden und dem ESP (Mac Adresse ist ja bekannt) eine feste IP im Router zu geben? (ich meine damit reservieren, keine fest IP und DHCP-Mischung)
So würde der ESP immer die gleiche IP haben und du würdest irgendwelche Adresskonflikte vermeiden.


Ich meine das wäre der einfacherere Weg als im Code jetzt noch Kopfstände zu machen um Edge Cases zu behandeln.

damit kenne ich mich leider nicht aus, ich sehe auch im Router nur Port-Umleitung (zwecks dynDNS) für feste IPs, nicht für MAC (und kenne die bisher auch noch nicht einmal - im Router wird der HTTP Port (80) über den Gerätenamen ESP_34334DF o.ä. geschaltet), und wüsste auch gar nicht, wie ich meinen bisherigen Code umschreiben müsste, samt Umkonfigurierung des Routers.

Andererseits hat ja der ESP bereits schon eine feste, statische IP:


WiFi.config(this_ip, gateway, subnet); // feste IP, this_ip="192.168.2.200"

- er scheint nur in solchen Momenten (noch) durch seine eigene, vorherige Anmeldung unter derselben IP blockiert zu werden.

- - - Aktualisiert - - -

PS,
DHCP ist auch reserviert von x.x.x.100 bis x.x.x.199 , daher keine Konflikte von DHCP mit festen IPs >= 200

Ceos
05.06.2018, 12:02
Das Problem das ich sehe ist der Mischbetrieb von DHCP und festen IP Adressen, gut möglich dass die FW im ESP da Probleme bekommt und ich denke dem wird auch nur schwer beizukommen sein.

"Üblicherweise" verwendet man im WLAN ausschließlich DHCP Bindung (in seltenen Fällen auch feste IPs aber nicht gemischt). Gut möglich das du dich in einem eher experimentellem Feld bewegst und professionelle Hilfe im Github für die Lib finden könntest, aber das wäre wieder nur in englischer Sprache zu realisieren.

Was du aber auch machen kannst um das Risiko zu minimieren wäre einen 2ten Router anzuschließen der einfacher zu verwalten ist. Und wenn er mal "zerspielt" ist, steckst den PC halt für Internet in den alten Router zurück und setzt den Bastel Router auf Werkseinstellung zurück.

Ich hab zwar mal kurz gesucht aber keine Konkreten Informationen gefunden die dein Problem umreißen, das ist schon eine relativ spezielle Art damit zu arbeiten. Aber das ist der Preis den man für "Einfachheit" (libs und Arduino im allgemeinen VS Bare Metal gesehn) zahlt, man legt sich auf gewisse Szenarien fest und alles abseits davon tendiert in die Richtung Bare Metal Programmierung.

HaWe
05.06.2018, 14:51
ja, vermutlich kann das Problem nur jemand lösen, der die Arduino WiFi libs für esp8266 sehr gut kennt.