INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
MQTT Topic abbonieren?
10.01.2021, 13:21
Beitrag #1
MQTT Topic abbonieren?
Moin,

Ich könne mal wieder ein, zwei Denkanstöße bezüglich einer MQTT Verbindung mit einem ESP32 gebrauchen...

Ziel: den Inhalt eines abbonierten Topics (subscribe) auf den seriellen Monitor ausgeben.

Da ich MQTT schon am laufen habe (ESP32 sendet BME280 Sensordaten),dachte ich das das ja nicht soo kompliziert sein könne, habe ich mir dazu noch ein, zwei Tutorial angesehen und los...

IMO ist das Sketch übersichtlich (selbst für mich!Wink):

WIFI + MQTT Verbindung -> laut serieller Ausgabe, funktioniert das
Im "callback Abschnitt" ist der eingehende Topic und die serielel Ausgabe definiert
und
Code:
client.subscribe("esp/test");

abboniert das Topic

Eingefügt habe ich noch ein
Code:
client.publish...

um das Connecten der MQTT Verbindung an zu zeigen und im "loop Bereich" alle 5 Sekunden einen MQTT Publish um zu sehen ob die Verbindung noch steht.

Zum Testen wird alle 6 Sekunden auf dem abbonierten Topic "esp/test" immer die gleiche Zahl als "number" gesendet (mit einem String "testtest" habe ich das auch probiert).

Mit MQTT.fx kontrollier ich ob die Topics auch senden.

esp/test - sendet wie geplant
esp/verbindung - immer beim connecten
esp/status - manchmal alle 5 Sekunden, manchmal nicht. Nehm ich "millis()" raus, sendet er manchmal zwei, dreihundert Nachrichten, verstummt dann oder sendet nach einem reboot auch gar nicht mehr. Alles unregelmäßig.

Wie gesagt, alles nur nach reboot mit ungeändertem Sketch! Kann natürlich auch sein das sicher ESP32 oder MQTT.fx an der Masse der Nachrichten verschluckt...

Aber das wichtigste, die Ausgabe auf den seriellen Monitor hat nur ein einziges mal funktioniert. Auch nur nach einem Reboot, ohne das das Sketch geändert wurde.

Ist die Reihenfolge der Aufrufe in dem Sketch nicht richtig oder was habe ich falsch gemacht oder anders herum, wie könnte es funktionieren?

Danke und nen schönen Sonntag noch...

Ach ja, weiß jeamand was diese alte Datumsausgabe auf dem Monitor (der ESP32 ist neu!) bedeutet?

[Bild: 9PkOVtM.png]

Code:
// Beispiel 1 :  https://techtutorialsx.com/2017/04/24/esp32-subscribing-to-mqtt-topic/
// Beispiel 2 :  https://www.pubnub.com/blog/pubsub-nodemcu-32s-esp32-mqtt-pubnub-arduino-sdk/

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "xxx";
const char* password =  "xxx";
const char* mqttServer = "192.168.xxx.xx";
const int mqttPort = 1883;
const char* mqttUser = "xxx";
const char* mqttPassword = "xxx";


WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg_verbindung = 0;    // <-- eingefuegt Intervall an MQTT Broker

void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message arrived in topic: ");
  Serial.println(topic);

  Serial.print("Message:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }

  Serial.println();
  Serial.println("-----------------------");

}

void setup() {

  Serial.begin(115200);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");

  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback);

  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");

    if (client.connect("ESP32Client", mqttUser, mqttPassword )) {

      Serial.println("connected");  
      client.publish("esp/verbindung","no_drei_ist_verbunden"); // Connect-Meldung an MQTT Broker    // <-- zur kontrolle eingefuegt

    } else {

      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);

    }
  }

  client.subscribe("esp/test");

}

void loop() {

        long now_verbind = millis();                    // <-- eingefuegt Intervall an MQTT Broker
        if (now_verbind - lastMsg_verbindung > 5000) {  // <-- eingefuegt Intervall an MQTT Broker  
        lastMsg_verbindung = now_verbind;               // <-- eingefuegt Intervall an MQTT Broker
        client.publish("esp/status","no_drei_lebt");    // <-- eingefuegt Intervall an MQTT Broker      
        }                                               // <-- eingefuegt Intervall an MQTT Broker
        //client.publish("esp/status","no_drei_lebt");
      
  
  client.loop();
}

