Forum: Mikrocontroller und Digitale Elektronik mqtt ständiger abbruch - esp8266


von Martin (Gast)


Lesenswert?

Hallo allerseits,

ich habe Probleme mit der MQTT Verbindung eines WemosD1mini (ESP8266).
Beim booten stellt dieser immer sofort erfolgreich eine Verbindung zum 
Wifi und MQTT auf, doch die MQTT Vebindung bricht regelmäßig alle paar 
minuten ab.
Ich habe einen MQTT-Reconnect eingerichtet, der diese Situationen 
erkennt und eigentlich für einen Reconnect sorgen soll, damit nicht bei 
jedem MQTT verbindungsabbruch ein Neustart ausgeführt wird.
Allerdings ist es dem Wemos noch nie gelungen, in den 90 Sekunden, in 
denen der Reconnect läuft, auch tatsächlich die Verbindung wieder 
aufzubauen.
Der Abbruch der Verbindung muss gleichzeitig vom Wemos selbst kommen, da 
alle anderen Geräte eine konstante Verbindung beibehalten (die 
Entfernung zum Router beträgt ca. 2Meter).

Besonders fällt mir dabei auf, dass hingegen ein NodeMCU (welcher auch 
einen ESP8266 nutzt), keine Probleme hat den Reconnect auszuführen.
Ich musste ihn für Tests sogar zwingen, die MQTT-Verbindung zu 
unterbrechen (habe den Broker kurz vom Strom genommen). Die 
Reconnect-Schleife hatte aber sofort erfolg!

Hat vielleicht jemand von euch Erfahrungen/Ideen, wieso der Wemos 
ständig selbstverschuldete MQTT-Abbrüche hat (die WLAN verbindung behält 
er stattdessen konstant) und warum der Reconnect einfach nicht klappt?
Der exakt gleiche Code beim ja an sich recht gleichen NodeMCU läuft ja 
perfekt und es kommt sogar garnicht zu regelmäßigen abbrüchen..

Die Reconnect-Schleife:
1
void mqttReconnect() {
2
  if (!MQTTclient.connected()) {
3
    Serial.print("\nAttempting to connect to MQTT broker at ");
4
    Serial.print(mqtt_server);
5
6
    MQTTclient.connect(deviceID);
7
    unsigned long currentF = millis();
8
    unsigned long previousF = currentF;
9
    while (!MQTTclient.connected() && currentF - previousF <= 90000) {   //90 sekunden = 90000
10
      delay(1000);
11
      Serial.print("-");
12
      currentF = millis();
13
    }
14
    if (!MQTTclient.connected()) {
15
    Serial.write("\nMQTT-Reconnect fehlgeschlagen. Automatischer Neustart in 3 sek!\n");
16
    delay(3000);
17
    ESP.restart();
18
    }
19
    else {
20
      Serial.println("\nConnected to MQTT broker\n");
21
    }
22
  }
23
}

von MQTT (Gast)


Lesenswert?

Schau mal ins log vom MQTT Broker, ich hatte mal das Problem das sich 2 
Geräte mit der gleichen ID anmelden wollten, woraufhin Mosquitto eines 
der beiden  Geräte Disconnected hat.

von Jürgen H. (nobody)


Lesenswert?

Hallo,

könnte das Problem nicht dein blockierender Connect sein?

Du bleibst hier 90s drinnen, aber dein Wifi Handler wird nicht mehr 
bedient.

Probier einen Connect und dann lass die anderen wieder arbeiten.
Danach wieder einen Connect. Wenn das dann immer nicht fehlschlägt, dann 
reset.

von Martin (Gast)


Lesenswert?

MQTT schrieb:
> 2 Geräte mit der gleichen ID anmelden wollten, woraufhin Mosquitto eines
> der beiden  Geräte Disconnected hat.

Ich bin soweit gegangen, dass der Wemos das einzige Gerät war, dass 
überhaupt eine MQTT-Verbindung aufgebaut hat. Und den Broker habe ich 
auch auf einem neuen Gerät aufgesetzt. Also eigentlich gab es nur diese 
zwei Geräte für eine Verbindung, aber den log schaue ich mir trotzdem 
mal an.


Jürgen H. schrieb:
> könnte das Problem nicht dein blockierender Connect sein?

Was mich dabei halt irritiert, ist, dass der NodeMCU zum Beispiel mit 
dieser Reconnect Variante von mir einen erfolgreichen Reconnect ausführt 
(andere ESP Geräte habe ich leider nicht zur Hand zum weiteren Testen).
Die Funktion scheint also an sich zu funktionieren.

Ich habe auch versucht, den connect in jeder Schleife neu auszuführen 
(wie unten), um eben sicher zu gehen, dass dieser nicht vorher schon 
abbricht und die 90s über garnichts probiert wird, aber auch das hat 
eigentlich garnichts verändert.
1
while (!MQTTclient.connected() && currentF - previousF <= 90000) {   //90 sekunden = 90000
2
      MQTTclient.connect(deviceID);      
3
      delay(1000);
4
      Serial.print("-");
5
      currentF = millis();
6
}

von Martin (Gast)


Lesenswert?

starte ich den Wemos übrigens neu, also reset, währrend dieser 90 
Sekunden, funktioniert beim normalen Start und Setup der MQTT-Connect 
sofort. Es ist also wirklich nur der Reconnect der auch nur beim Wemos 
nicht klappt...

von Jürgen H. (nobody)


Lesenswert?

Das würde ja für meinen Ansatz sprechen.

Für mal in der while noch

   mqttclient.loop();

aus.

Hatte da bei mir auch schon Probleme.
Hab das dann auf 15 Versuche alle 1s umgestellt, und seitdem schnurrt 
das Ding.

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.