Forum: Mikrocontroller und Digitale Elektronik ESP8266 bekommt nicht immer die IP vom DHCP


von baer (Gast)


Lesenswert?

Hallo,

ich habe einen ESP8266 (WeMos D1 Mini) Dieser funktioniert ganz gut und 
verbindet sich sauber mit meinem WLAN... Ich programmiere in der Arduino 
IDE 1.8.3

Das ganze sieht etwa so aus:
1
  WiFi.begin(ssid, password);
2
  
3
  while (WiFi.status() != WL_CONNECTED) {
4
    delay(500);
5
    Serial.print(".");
6
  }
7
8
  Serial.println("");
9
  Serial.println("WiFi connected");  
10
  Serial.println("IP address: ");
11
  Serial.println(WiFi.localIP());

Manchmal bekommt er aber nicht die IP vom DHCP wie erwartet: 
192.168.178.80 sondern die 192.168.4.2

das ganze habe ich mit mehreren ESP Feststellen können.

Der Router (eine FritBox 7490 ca. 1Jahr alt) macht ansonsten im Netzwerk 
keinerlei Probleme [und es werden Täglich mehr als 20 Geräte über WLAN & 
LAN genutzt].

hat jemand eine Idee an was das liegen könnte? Evtl. soetwas schon mal 
gehabt? <- wie gesagt... manchmal bekommt er die richtige IP

ich habe bereits ein weiteres Verfahren verwendet:
> WiFiMulti.addAP(ssid, password);
was exakt die selben Probleme verursacht...


Vielen Dank für jeden Tipp

von yesitsme (Gast)


Lesenswert?

Ich vermute mal, das du einen 2. DHCP-Server im Netz hast.

von Marc H. (marchorby)


Lesenswert?

baer schrieb:
> 192.168.178.80 sondern die 192.168.4.2

Es gibt zwei Möglichkeiten:

1.) du hast einen zweiten DHCP im Netz (z.B. von einer NAS oder einem 
zweiten WLAN-Router)
2.) in deinem Code steckt im falle dass keine IP vom DHCP kommt diese 
Adresse drinn!

von baer (Gast)


Lesenswert?

das mit dem DNS habe ich überprüft und die Geräte welche soetwas KÖNNTEN 
ausgeschaltet!

Eine IP habe ich nicht vergeben... <- da auch nach mehreren neustarts 
dann eben doch die richtige genommen wird (scheinbar willkürlich).

Das mit dem DNS war auch meine erste vermutung <- aber wenn es nicht die 
Fritzbox macht, wüsste ich nicht "woher" ... außerdem hat sich noch kein 
Smartphone, Notebook oder PC falsch eingewählt :/

Mit welchen Informationen könnte ich euch helfen mir zu helfen? Oder was 
kann ich selbst testen?

von mac (Gast)


Lesenswert?

baer schrieb:
> Mit welchen Informationen könnte ich euch helfen mir zu helfen? Oder was
> kann ich selbst testen?

Keine oder falsche MAC im DHCP Server für den ESP eingetragen.

von Hax (Gast)


Lesenswert?

192.168.4.x ist doch der IP Bereich des ESPs wenn man ihn im AP Modus 
betreibt. 192.168.4.2 wäre demnach eine typische IP Addresse für einen 
Client in einem standard "ESP-Netzwerk".

Eventuell verbindet sich dein ESP einfach je nach Signalstärke mit einem 
anderern ESP der sich im AP Modus befindet.

von Axel S. (a-za-z0-9)


Lesenswert?

baer schrieb:
> Manchmal bekommt er aber nicht die IP vom DHCP wie erwartet:
> 192.168.178.80 sondern die 192.168.4.2

> hat jemand eine Idee an was das liegen könnte? Evtl. soetwas schon mal
> gehabt? <- wie gesagt... manchmal bekommt er die richtige IP

Warum glaubst du, die eine IP-Adresse wäre "richtig" und die andere 
nicht? Ein DHCP-Server gibt einem anfragenden Gerät erstmal nur 
irgendeine IP-Adresse. Das muß keineswegs immer die gleiche sein. Genau 
genommen ist es nur dann immer die gleiche, wenn man das im DHCP-Server 
irgendwo konfiguriert. Letzteres ist bei Fritz-OS allerdings 
vergleichsweise einfach.

