MQTT --> Übertragen von großen JSON-Arrays

Moin allerseits,

ich scheitere gerade dabei, einen großen JSON-Array per MQTT zu übertragen:

Wenn ich im Sketch arr_size auf 2 stelle, kommt noch was an, aber ab 3 nicht mehr.

Kann das daran liegen, dass der Broker nur eine bestimmte Anzahl an Zeichen durchlässt?
Oder hab ich im Sketch irgendwo einen Fehler?

Aber die Buffer sollten eigentlich alle korrekt dimensioniert sein.

Habt ihr ne Idee?

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

WiFiClient wifiClient;
PubSubClient client(wifiClient);

static const char mqtt_broker[43]="broker.emqx.io"; // z.B. broker.emqx.io
static const char mqtt_username[25]="emqx"; // z.B. emqx
static const char mqtt_password[8]="public"; // z.B. public
char mqtt_topic[20]="esp32_daniel/";

const char ssid[14] = "MEINE_SSID";
const char password[21] = "MEIN_PASSWORT";

unsigned long connTimer=0;

void setup() {
  Serial.begin(115200);

  // Mit der Welt verbinden
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid, password);
  
  connTimer = millis();
  while (WiFi.status() != WL_CONNECTED && (millis() - connTimer < 5000)) {
    delay(500);
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("Wir sind verbunden...");
  } else {
    Serial.println("Wir sind nicht verbunden");
  }

  // Mit MQTT-Broker verbinden
  client.setServer(mqtt_broker, 1883);

  if (!client.connected()) {
    if (mqtt_reconnect()) {
      Serial.println("MQTT-Verbindung --> hat geklappt!");
    }   
  }
  
  // Laut dem Assistenten auf ArduinoJson.org reichen für den Test-Array unten 
  // 3072, ich hab mal auf 4000 aufgerundet ;-)
  DynamicJsonDocument mqtt_json(4000);

  uint8_t arr_size = 2; // Bei arr_size=2 funktonierts noch --> MQTT-Message kommt an, bei > 2 nicht mehr.
  for (uint8_t i = 0; i < arr_size; i++) {
    mqtt_json[i]["wert1"]   = 12;
    mqtt_json[i]["wert2"]   = "Hallo";
    mqtt_json[i]["wert3"]   = "Welt";
    mqtt_json[i]["wert4"]   = 13;
    mqtt_json[i]["wert5"]   = "Hallo";
    mqtt_json[i]["wert6"]   = "Welt";
    mqtt_json[i]["wert7"]   = 14; 
  }

  char buffer[2000];
  // Der Array oben ergibt 1942 Zeichen, Buffer sollte also ausreichen...
  serializeJson(mqtt_json, buffer);

  // Der JSON-String wird korrekt erzeugt
  Serial.println("Ausgabe JSON-String:");
  Serial.println(buffer);

  // Aber die Message kommt nicht an (nur wenn der Array eine gewisse Größe unterschreitet)
  client.publish(mqtt_topic, buffer);

}

boolean mqtt_reconnect() {
  if (client.connect("meinEsp32_1234", mqtt_username, mqtt_password)) {
    client.subscribe(mqtt_topic);
  }
  return client.connected();
}

void loop() {
  // 
}

Sind knapp 2000 Zeichen schlicht und einfach zuviel um per MQTT übertragen werden zu können?

Grüßle
Daniel

vielleicht mal mit

client.publish(mqtt_topic, (byte*) buffer, strlen(buffer)+1);

versuchen

Welche Hardware benutzt Du?

Esp32

Hi,

funktioniert leider nicht ;-(
Echt seltsam, dass er schon bei knapp 300 Zeichen verweigert.

LG Daniel

Mir ist gerade eingefallen, dass Sie setBufferSize() aufrufen müssen.

Hey,

Dankeschön!!!!
Jetzt funktioniert es.
Saucool!

Schönen Abend dir / allen.

LG Daniel

great !

1 Like

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