@@ -44,7 +44,7 @@ const char FP_CONFIG_GROUP[] PROGMEM = "group";
4444
4545#include " hasp_mqtt.h" // functions to implement here
4646
47- #include " hasp/hasp_dispatch.h" // for dispatch_topic_payload
47+ #include " hasp/hasp_dispatch.h" // for dispatch_topic_payload, dispatch_defer_command
4848#include " hasp_debug.h" // for logging
4949
5050#if !defined(_WIN32)
@@ -83,6 +83,7 @@ uint16_t mqttPort = MQTT_PORT;
8383
8484MQTTAsync mqtt_client;
8585
86+ static bool mqttClientCreated = false ;
8687static bool mqttConnecting = false ;
8788static bool mqttConnected = false ;
8889
@@ -206,6 +207,11 @@ static void mqtt_message_cb(char* topic, char* payload, size_t length)
206207 // LOG_TRACE(TAG_MQTT, F("ignoring LWT = online"));
207208 }
208209 } else {
210+ // On PC, jsonl/json handlers call LVGL from MQTT thread -> segfault. Defer to main thread.
211+ if (!strcmp (topic, " command/jsonl" ) || !strcmp (topic, " command/json" )) {
212+ dispatch_defer_command (topic, payload);
213+ return ;
214+ }
209215 dispatch_mtx.lock ();
210216 dispatch_topic_payload (topic, (const char *)payload, length > 0 , TAG_MQTT);
211217 dispatch_mtx.unlock ();
@@ -361,18 +367,21 @@ void mqttStart()
361367 int rc;
362368 int ch;
363369
364- if ((rc = MQTTAsync_create (&mqtt_client, mqttServer.c_str (), haspDevice.get_hostname (), MQTTCLIENT_PERSISTENCE_NONE,
365- NULL )) != MQTTASYNC_SUCCESS) {
366- LOG_ERROR (TAG_MQTT, " Failed to create client, return code %d" , rc);
367- rc = EXIT_FAILURE;
368- return ;
369- }
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+ }
370377
371- if ((rc = MQTTAsync_setCallbacks (mqtt_client, mqtt_client, connlost, mqtt_message_arrived, NULL )) !=
372- MQTTASYNC_SUCCESS) {
373- LOG_ERROR (TAG_MQTT, " Failed to set callbacks, return code %d" , rc);
374- rc = EXIT_FAILURE;
375- 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 ;
376385 }
377386
378387 mqttEnabled = mqttServer.length () > 0 && mqttPort > 0 ;
@@ -410,6 +419,8 @@ void mqttStart()
410419
411420void mqttStop ()
412421{
422+ if (!mqttClientCreated) return ;
423+
413424 int rc;
414425 MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer;
415426 disc_opts.onSuccess = onDisconnect;
@@ -418,6 +429,8 @@ void mqttStop()
418429 LOG_ERROR (TAG_MQTT, " Failed to disconnect, return code %d" , rc);
419430 rc = EXIT_FAILURE;
420431 }
432+ MQTTAsync_destroy (&mqtt_client);
433+ mqttClientCreated = false ;
421434}
422435
423436void mqttSetup ()
0 commit comments