[/php]

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2021, 14:14 (Dieser Beitrag wurde zuletzt bearbeitet: 10.01.2021 14:15 von nbk83.)
Beitrag #2
RE: MQTT Topic abbonieren?
Moin Steinspiel,
Ich würde an Deiner Stelle (wie Du es auch in Deinen anderen Sketchen gemacht hast) erstmal eine Reconnect-Funktion einbauen. Jetzt hast Du die MQTT-Verbindung im Setup drin. Dann sehen wir weiter.
Gruß Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2021, 20:03
Beitrag #3
RE: MQTT Topic abbonieren?
Nabend Jan,

(10.01.2021 14:14)nbk83 schrieb:  Ich würde an Deiner Stelle (wie Du es auch in Deinen anderen Sketchen gemacht hast) erstmal eine Reconnect-Funktion einbauen. Jetzt hast Du die MQTT-Verbindung im Setup drin. Dann sehen wir weiter.

Ich glaube ich weiß worauf Du hinaus willst. Den Reconnect habe ich eingefügt (um sicher zu gehen das ich das richtig gemacht habe, hänge ich den Sketch nach einmal an) und dadurch gesehen das er auch sofort ausgeführt wird. Wenn ich das richtig sehe bricht die Verbindung zum MQTT Broker sofort wieder ab, da brauch ich mich nicht Wundern das nichts ankommt. Schau mal:

[Bild: tx3W0Bi.png]

Andererseits, der MQTT Server läuft, die BME280 Daten des anderen ESP32 werden hier anstandslos übertragen!

Habe ich nur den Code falsch?

Code:
// mqtt_subscribe.ino
// Beispiel 1 :  https://techtutorialsx.com/2017/04/24/esp32-subscribing-to-mqtt-topic/
// Beispiel 2 :  https://www.pubnub.com/blog/pubsub-nodemcu-32s-esp32-mqtt-pubnub-arduino-sdk/
//

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "xxx";
const char* password =  "xxx";
const char* mqttServer = "192.168.xxx.xx";
const int mqttPort = 1883;
const char* mqttUser = "xxx";
const char* mqttPassword = "xxx";


WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg_verbindung = 0;    // <-- eingefuegt Intervall an MQTT Broker

void callback(char* topic, byte* payload, unsigned int length) {

  Serial.print("Message arrived in topic: ");
  Serial.println(topic);

  Serial.print("Message:");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }

  Serial.println();
  Serial.println("-----------------------");

}

//----------------MQTT bei Bedarf erneute Verbindung Anfang--------------

void reconnect() {
  
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP32Client", mqttUser, mqttPassword)) {
      Serial.println("connected");
      // Subscribe
      client.subscribe("esp32/output");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
  //----------------MQTT bei Bedarf erneute Verbindung Ende--------------

void setup() {

  Serial.begin(115200);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println("Connected to the WiFi network");

  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback);

  while (!client.connected()) {
    Serial.println("Connecting to MQTT...");

    if (client.connect("ESP32Client", mqttUser, mqttPassword )) {

      Serial.println("connected");  
      client.publish("esp/verbindung","no_drei_ist_verbunden"); // Connect-Meldung an MQTT Broker    // <-- zur kontrolle eingefuegt

    } else {

      Serial.print("failed with state ");
      Serial.print(client.state());
      delay(2000);

    }
  }

  client.subscribe("esp/test");

}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();


        long now_verbind = millis();                    // <-- eingefuegt Intervall an MQTT Broker
        if (now_verbind - lastMsg_verbindung > 5000) {  // <-- eingefuegt Intervall an MQTT Broker  
        lastMsg_verbindung = now_verbind;               // <-- eingefuegt Intervall an MQTT Broker
        client.publish("esp/status","no_drei_lebt");    // <-- eingefuegt Intervall an MQTT Broker      
        }                                               // <-- eingefuegt Intervall an MQTT Broker
        //client.publish("esp/status","no_drei_lebt");
      
  

}

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2021, 20:47 (Dieser Beitrag wurde zuletzt bearbeitet: 10.01.2021 20:48 von nbk83.)
Beitrag #4
RE: MQTT Topic abbonieren?
Hmm, jetzt hast Du es (zusätzlich) noch immer im Setup Wink
Des Weiteren könnte es auch sein, dass Dein Broker Dich sofort wieder raus schmeißt, weil Du Dich als gleicher Client ("ESP32Client") wie Dein anderer ESP anmeldest. Versuche mal einen anderen Namen.
Grüße Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2021, 22:38
Beitrag #5
RE: MQTT Topic abbonieren?
Moin Jan,

