Mqtt Lastwilltopic

Hallo liebe Arduino-Nutzer,

ich stehe absolut aufn Schlauch und finde den Fehler nicht.

Es geht um folgendes:

client.enableLastWillMessage("LED-232/esp/lwt", "0", true);

funktioniert einwandfrei.
aber

lwt= String("LED-232/esp/lwt");
client.enableLastWillMessage(lwt.c_str(), "0", true);

funktioniert nicht. Der Code erzeugt keinen Fehler aber der Server lehnt die Verbindung einfach ab.

Ich habe auch einmal folgendes versucht

String lastwilltopic = String("LED-232/esp/lwt");
char buffer[lastwilltopic.length()+1];
lastwilltopic.toCharArray(buffer, lastwilltopic.length()+1);

client.enableLastWillMessage(buffer, "0", true);

gleiches Ergebnis.

Aber wo ist denn nun der Unterschied zwischen

"LED-232/esp/lwt";

und

String("LED-232/esp/lwt").c_str();

Die einzige Meldung vom Server ist folgende
WillTopic (2D85FE3F) from 192.168.10.119:62322 contains non UTF-8 characters

Ich wĂ€re ĂŒber einen Tipp sehr dankbar.

Mfg
Paul

Abgesehen davon, dass ich den Fehler auch nicht sehe (weil die Definition von lwt fehlt ?) , ist die Frage, was das mit dem String Objekt soll?
Eine sinnvolle Variable wÀre doch eher vom Typ const char* oder ein const char []

Was ist denn mit

const char lwt[] = "LED-232/esp/lwt";
client.enableLastWillMessage(lwt, "0", true);

"contains non UTF-8 characters" deutet fĂŒr mich darauf hin, dass die Variable nicht mehr existiert, wenn sie gebraucht wird?

Danke fĂŒr deine Antwort.

Die Fehlermeldung kommt vom Mqtt-Server nicht vom ESP.

lwt= lastwilltopic

Das Topic wird dynamisch erzeugt, daher ist eine feste Zuweisung der Variable nicht sinnvoll.
Das Ergebnis soll nachher so aussehen: "LED-" + CHIP-ID + "/esp/lwt"
Wobei die CHIP-ID natĂŒrlich bei jeden uC anders ist.

Hab eben aber mal deine Variante getestet.

Funktioniert auch nicht.

const char *lwt = "LED-232/esp/lwt";

Das funktioniert wiederum.

Wenn die CHIP-ID immer die gleiche Anzahl Zeichen hat, gibt's erst recht keinen Grund fĂŒr ein ( bzw. mehrere, wegen deinem + Operator ) String-Objekte. Wenn nicht, gibt's immer noch sprintf.

Aber String::c_str() liefert eine Adresse zurĂŒck, die nur so lange gĂŒltig ist, wie das String Objekt lebt.
Mach mal (nur zum Test, nicht als Lösung) static String lwt , oder global.

Schon klar. Schickst ihm eben nicht das, was du denkst.

1 Like

Okay, ich glaube das war der Fehler.

Ich bilde diese Variable in einer Funktion die einmal aufgerufen wird sobald WLAN verbunden ist.

wenn ich static vorsetze funktioniert es!!!
Aber um das jetzt mal richtig sauber zu machen, muss ich deine Idee verstehen.

String ID= String("LED-") + String(ESP.getFlashChipId());
String lwt= ID+String("/esp/lwt");

So sieht das ja aktuell aus. Viele Strings...
ESP.getFlashChipId gibt ein uint32_t zurĂŒck, also JA die ID hat immer die gleiche LĂ€nge.

Wie mache ich das jetzt sauber ?

Vielen Dank fĂŒr dein richtigen Hinweis .

constexpr byte BUFFER_SIZE {21};
[...]
char buffer[BUFFER_SIZE] {};
[...]
snprintf(buffer,BUFFER_SIZE,"LED-%08X/esp/lwt",ESP.getFlashChipId());
2 Likes

Wobei
.enableLastWillMessage
wohl nur eine Adresse weiterreicht, die "spÀter" noch gebraucht wird. Wenn buffer nur lokal existiert, hast du mit @Kai-R s Stringfreiem Vorschlag dasselbe Problem.

So hÀsslich es ist, wÀre static char buffer[21]; doch eine Lösung.

Oder buffer einfach global deklarieren. Damit funktioniert es dann auch.

Klar geht global auch. Ist halt noch hĂ€ĂŸlicher.
Das Problem ist ja, dass der Inhalt von buffer lÀnger gebraucht wird als eigentlich nötig.
Dass buffer dann öffentlich zugÀnglich und Ànderbar ist, ist eigentlich grade nicht gewollt.

Aber das ist eher eine theoretiscche Sache. Hauptsache es geht. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.