Increase memory for MQTT data. Add memory limit checks.

This commit is contained in:
PaulZC
2022-03-18 13:32:14 +00:00
parent 7ee5458bfa
commit 94ad6fa1b1
2 changed files with 34 additions and 8 deletions
@@ -94,9 +94,10 @@ WiFiClientSecure wifiClient = WiFiClientSecure();
MqttClient mqttClient(wifiClient); MqttClient mqttClient(wifiClient);
void mqttMessageHandler(int messageSize) { void mqttMessageHandler(int messageSize) {
uint8_t mgaData[512 * 4]; //Most incoming data is around 500 bytes but may be larger const uint16_t mgaCountLimit = 16384;
int mgaCount = 0; uint8_t *mgaData = new uint8_t[mgaCountLimit];
Serial.print(F("Pushed data from ")); uint16_t mgaCount = 0;
Serial.print(F("Pushing data from "));
Serial.print(mqttClient.messageTopic()); Serial.print(mqttClient.messageTopic());
Serial.println(F(" topic to ZED")); Serial.println(F(" topic to ZED"));
while (mqttClient.available()) while (mqttClient.available())
@@ -104,8 +105,13 @@ void mqttMessageHandler(int messageSize) {
char ch = mqttClient.read(); char ch = mqttClient.read();
//Serial.write(ch); //Pipe to serial port is fine but beware, it's a lot of binary data //Serial.write(ch); //Pipe to serial port is fine but beware, it's a lot of binary data
mgaData[mgaCount++] = ch; mgaData[mgaCount++] = ch;
if (mgaCount == sizeof(mgaData)) if (mgaCount == mgaCountLimit)
{
Serial.print(F("Warning!! MQTT data exceeded "));
Serial.print(mgaCountLimit);
Serial.println(F(" bytes!!"));
break; break;
}
} }
if (mgaCount > 0) if (mgaCount > 0)
@@ -114,6 +120,8 @@ void mqttMessageHandler(int messageSize) {
myGNSS.pushRawData(mgaData, mgaCount, false); myGNSS.pushRawData(mgaData, mgaCount, false);
lastReceived_ms = millis(); lastReceived_ms = millis();
} }
delete[] mgaData;
} }
//Connect to MQTT broker, receive MGA, and push to ZED module over I2C //Connect to MQTT broker, receive MGA, and push to ZED module over I2C
@@ -248,9 +248,11 @@ WiFiClientSecure wifiClient = WiFiClientSecure();
MqttClient mqttClient(wifiClient); MqttClient mqttClient(wifiClient);
void mqttMessageHandler(int messageSize) { void mqttMessageHandler(int messageSize) {
uint8_t spartnData[512 * 4]; //Most incoming data is around 500 bytes but may be larger // Testing with /pp/ubx/0236/ip + /pp/ip/eu + /pp/ubx/mga shows the initial data length can be more than 13KBytes
int spartnCount = 0; const uint16_t spartnCountLimit = 16384;
Serial.print(F("Pushed data from ")); uint8_t *spartnData = new uint8_t[spartnCountLimit];
uint16_t spartnCount = 0;
Serial.print(F("Pushing data from "));
Serial.print(mqttClient.messageTopic()); Serial.print(mqttClient.messageTopic());
Serial.println(F(" topic to ZED")); Serial.println(F(" topic to ZED"));
while (mqttClient.available()) while (mqttClient.available())
@@ -258,8 +260,22 @@ void mqttMessageHandler(int messageSize) {
char ch = mqttClient.read(); char ch = mqttClient.read();
//Serial.write(ch); //Pipe to serial port is fine but beware, it's a lot of binary data //Serial.write(ch); //Pipe to serial port is fine but beware, it's a lot of binary data
spartnData[spartnCount++] = ch; spartnData[spartnCount++] = ch;
if (spartnCount == sizeof(spartnData)) if (spartnCount == spartnCountLimit)
{
Serial.print(F("Warning!! MQTT data exceeded "));
Serial.print(spartnCountLimit);
Serial.println(F(" bytes!!"));
break; break;
}
}
static uint16_t maxSpartnCount = 0;
if (spartnCount > maxSpartnCount)
{
maxSpartnCount = spartnCount;
Serial.print(F("Maximum MQTT data length is "));
Serial.print(maxSpartnCount);
Serial.println(F(" bytes"));
} }
if (spartnCount > 0) if (spartnCount > 0)
@@ -268,6 +284,8 @@ void mqttMessageHandler(int messageSize) {
myGNSS.pushRawData(spartnData, spartnCount, false); myGNSS.pushRawData(spartnData, spartnCount, false);
lastReceived_ms = millis(); lastReceived_ms = millis();
} }
delete[] spartnData;
} }
//Connect to STARTN MQTT broker, receive RTCM, and push to ZED module over I2C //Connect to STARTN MQTT broker, receive RTCM, and push to ZED module over I2C