Vorab: meine Begriffstuzigkeit Huh scheint parallel mit Deiner Geduld zu steigen...Undecided

(10.01.2021 20:47)nbk83 schrieb:  Hmm, jetzt hast Du es (zusätzlich) noch immer im Setup

Ich würde das gerne ganz langsam durchgehen, die Sachen mit MQTT Subscribe habe ich erst mal weggelassen denn das LogIn Sketch bereitet mir von Anfang an Schwierigkeiten die ich gerne Beseitigt hätte:

Bis Zeile 18 ist alles klar, LogIn Parameter ebend, die bei Bedarf abgerufen werden.

Code:
WiFiClient numb3Client;
PubSubClient mqtt3client(numb3Client);

In Verbindung mit den Bibliotheken oben sind das die Namen fürs WIFI LogIn und für das MQTT LogIn.


Code:
void reconnect() {
  
  // Loop until we're reconnected
  while (!mqtt3client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqtt3client.connect("ESP323mqttClient", mqttUser, mqttPassword)) {
      Serial.println("connected");

    }
    else {
      Serial.print("failed, rc=");
      Serial.print(mqtt3client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

Ist eine "Unterfunktion" außerhalb des void setup() und wird bei Bedarf aufgerufen. Hier sorgt sie für die das erneute MQTT LogIN bei Verbindungsverlust.


Im void setup()

Code:
//-------WIFI-LOGIN-ANFANG---------------------------------------------------        
        WiFi.begin(ssid, ssidkey);
        while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        
        Serial.println("-----------------------------");        
        Serial.println("Verbindung mit WIFI herstellen...");
        }
        Serial.println("-----------------------------");
        Serial.println("Verbunden als numb_3_Client");
        Serial.println("mit Router:");
        Serial.println(WiFi.localIP());
        Serial.println("-----------------------------");
//-------WIFI-LOGIN-ENDE---------------------------------------------------

Die WIFI Verbindung wird hergestellt, falls das nicht klappt wird das alle halbe Sekunde wiederholt

Code:
//-------MQTT-LOGIN-ANFANG---------------------------------------------------
        mqtt3client.setServer(mqttServer, mqttPort);
        while (!mqtt3client.connected()) {

Der oben definierte MQTT Client verbindet sich mit Server auf passenden Port

Code:
Serial.println("Verbindung mit MQTT herstellen...");
        if (mqtt3client.connect("ESP323mqttClient", mqttUser, mqttPassword )) {    
        Serial.println("-----------------------------");
        Serial.println("Verbunden mit mosquittopi");
        }
        else
        {
        Serial.print("Verbindung mit MQTT gescheitert");
        Serial.println("");
        Serial.print(mqtt3client.state());
        delay(2000);
        }

Ist die Verbindung hergestellt werden Name + PWD übergeben udn verbunden. Falls nicht, wird das alle 2 Sekunden erneut versucht.
Warte, ist das der Reconnect von oben, also doppelt... Richtig?

Diese Sachen gehören ins void setup() bis auf vieleicht das doppelte Reconnect?

ganzer Code...

Code:
/*
*  ESP32 Mosquitto Verbindung
*/

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "xxx"; // WLAN-Name
const char* ssidkey = "xxx"; // WLAN-Schlüssel
const char* mqttServer = "192.168.xxx.xx";
const int mqttPort = 1883;
const char* mqttUser = "xxx";
const char* mqttPassword = "xxx";




WiFiClient numb3Client;
PubSubClient mqtt3client(numb3Client);

//----------------MQTT bei Bedarf erneute Verbindung Anfang--------------

void reconnect() {
  
  // Loop until we're reconnected
  while (!mqtt3client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqtt3client.connect("ESP323mqttClient", mqttUser, mqttPassword)) {
      Serial.println("connected");

    }
    else {
      Serial.print("failed, rc=");
      Serial.print(mqtt3client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
  //----------------MQTT bei Bedarf erneute Verbindung Ende--------------



void setup() {

        Serial.begin(115200);

//-------WIFI-LOGIN-ANFANG---------------------------------------------------        
        WiFi.begin(ssid, ssidkey);
        while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        
        Serial.println("-----------------------------");        
        Serial.println("Verbindung mit WIFI herstellen...");
        }
        Serial.println("-----------------------------");
        Serial.println("Verbunden als numb_3_Client");
        Serial.println("mit Router:");
        Serial.println(WiFi.localIP());
        Serial.println("-----------------------------");
//-------WIFI-LOGIN-ENDE---------------------------------------------------

//-------MQTT-LOGIN-ANFANG---------------------------------------------------
        mqtt3client.setServer(mqttServer, mqttPort);
        while (!mqtt3client.connected()) {
              
        Serial.println("Verbindung mit MQTT herstellen...");
        if (mqtt3client.connect("ESP323mqttClient", mqttUser, mqttPassword )) {    
        Serial.println("-----------------------------");
        Serial.println("Verbunden mit mosquittopi");
        }
        else
        {
        Serial.print("Verbindung mit MQTT gescheitert");
        Serial.println("");
        Serial.print(mqtt3client.state());
        delay(2000);
        }
        }
    
//-------MQTT-LOGIN-ENDE---------------------------------------------------


}
void loop() {
  
}

Danke und nen schönen Wochenstart...

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2021, 23:39
Beitrag #6
RE: MQTT Topic abbonieren?
Moin Steinspiel,
jetzt wäre ein Beamer, Leinwand und Zeigestock schön...
Aber bevor ich das jetzt alles niederschreibe, hier findest Du einen MQTT-Sketch, der das Nötigste enthält (ist aus dem einen Buch, welches ich hier habe). Vielleicht hilft Dir das für das Verständnis des grundsätzlichen Aufbaus.
Darfst aber trotzdem gerne wieder fragen Wink
Grüße Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.01.2021, 23:42 (Dieser Beitrag wurde zuletzt bearbeitet: 10.01.2021 23:43 von nbk83.)
Beitrag #7
RE: MQTT Topic abbonieren?
(10.01.2021 20:47)nbk83 schrieb:  ...
Des Weiteren könnte es auch sein, dass Dein Broker Dich sofort wieder raus schmeißt, weil Du Dich als gleicher Client ("ESP32Client") wie Dein anderer ESP anmeldest. Versuche mal einen anderen Namen.
...
Hat das denn was gebracht? Geändert hast Du es ja in Deinem letzten Beitrag
Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2021, 19:44
Beitrag #8
RE: MQTT Topic abbonieren?
Moin,
(10.01.2021 23:39)nbk83 schrieb:  jetzt wäre ein Beamer, Leinwand und Zeigestock schön...

Präsenzunterricht fällt leider flach im Moment... ;-(

Zitat: hier findest Du einen MQTT-Sketch, der das Nötigste enthält

Heut und morgen ist etwas knapp, deshalb habe ich nur kurz drauf geschaut (es sieht auf jeden Fall sehr übersichtlich aus). Mittwoch geh ich es an.

Danke für den Link,

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 13 972 10.01.2021 14:18
Letzter Beitrag: nbk83
  433MHz-WiFi-MQTT-Sender nbk83 25 1.129 04.01.2021 16:35
Letzter Beitrag: nbk83
  Wo MQTT LogIn Daten einfügen? Steinspiel 10 671 28.12.2020 14:32
Letzter Beitrag: Tommy56
  Sensorausgabe mit MQTT publishen ? Steinspiel 14 929 16.12.2020 13:06
Letzter Beitrag: biologist
  Hilfe bei async-mqtt-client für ESP32 amshh 7 571 12.11.2020 09:19
Letzter Beitrag: amithlon
  DHT11 Daten via MQTT an Raspi senden Hanibal_Smith 5 501 10.11.2020 16:24
Letzter Beitrag: biologist
  wert an client schicken während Deepsleep mqtt & ibroker stevensen 13 1.013 06.11.2020 21:07
Letzter Beitrag: nbk83
  MQTT Connect schleife looped crazysky 1 411 29.10.2020 15:21
Letzter Beitrag: crazysky
  ESP8266 - MQTT Probleme mit SSL decrypt tenor 8 1.241 22.09.2020 19:33
Letzter Beitrag: tenor
  ESP8266+PubSubClient und MQTT/ioBroker Arduino4Fun 10 7.886 08.09.2020 10:22
Letzter Beitrag: biologist

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste