Skip to content

Commit 8234d1d

Browse files
authored
Merge pull request #1006 from alvarolobato/fix/mqtt-paho-reconnect-loop
fix: prevent MQTT disconnect loop on PC builds by reusing Paho client
2 parents 76bf6ca + 512086b commit 8234d1d

2 files changed

Lines changed: 38 additions & 22 deletions

File tree

src/mqtt/hasp_mqtt_paho_async.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ uint16_t mqttPort = MQTT_PORT;
8383

8484
MQTTAsync mqtt_client;
8585

86+
static bool mqttClientCreated = false;
8687
static bool mqttConnecting = false;
8788
static bool mqttConnected = false;
8889

@@ -366,18 +367,21 @@ void mqttStart()
366367
int rc;
367368
int ch;
368369

369-
if((rc = MQTTAsync_create(&mqtt_client, mqttServer.c_str(), haspDevice.get_hostname(), MQTTCLIENT_PERSISTENCE_NONE,
370-
NULL)) != MQTTASYNC_SUCCESS) {
371-
LOG_ERROR(TAG_MQTT, "Failed to create client, return code %d", rc);
372-
rc = EXIT_FAILURE;
373-
return;
374-
}
370+
if(!mqttClientCreated) {
371+
if((rc = MQTTAsync_create(&mqtt_client, mqttServer.c_str(), haspDevice.get_hostname(), MQTTCLIENT_PERSISTENCE_NONE,
372+
NULL)) != MQTTASYNC_SUCCESS) {
373+
LOG_ERROR(TAG_MQTT, "Failed to create client, return code %d", rc);
374+
rc = EXIT_FAILURE;
375+
return;
376+
}
375377

376-
if((rc = MQTTAsync_setCallbacks(mqtt_client, mqtt_client, connlost, mqtt_message_arrived, NULL)) !=
377-
MQTTASYNC_SUCCESS) {
378-
LOG_ERROR(TAG_MQTT, "Failed to set callbacks, return code %d", rc);
379-
rc = EXIT_FAILURE;
380-
return;
378+
if((rc = MQTTAsync_setCallbacks(mqtt_client, mqtt_client, connlost, mqtt_message_arrived, NULL)) !=
379+
MQTTASYNC_SUCCESS) {
380+
LOG_ERROR(TAG_MQTT, "Failed to set callbacks, return code %d", rc);
381+
rc = EXIT_FAILURE;
382+
return;
383+
}
384+
mqttClientCreated = true;
381385
}
382386

383387
mqttEnabled = mqttServer.length() > 0 && mqttPort > 0;
@@ -415,6 +419,8 @@ void mqttStart()
415419

416420
void mqttStop()
417421
{
422+
if(!mqttClientCreated) return;
423+
418424
int rc;
419425
MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer;
420426
disc_opts.onSuccess = onDisconnect;
@@ -423,6 +429,8 @@ void mqttStop()
423429
LOG_ERROR(TAG_MQTT, "Failed to disconnect, return code %d", rc);
424430
rc = EXIT_FAILURE;
425431
}
432+
MQTTAsync_destroy(&mqtt_client);
433+
mqttClientCreated = false;
426434
}
427435

428436
void mqttSetup()

src/mqtt/hasp_mqtt_paho_single.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ uint16_t mqttPort = MQTT_PORT;
8080

8181
MQTTClient mqtt_client;
8282

83+
static bool mqttClientCreated = false;
8384
int disc_finished = 0;
8485
int subscribed = 0;
8586
int connected = 0;
@@ -300,18 +301,21 @@ void mqttStart()
300301
int ch;
301302

302303
LOG_DEBUG(TAG_MQTT, "%s %d", __FILE__, __LINE__);
303-
if((rc = MQTTClient_create(&mqtt_client, mqttServer.c_str(), haspDevice.get_hostname(), MQTTCLIENT_PERSISTENCE_NONE,
304-
NULL)) != MQTTCLIENT_SUCCESS) {
305-
LOG_ERROR(TAG_MQTT, "Failed to create client, return code %d", rc);
306-
rc = EXIT_FAILURE;
307-
return;
308-
}
304+
if(!mqttClientCreated) {
305+
if((rc = MQTTClient_create(&mqtt_client, mqttServer.c_str(), haspDevice.get_hostname(), MQTTCLIENT_PERSISTENCE_NONE,
306+
NULL)) != MQTTCLIENT_SUCCESS) {
307+
LOG_ERROR(TAG_MQTT, "Failed to create client, return code %d", rc);
308+
rc = EXIT_FAILURE;
309+
return;
310+
}
309311

310-
if((rc = MQTTClient_setCallbacks(mqtt_client, mqtt_client, connlost, mqtt_message_arrived, NULL)) !=
311-
MQTTCLIENT_SUCCESS) {
312-
LOG_ERROR(TAG_MQTT, "Failed to set callbacks, return code %d", rc);
313-
rc = EXIT_FAILURE;
314-
return;
312+
if((rc = MQTTClient_setCallbacks(mqtt_client, mqtt_client, connlost, mqtt_message_arrived, NULL)) !=
313+
MQTTCLIENT_SUCCESS) {
314+
LOG_ERROR(TAG_MQTT, "Failed to set callbacks, return code %d", rc);
315+
rc = EXIT_FAILURE;
316+
return;
317+
}
318+
mqttClientCreated = true;
315319
}
316320

317321
LOG_DEBUG(TAG_MQTT, "%s %d", __FILE__, __LINE__);
@@ -350,6 +354,8 @@ void mqttStart()
350354

351355
void mqttStop()
352356
{
357+
if(!mqttClientCreated) return;
358+
353359
int rc;
354360
// MQTTClient_disconnectOptions disc_opts = MQTTClient_disconnectOptions_initializer;
355361
// disc_opts.onSuccess = onDisconnect;
@@ -358,6 +364,8 @@ void mqttStop()
358364
LOG_ERROR(TAG_MQTT, "Failed to disconnect, return code %d", rc);
359365
rc = EXIT_FAILURE;
360366
}
367+
MQTTClient_destroy(&mqtt_client);
368+
mqttClientCreated = false;
361369
}
362370

363371
void mqttSetup()

0 commit comments

Comments
 (0)