von ich (Gast)


Lesenswert?

Eventuell verbindet sich dein ESP einfach je nach Signalstärke mit einem
anderern ESP der sich im AP Modus befindet.

Das wird es sein. die ESPs sind standardmäßig Client und AP!
versuch mal

WiFi.mode(WIFI_STA)

im Arduino skech, damit ist ap deaktiviert.

von (prx) A. K. (prx)


Lesenswert?

Vorweg: Meine Erfahrung mit dem ESP8266 entstammt nicht der 
Aduino-Variante. Ich hatte allerdings ein ähnliches Problem mit NodeMCU.

Die Lib des Herstellers verwendet ein RTOS um die Aktivitäten des 
Programmierers und Hintergrund-Aktivitäten der Library zu koordinieren. 
Dieses RTOS arbeitet nicht unterbrechend, sondern kooperativ. Wenn man 
dem per Programm die Luft abschnürt, denn säuft der WLAN-Code der 
Library ab, verpasst Ereignisse, und dessen Funktion wird Glücksache.

Wenn ein Programm also längere Zeit am Stück arbeitet, ohne dem RTOS 
Raum zu geben, dann kann das zu Problemen führen. Das wäre der Fall, 
wenn delay(500) blockierend arbeitet.

Bei NodeMCU bedeutet es, dass man nicht so sehr linear programmieren 
sollte, also ein längere Zeit dauerndes Programm runterzuarbeiten, 
sondern eventorientiert. Also nicht aktiv warten, bis etwas passiert, 
sondern anlässlich der passenden Events die Aktion durchführen.

: Bearbeitet durch User
von baer (Gast)


Lesenswert?

> WiFi.mode(WIFI_STA)
leider half auch das nicht...

(ebenso habe ich auch WIFI_AP und WIFI_AP_STA auch ohne erfolg getestet)

das mit der "esp eigenen" IP klingt gut. Aber ich weiß noch nicht wonach 
ich suchen muss um dies zu verhindern...

Ich will halt das Teil an den verschiedensten Routern anschließen... 
d.h. ich kann keine IP vordefinieren (welche dann im lokalen Netzwerk 
auch IMMER erreichbar ist).

von (prx) A. K. (prx)


Lesenswert?

Fortsetzung:

Ich hatte das anfangs sehr ähnlich gemacht, nur eben in LUA. WLAN 
starten und per Schleife und 1s Verzögerung abzuwarten, ob es kommt. Mal 
tat es, mal nicht. Egal welche Konfiguration.

Was dann hingegen stabil funktionierte war ein Timer, der jede Sekunde 
ein Stück Code startet und darin nachsieht, ob das WLAN da ist, und 
darin dann die IP anzeigt.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

baer schrieb:
>> WiFi.mode(WIFI_STA)
> leider half auch das nicht...

Das muss auch auf dem anderen ESP passieren, der irgendwo in der Nähe 
als AP fungiert.

Normalerweise ist es aber so, dass ein ESP8266 sich den letzten Connect 
merkt und diesen AP dann auch immer wieder kontaktiert.

Ich empfehle Dir, nach dem folgenden Schema vorzugehen:
1
    WiFi.mode(WIFI_STA);
2
    WiFi.disconnect();
3
    delay(100);
4
    WiFi.begin(ssid, key);
5
6
    for (cnt = 0; cnt < 30; cnt++)                                          // check 15 seconds if connected
7
    {
8
        if (WiFi.status() == WL_CONNECTED)
9
        {
10
            connected = true;
11
            break;
12
        }
13
14
        delay(500);
15
    }

Das heißt: mache vor dem Wifi.begin einen expliziten Disconnect. Dann 
kann Dir kein anderer AP, zu dem Dein ESP irgendwann mal eine Verbindung 
hatte, dazwischenfunken.

von baer (Gast)


Lesenswert?

@A.K.

klingt Interessant... allerdings fällt mir gerade keine Möglichkeit ein, 
das ohne Delay zu bewerkstelligen...

ich habe mal den Code etwas angepasst:
1
  Serial.print("Connect to:");
2
  Serial.println( ssid );
3
4
  WiFi.mode(WIFI_STA);
5
  WiFi.disconnect();
6
  delay(1000);
7
8
  WiFi.begin(ssid, pass);
9
  int timeout = 20000; // => 20 Sekunden
