Problem sending long MQTT payloads with Adafruit MQTT library

@Stefan reported some problems when sending MQTT payloads >= 98 bytes.

Hallo Andreas,

hat wunderbar geklappt - erste Testdaten sind auch schon nach Grafana geflossen.

Bin gerade am experimentieren und scheine an Limitierungen bzgl. der Länge des “payloads” zu kommen.

Bei einer payload Länge über > 98 Zeichen haut mir der ESP eine Exception (9) um die Ohren und verabschiedet sich mit einem Stack Trace.

Folgender String funktioniert:
Payload:
{“temps1”:2,“temps2”:-290,“weight1”:0.02,“weight2”:5,“wxd_temp”:6,“wxd_humd”:7,“battery12345”:7}

Length:97

Folgender String läßt den ESP Dumpen

Payload:
{“temps1”:2,“temps2”:-290,“weight1”:0.02,“weight2”:5,“wxd_temp”:6,“wxd_humd”:7,“battery123456”:7}

Length:98

Hab irgendwo im Hinterkopf das im Zusammenspiel ESP8266 & MQTT eine Beschränkung bzgl. der Länge der MQ Nachricht gibt.

Hast Du hier ne Idee?

Herzlichen Dank vorab
Stefan

Hallo Andreas,

ich glaube ich bin der Ursache etwas näher gekommen

In der Library Adafruit_MQTT.h habe ich folgenden Eintrag gefunden:

// Largest full packet we're able to send.
// Need to be able to store at least ~90 chars for a connect packet with full
// 23 char client ID.
#define MAXBUFFERSIZE (150)

Das würde mit meiner Beobachtung übereinstimmen.

Zusätzlich habe ich noch den folgenden Eintrag gefunden

https://github.com/adafruit/Adafruit_MQTT_Library/issues/62

In den Kommentaren ist beschrieben, das eine Erhöhung der MAXBUFFERSIZE leider nicht funktioniert.

Noch schöne Pfingsten!

Stefan

Hi Stefan,

das passt auch zum Thema:

Hast Du mal selbst probiert, die MAXBUFFERSIZE zu erhöhen? Vielleicht klappt es ja dann, auch wenn in der GitHub Issue Gegenteiliges geschrieben steht.

Viele Grüße,
Andreas.

Hi Andreas,

ich werde die nächsten Tage ausprobieren die BUFFERSIZE zu erhöhen und dann Feedback geben.
Was mich positiv stimmt das es funktionieren könnte, ist der folgende Kommentar zu dem oben aufgeführten Issue:

No and maybe. Some of the packets are created with the assumption that they will be less than 128 bytes. In my case I was sending a CONNECT packet that exceeded that length. Though the algorithm for setting the packet length field is implemented for the PUBLISH packet correctly it assumes a CONNECT packet will always be less than 128 bytes and short cuts the length calculation. If only your PUBLISH packets are longer then you should be okay.

Stefan

Ein kurzes Update:

Eine Verdoppelung des Wertes für MAXBUFFER von 150 auf 300 war auf den ersten Blick erfolgreich und wurde mit einem freundlichen “MQTT publish succeeded” quittiert.

Allerdings scheinen die Werte nicht in Grafana anzukommen und nach ungefähr 7-10 Erfolgsmeldungen verabschiedet sich der ESP wieder mit einem Dump.

Hi Stefan,

Wunderbar!

Schade! Arbeitest Du bereits mit Authentifizierung oder ohne? Falls mit, versuche es doch nocheinmal ohne Authentifizierung über den “testdrive” Kanal - nur mal so zum gegentesten. Vielleicht hilft Dir auch die Fehlersignalisierung weiter. Komm ansonsten natürlich gerne nochmal auf uns zurück. Viel Erfolg einstweilen!

Kannst Du den mal posten? Vielleicht hat beides nichts miteinander zu tun.

Benutzt Du eine unserer Firmwares? Die node-wifi-mqtt.ino funktioniert bei @Thias und @gtuveri bereits ganz gut, soweit wir wissen.

Viele Grüße,
Andreas.

Hallo Andreas,

ein kurzes Update:

Mit Authentifizierung

Und Tatsache ohne Authentifizierung klappt es dann auch mit längeren Messages.

Das Thema mit dem Dumpen tritt bei meinen weiteren Tests nicht mehr auf. Insofern erstmal nichts zum posten.

Für meine MQTT Tests probiere ich zumindest was den MQTT Teil angeht die note-wifi-matt.ino Firmware.

