mikrocontroller.net

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


Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  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

Autor: yesitsme (Gast)
Datum:

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

Autor: Marc Horby (marchorby)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: mac (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hax (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Axel Schwenke (a-za-z0-9)
Datum:

Bewertung
-2 lesenswert
nicht 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.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    delay(100);
    WiFi.begin(ssid, key);

    for (cnt = 0; cnt < 30; cnt++)                                          // check 15 seconds if connected
    {
        if (WiFi.status() == WL_CONNECTED)
        {
            connected = true;
            break;
        }

        delay(500);
    }

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.

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  Serial.print("Connect to:");
  Serial.println( ssid );

  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(1000);

  WiFi.begin(ssid, pass);
  int timeout = 20000; // => 20 Sekunden
  bool wait = true;
  long connectStart = millis();
  long connTest = millis();

  while ( wait ) {
    
    if( millis() > connTest + 1000 ) {
      connTest = millis();
      wait = WiFi.status() != WL_CONNECTED;
      Serial.print(".");
    }

    if( millis() > connectStart + timeout ) {
      wait = false;
      Serial.println("timeout");
    }

    delay(100);

  }

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 ...

Autor: Stefan Us (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Stefan Us (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Axel Schwenke (a-za-z0-9)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Axel Schwenke: das Problem ist gelöst :)

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

Autor: Stefan Us (stefanus)
Datum:

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

Autor: Hax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan Us (stefanus)
Datum:

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

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :/

Autor: baer (Gast)
Datum:

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

Autor: Stefan Us (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.
Autor: Stefan Us (stefanus)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Stefan Us (stefanus)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yesitsme (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Us (stefanus)
Datum:

Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Seppel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Grüße

Seppel

Autor: Marc Horby (marchorby)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.