10
  bool wait = true;
11
  long connectStart = millis();
12
  long connTest = millis();
13
14
  while ( wait ) {
15
    
16
    if( millis() > connTest + 1000 ) {
17
      connTest = millis();
18
      wait = WiFi.status() != WL_CONNECTED;
19
      Serial.print(".");
20
    }
21
22
    if( millis() > connectStart + timeout ) {
23
      wait = false;
24
      Serial.println("timeout");
25
    }
26
27
    delay(100);
28
29
  }

auch hier verbindet er sich wieder SAUBER meistens mit der 192.168.4.2

wenn ich den delay zu kurz mache oder entferne, hängt er sich auf ...

von Stefan F. (Gast)


Lesenswert?

@A. K.

Das was du beschrieben hast, ist weder eine Eigenart von Arduino noch 
von der LUA Firmware sondern sie ergibt sich aus den SDK von Espressif 
und der lwip Stack, auf den das Ganze aufbaut.

Nur so als Info.

von baer (Gast)


Lesenswert?

Okay...
dumm von mir...

ich habe den Fehler gefunden!
=> in der Tat war von mir ein anderer ESP welcher den mode AP_STA hatte.

habe diesen auf STA umprogrammiert und jetzt scheint es zu passen :)

crazy

10001 dank für eure Hilfe... den Fehler hätte ich ohne euch NIEMALS 
gefunden <- und gleichzeitig ne menge gelernt!

von Stefan F. (Gast)


Lesenswert?

Ich möchte noch etwas ergänzen:

Bei der ESP Erweiterung für Arduino wurde delay() so umgeschrieben, daß 
es wiederholt yield() aufruft, bis die gewünschte Zeit erreicht oder 
überschritten wurde. Yield() wiederum übergibt die Kontrolle an die 
Firmware von Espressif, die dann solange irgendwas macht, wie sie gerne 
möchte. Deswegen kann delay() in Ausnahmefällen erheblich länger dauern, 
als gewollt.

Wer PC's unter Linux oder Windows programmiert, kennt das, dort ist es 
nämlich ebenso.

von baer (Gast)


Lesenswert?

evtl. noch ein anderes Problem angehangen, weil hier so viele Könner 
sind :)

nachdem ich nun endlich meine Verbindung habe, möchte ich auch, dass 
MDNS funktioniert.
Das hat es auch schon mal, aber irgendwie geht es jetzt nicht mehr...
Auf was muss ich achten?

nachdem ich verbunden bin, starte ich den Responder:

    if( MDNS.begin("mydnsname", WiFi.localIP()) )
      Serial.println("MDNS responder started");

hier starte ich meinen tcp-server <- welcher auch gut über die IP 
erreichbar ist.

Zuletzt füge ich noch den Service hinzu

    MDNS.addService("http", "tcp", 80);


Hat hierfür noch jemand einen Tipp?

von Axel S. (a-za-z0-9)


Lesenswert?

baer schrieb:
> Ich will halt das Teil an den verschiedensten Routern anschließen...
> d.h. ich kann keine IP vordefinieren (welche dann im lokalen Netzwerk
> auch IMMER erreichbar ist).

Dann verstehe ich deine Frage schon gar nicht. Jeder Router kann 
(vermutlich: wird) ein anderes Netzwerk konfiguriert haben oder doch 
zumindest einen anderen Bereich an per DHCP vergebbaren IP-Adressen. 
Unter diesen Voraussetzungen ist alles, worauf du hoffen kannst, daß der 
Router dir überhaupt eine Adresse zuweist. Wenn der ESP dann von Dritten 
erreichbar sein soll, muß er sich (seine IP-Adresse) irgendwo 
registrieren. Prinzip DynDNS.

Was du übrigens noch gar nicht gesagt hast: ist der ESP denn in beiden 
Fällen mit der Fritzbox verbunden? Taucht er da in der WLAN-Übersicht 
auf? Denn das wäre das erste, was man checken müßte. Wenn der ESP nicht 
mit dem richtigen AP spricht, dann kann er natürlich auch nicht den 
richtigen DHCP erreichen.

von (prx) A. K. (prx)


Lesenswert?

Stefan U. schrieb:
> Wer PC's unter Linux oder Windows programmiert, kennt das, dort ist es
> nämlich ebenso.