Was die Fehlersignalisierung angeht, bin ich heute morgen leider nicht soweit gekommen, mir den Error Kanal zu “subskribieren” bzw. ich habe keine Meldung bekommen- aber das liegt vermutlich eher an meinen MQTT Fähigkeiten und für den Test via CLI hat die Zeit noch nicht gereicht.

Viele Grüße
Stefan

Hi Stefan,

bzgl. mit vs. ohne Authentifizierung ging es mir erst einmal darum, zu schauen, ob überhaupt Werte im Grafana ankommen, noch gar nicht unbedingt um die längeren Nachrichten. Letzteres Problem hast Du ja vermutlich bereits über die Erhöhung der Buffersize lösen können, stimmts?

Kann es also sein, dass Deine Credentials nicht korrekt sind bzw. wir sie nicht korrekt am Server eingestellt haben? Falls hier ein Problem vorliegt, bekommst Du übrigens keine Nachrichten über die Fehlersignalisierung: Hier muss einfach alles sitzen. Falls also “ohne Auth” geht, “mit Auth” aber nicht, lass uns bitte nocheinmal die Credentials abgleichen, ob hier alles zusammenpasst.

Sicherheitshalber an dieser Stelle schoneinmal die Frage: Du schickst die Daten korrekt mit der Owner-ID “c3664391-ac4c-41b3-97aa-66f63127471b”, ja?

Herzliche Grüße,
Andreas.

Hallo Andreas,

die Übertragung mit Authentifizierung klappt generell.

In meinem Dashboard kommen die Werte für %Ladung, Spannung & ADC Level per MQTT mit Authentifizierung.

Hier arbeite ich mit der UID die auf 71b endet.

Bei den Tests auf Testdrive habe ich folgenden MQTT_TOPIC & ID verwendet:

MQTT_TOPIC “hiveeyes/testdrive/spielwiese/node-2/data.json”
MQTT_CLIENT_ID “testdrive”

Der Versuch die Fehlersignalisierung anzuzapfen habe ich allerdings mit der MQ_CLIENT_ID “testdrive” vorgenommen.

Ich werde versuchen noch mal ein wenig systematisch zu testen und die Ergebnisse zusammenfassen.
Grob vorab:
kurze MQTT Nachrichten mit Auth funktionieren
längere MQTT Nachrichten mit Auth kommen nicht am System an, obwohl mir der publish mit einem “MQTT publish succeeded”) quittiert wird.

Einstweilen vielen Dank & Grüße
Stefan

Fällt mir dabei gerade auf:

  • in nur zwei Tagen hat Deine Installation den Akku leergesogen - was ist das für eine Chemie, welche Kapazität hast dieser und wie sieht der Strombedarf Deiner Schaltung aus?

  • entgültig alle (laut Graph) ist der Akku vor etwa einer Stunde (12.6., ca 21 Uhr) geworden, mit 2,34V - sollte das ein 1s-LiPolymer-System sein, ist das als Entladeschlußspannung deutlich zu gering

Ah ok, na wunderbar!

Das ist wirklich seltsam. Vielleicht willst Du MAXBUFFER kurzerhand testweise noch weiter erhöhen?

Sorry, dass ich hier gerade keine anderen Ideen habe, die Dir weiterhelfen könnten. Ich bin jetzt auch ein paar Tage nicht im Lande, wünsche Dir aber viel Erfolg bei den weiteren Nachforschungen.

Hallo Andreas,

gestern Abend hab ich nochmal die Zeit und Ruhe gefunden um ein paar Varianten zu testen.

und genau darin liegt die Lösung - wobei mir aufgefallen ist das sobald ich die Authentifizierung benutzte die benötigte Größe des MAXBUFFERSIZE steigt.
Aber das kann auch einfach schon daran liegen wenn ich mit Authentifizierung arbeite die beiden Werte für MQTT_TOPIC & MQTT_ID länger sind.

Fazit: die Variable MAXBUFFERSIZE (150) in Adafruit_MQTT.h erhöhen brachte für mich die Lösung.

Nochmal herzlichen Dank für die Mühe.

Viele Grüße
Stefan

5 posts were merged into an existing topic: Choosing the right LiPo charger equipment

Der Ordnung halber auch noch der Nachtrag auf welchen Wert ich MAXBUFFERSIZE gesetzt habe:

#define MAXBUFFERSIZE (1024)