Add reconnect if the connection dies

this time, by recalling mqtt.connect

apparently it didn't like recreating the objects very much
This commit is contained in:
Starbeamrainbowlabs 2022-07-04 16:47:10 +01:00
parent 752045d4b0
commit 491b87c0b3
Signed by: sbrl
GPG key ID: 1BE5172E637709C2

View file

@ -57,10 +57,10 @@
// Ref https://stackoverflow.com/a/523737/1460422 // Ref https://stackoverflow.com/a/523737/1460422
#define CHECK_BIT(var,pos) ((var) & (1<<(pos))) #define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
#ifndef MQTT_NO_TLS #ifdef MQTT_NO_TLS
WiFiClientSecure transport;
#else
WiFiClient transport; WiFiClient transport;
#else
WiFiClientSecure transport;
#endif #endif
PubSubClient mqtt; PubSubClient mqtt;
@ -113,6 +113,40 @@ float read_analog(int channel) {
return parsedValue; return parsedValue;
} }
void connect_mqtt() {
if(!mqtt.connect(
("autoplant_" + String(random(0, 999999))).c_str(),
MQTT_USERNAME, MQTT_PASSWORD)
) {
/* Ref https://pubsubclient.knolleary.net/api#state
-4 : MQTT_CONNECTION_TIMEOUT - the server didn't respond within the keepalive time
-3 : MQTT_CONNECTION_LOST - the network connection was broken
-2 : MQTT_CONNECT_FAILED - the network connection failed
-1 : MQTT_DISCONNECTED - the client is disconnected cleanly
0 : MQTT_CONNECTED - the client is connected
1 : MQTT_CONNECT_BAD_PROTOCOL - the server doesn't support the requested version of MQTT
2 : MQTT_CONNECT_BAD_CLIENT_ID - the server rejected the client identifier
3 : MQTT_CONNECT_UNAVAILABLE - the server was unable to accept the connection
4 : MQTT_CONNECT_BAD_CREDENTIALS - the username/password were rejected
5 : MQTT_CONNECT_UNAUTHORIZED - the client was not authorized to connect
*/
int error_code = mqtt.state();
Serial.println("failed, error code "+String(error_code));
while(true) delay(10000);
}
Serial.println("ok");
}
void check_mqtt() {
if(mqtt.connected() == 0) {
Serial.print("MQTT reconnect: ");
connect_mqtt();
}
else {
Serial.println("MQTT: connection ok");
}
}
bool send_mqtt(String id, String sensor, float value) { bool send_mqtt(String id, String sensor, float value) {
// StaticJsonDocument<96> data; // StaticJsonDocument<96> data;
// //
@ -125,6 +159,7 @@ bool send_mqtt(String id, String sensor, float value) {
// char* payload = new char[length](); // char* payload = new char[length]();
// serializeJson(data, payload, length); // serializeJson(data, payload, length);
check_mqtt();
bool result = mqtt.publish("sensors/data", payload.c_str()); bool result = mqtt.publish("sensors/data", payload.c_str());
// delete[] payload; // delete[] payload;
@ -177,32 +212,13 @@ void setup() {
// mqtt.setBufferSize(1000); // mqtt.setBufferSize(1000);
mqtt.setClient(transport); Serial.print("."); mqtt.setClient(transport); Serial.print(".");
mqtt.setServer(MQTT_SERVER, MQTT_PORT); Serial.print("."); mqtt.setServer(MQTT_SERVER, MQTT_PORT); Serial.print(".");
mqtt.setKeepAlive(INTERVAL / 2);
// Serial.print(MQTT_SERVER); // Serial.print(MQTT_SERVER);
// Serial.print(":"); // Serial.print(":");
// Serial.print(MQTT_PORT); // Serial.print(MQTT_PORT);
// Serial.print("."); // Serial.print(".");
if(!mqtt.connect( connect_mqtt();
("autoplant_" + String(random(0, 999999))).c_str(),
MQTT_USERNAME, MQTT_PASSWORD)
) {
/* Ref https://pubsubclient.knolleary.net/api#state
-4 : MQTT_CONNECTION_TIMEOUT - the server didn't respond within the keepalive time
-3 : MQTT_CONNECTION_LOST - the network connection was broken
-2 : MQTT_CONNECT_FAILED - the network connection failed
-1 : MQTT_DISCONNECTED - the client is disconnected cleanly
0 : MQTT_CONNECTED - the client is connected
1 : MQTT_CONNECT_BAD_PROTOCOL - the server doesn't support the requested version of MQTT
2 : MQTT_CONNECT_BAD_CLIENT_ID - the server rejected the client identifier
3 : MQTT_CONNECT_UNAVAILABLE - the server was unable to accept the connection
4 : MQTT_CONNECT_BAD_CREDENTIALS - the username/password were rejected
5 : MQTT_CONNECT_UNAUTHORIZED - the client was not authorized to connect
*/
int error_code = mqtt.state();
Serial.println("failed, error code "+String(error_code));
while(true) delay(10000);
}
Serial.println("ok");
Serial.print("BME280: "); Serial.print("BME280: ");