Nur arbeiten Linux und Windows unterbrechend. Weshalb du aktiv 
Schleifchen drehen kannst so lange du willst, ohne jedes yield, und 
trotzdem andere Tasks drankommen. Aus dem gleichen Grund kann auch der 
Scheduler präziser arbeiten, was Zeiten angeht. Im RTOS von Esperessif 
hingegen hängt die Genauigkeit davon ab, wie häufig oder selten andere 
Task yielden.

Beim ESP32 hat Espressif das Verhalten des FreeRTOS geändert, dessen SDK 
arbeitet nun unterbrechend.

: Bearbeitet durch User
von baer (Gast)


Lesenswert?

nur die Frage vergessen :D :D

ich erreich den esp zwar sauber über die ip, aber weder über
http://mydnsname/ noch über http://mydnsname.local/

<- ersteres hatte ich schon mal in funktionstüchtig

von baer (Gast)


Lesenswert?

@Axel Schwenke: das Problem ist gelöst :)

aber ich tu mir gerade schwer den DNS zu füttern

von Stefan F. (Gast)


Lesenswert?

Ich glaube, Windows 10 unterstützt mDNS noch nicht.
https://www.ctrl.blog/entry/windows-mdns-dnssd

von Hax (Gast)


Lesenswert?


von baer (Gast)


Lesenswert?

@Stefan Us (stefanus)

naja, das ging sowohl unter Android, alsauch Windows 10 ... leider nur 
mal kurz <- dann hatte ich das obengenannte IP-Problem, anschließend hat 
es nicht mehr funktioniert!

@Hax (Gast)

nun, ich wollte nichts installieren, weil es ja nicht bei mir (als 
Entwickler) gehen soll, sondern überall.
> das Original habe ich getestet :/

aber gut, ich schaue weiter!
Falls jemand noch ne andere Idee...

von Stefan F. (Gast)


Lesenswert?

Namensauflösung war unter Windows schon immer problematisch. Ich würde 
da gar nicht weiter rumfummeln sondern einfach IP Adressen verwenden.

von baer (Gast)


Lesenswert?

> sondern einfach IP Adressen verwenden

einfach ist eben so eine sache... da diese vom DHCP zugewiesen wird, 
kenn ich die nicht. Und ich kann nicht von jeden DAU erwarten, beim DHCP 
zu erfragen, WIE die IP lautet :/

von baer (Gast)


Lesenswert?

PS. Windows muss das nicht können... Android reicht mir :)

von Stefan F. (Gast)


Lesenswert?

> da diese vom DHCP zugewiesen wird, kenne ich die nicht.

Du kannst den DHCP Server aber zumindest anweisen, in Zukunft immer die 
selbe Adresse zuzuweisen. Und dann schreibt man sie einmal auf und gibt 
sie allen bekannt.

Beitrag #5206639 wurde vom Autor gelöscht.
von Stefan F. (Gast)


Lesenswert?

> da diese vom DHCP zugewiesen wird, kenne ich die nicht.

Du kannst den DHCP Server aber zumindest anweisen, in Zukunft immer die 
selbe Adresse zuzuweisen. Und dann schreibt man sie einmal auf und gibt 
sie allen bekannt.

> Windows muss das nicht können... Android reicht mir :)

Android unterstützt mDNS nicht. Aber es gibt mehrere Libraries, die du 
in deine eigenen Apps einbinden kannst.

von baer (Gast)


Lesenswert?

@Stefan Us (stefanus)

falsch verstanden... dann kenn ICH die IP ja!

Wenn ich aber das Tool an Kunden herausgebe und ein Kunde hat nen 
Speedport mit 1 PC und das ESP bekommt die IP 192.168.0.12

und ein anderer hat ne Fritzbox mit vielen PC bekommt die IP 
192.168.178.71

... <- kurzum, je nach Netzwerk gibt es hier nahezu unendlich 
Möglichkeiten


Zwar soll die App auch eine suche bekommen, aber deutlich Komfortabler 
wäre natürlich nicht den kompletten Adressraum durchsuchen zu müssen :)

von Stefan F. (Gast)


Lesenswert?

Was nicht geht, geht halt nicht. Andere Apps suchen auch, zum Beispiel 
so ziemlich alle Druckertreiber.

von (prx) A. K. (prx)


Lesenswert?

