c++arduinoembeddedmqttarduinojson

Why is my Arduino MKR NB 1500 stuck after sending or receiving a couple of MQTT messages?


Good morning everyone, newcomer writing his first question here (and new to C++/OOP).

So, i'm currently working on a project in which i have to send 2 types of JSON payloads to a MQTT broker after regular intervals (which can be set by sending a message to the Arduino MKR NB 1500).

I'm currently using these libraries: ArduinoJson, StreamUtils to generate and serialize/deserialize the JSONs, PubSubClient to publish/receive, and MKRNB in my VS code workplace.

What I noticed is that my program runs fine for a couple of publishes/receives and then stays stuck in the serialization function: I tried to trace with the serial monitor to see exactly where, but eventually arrived at a point in which my knowledge in C++ is too weak to recognize where to even put the traces in the code...

Let me show a small piece of the code:

DynamicJsonDocument coffeeDoc(12288);   //i need a big JSON document (it's generated right before
                                        //the transmission and destroyed right after)
coffeeDoc["device"]["id"] = boardID
JsonObject transaction = coffeeDoc.createNestedObject("transaction");
transaction["id"] = j;      //j was defined as int, it's the number of the message sent
JsonArray transaction_data = transaction.createNestedArray("data");

for(int i = 0; i < total; i++){         //this loop generates the objects in the JSON
                transaction_data[i] = coffeeDoc.createNestedObject();
                transaction_data[i]["id"] = i;
                transaction_data[i]["ts"] = coffeeInfo[i].ts;
                transaction_data[i]["pwr"] = String(coffeeInfo[i].pwr,1);
                transaction_data[i]["t1"] = String(coffeeInfo[i].t1,1);                                   
                transaction_data[i]["t2"] = String(coffeeInfo[i].t2,1);
                transaction_data[i]["extruder"] = coffeeInfo[i].extruder;
                transaction_data[i]["time"] = coffeeInfo[i].time;
            }
client.beginPublish("device/coffee", measureJson(coffeeDoc), false);
BufferingPrint bufferedClient{client, 32};
serializeJson(coffeeDoc, bufferedClient);  //THE PROGRAM STOPS IN THIS AND NEVER COMES OUT
bufferedClient.flush();
client.endPublish();
j++;
coffeeDoc.clear();                       //destroy the JSON document so it can be reused

The same code works as it should if i use an Arduino MKR WiFi 1010, I think i know too little about how the GSM works. What am I doing wrong? (Again, it works about twice before getting stuck).

Thanks to everybody who will find the time to help, have a nice one!!


Solution

  • Well, here's a little update: turns out i ran out of memory, so 12288 bytes were too many for the poor microcontroller.

    By doing some "stupid" tries, i figured 10235 bytes are good and close to the maximum available (the program won't use more than 85% of the RAM); yeah, that's pretty close to the maximum, but the requirements of the project give no other option.

    Thanks even for having read this question, have a nice one!