Stefan U. schrieb:
> Du kannst den DHCP Server aber zumindest anweisen, in Zukunft immer die
> selbe Adresse zuzuweisen. Und dann schreibt man sie einmal auf und gibt
> sie allen bekannt.

Und sind damit auch im DNS unter dem im Router pflegbaren Namen bekannt.

von Bernd (Gast)


Lesenswert?

Laut Wikipedia kann Windows 10 mDNS nur für Drucker:

"mDNS has also been implemented in Windows 10, but its use is limited to 
discovering networked printers."

https://en.m.wikipedia.org/wiki/Multicast_DNS

von yesitsme (Gast)


Lesenswert?

baer schrieb:
> Wenn ich aber das Tool an Kunden herausgebe und ein Kunde hat nen
> Speedport mit 1 PC und das ESP bekommt die IP 192.168.0.12

Hast du schon eine Lösung dafür, das jedes WLAN sein eigenes 
SSID/Passwort hat?

Ansonsten gibt es in der Fritzbox eine Einstellmöglichkeit, damit 
WLAN-Geräte untereinander nicht kommunizieren dürfen. (Client isolation 
oder so ähnlich) Ist das vielleicht aktiv?

Außerdem kannst du, wenn die lokale Suche erfolglos ist, immer noch über 
Bande spielen. Also ein Server im Internet auf dem sich Tool und App 
anmelden und kommunizieren können.

von baer (Gast)


Lesenswert?

@yesitsme (Gast):

also wegen der unterschiedlichen SSID habe ich eine Lösung.

das ESP versucht sich mit dem WLAN zu verbinden, wird nach n Sekunden 
kein WLAN gefunden, baut er sich selbst als offener AP auf... dort kann 
man dann SSID und Passwort eingeben...

Ich habe jetzt in der Android-App spaßeshalber mal einen kompletten 
Netzwerkscan gemacht, d.h. ich hol mit die Netzmaske und die IP, finde 
den SUB-Netzwerkadressenraum raus und Prüfe ALLE möglichen IPs...
=> das Interessante dabei ist, dass ich das nahezu "GLEICHZEITIG" für 
alle IPs (getestet mit bis zu 1000 IPs) machen kann und ein 
"normaldurchschnittliches" Android 7 Smartphone nicht ins schwitzen 
kommt (ebenso ist das Netzwerk an sich relativ entspannt geblieben).
Nach Spätestens 20 Sekunden habe die gesuchten IPs :)

daher alle Probleme gelöst <- sch*** auf DNS

von Stefan F. (Gast)


Lesenswert?

> das ESP versucht sich mit dem WLAN zu verbinden, wird nach n Sekunden
> kein WLAN gefunden, baut er sich selbst als offener AP auf... dort kann
> man dann SSID und Passwort eingeben...

Mach Dir Gedanken, wie sich dieses Konstrukt nach einem Stromausfall 
verhält.

Ich habe hier einen alternativen Ansatz der Dir eventuell auch gefällt: 
http://stefanfrings.de/esp8266/index.html#wificonfigservice

> Nach Spätestens 20 Sekunden habe die gesuchten IPs

Sicher, ist kein Wunder. Wie gesagt kenne ich das von Druckertreibern.

von baer (Gast)


Lesenswert?

> Mach Dir Gedanken

^^ das habe ich doch

wie sich dieses Konstrukt nach einem Stromausfall
verhält

sowas wird es nicht geben (Stichwort USV), und falls doch gibt es andere 
Probleme!

> ne, der Ansatz gefällt mir nicht... da ist meine Lösung deutlich komfortabler :) 
und keine Angst, der Sicherheitsaspekt ist bei meinem Tool auch gedeckt... <- denn 
auf die Steuerungsfunktionen darf NUR meine Software zugreifen. Den WLAN Zugang 
könnte mit etwas Geschick jeder ändern <- juckt mich aber nicht!

von Seppel (Gast)


Lesenswert?

Hallo,

kann an der Lease-Time liegen, ist die hoch führt das auch bei PC's 
manchmal zu Problemen.

Grüße

Seppel

von Marc H. (marchorby)


Lesenswert?

baer schrieb:
> sowas wird es nicht geben (Stichwort USV), und falls doch gibt es andere
> Probleme!

lol, es wir gar nie nicht kein Stromausfall geben ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.