美文网首页ESP8266&ESP32 IoT solutions
ESP8266 MQTT断线重连问题

ESP8266 MQTT断线重连问题

作者: thegavin | 来源:发表于2019-07-11 14:42 被阅读0次

MQTT进行publish的时候好像比较容易出现问题,这样改似乎有改善,仅供参考。

ESP8266_RTOS_SDK/third_party/mqtt/library/MQTTClient.c
ESP8266_RTOS_SDK/third_party/mqtt/platform/MQTTFreeRTOS.c
diff --git a/ESP8266_RTOS_SDK/third_party/mqtt/library/MQTTClient.c b/ESP8266_RTOS_SDK/third_party/mqtt/library/MQTTClient.c
index e21af51..937beba 100755
--- a/ESP8266_RTOS_SDK/third_party/mqtt/library/MQTTClient.c
+++ b/ESP8266_RTOS_SDK/third_party/mqtt/library/MQTTClient.c
@@ -251,6 +251,8 @@ void MQTTCloseSession(MQTTClient* c)
     c->isconnected = 0;
     if (c->cleansession)
         MQTTCleanSession(c);
+
+    c->ipstack->disconnect(c->ipstack);
 }
 
 
@@ -345,7 +347,7 @@ int MQTTYield(MQTTClient* c, int timeout_ms)
 
     TimerInit(&timer);
     TimerCountdownMS(&timer, timeout_ms);
-
+#if 0
    do
     {
         if (cycle(c, &timer) < 0)
@@ -354,6 +356,20 @@ int MQTTYield(MQTTClient* c, int timeout_ms)
             break;
         }
    } while (!TimerIsExpired(&timer));
+#else
+#if defined(MQTT_TASK)
+    MutexLock(&c->mutex);
+#endif
+
+    if (cycle(c, &timer) < 0)
+    {
+        rc = FAILURE;
+    }
+
+#if defined(MQTT_TASK)
+    MutexUnlock(&c->mutex);
+#endif
+#endif
 
     return rc;
 }
diff --git a/ESP8266_RTOS_SDK/third_party/mqtt/platform/MQTTFreeRTOS.c b/ESP8266_RTOS_SDK/third_party/mqtt/platform/MQTTFreeRTOS.c
index 1cd3999..ee5ad92 100755
--- a/ESP8266_RTOS_SDK/third_party/mqtt/platform/MQTTFreeRTOS.c
+++ b/ESP8266_RTOS_SDK/third_party/mqtt/platform/MQTTFreeRTOS.c
@@ -38,19 +38,22 @@ int ThreadStart(Thread* thread, void (*fn)(void*), void* arg)
 
 void MutexInit(Mutex* mutex)
 {
-    mutex->sem = xSemaphoreCreateMutex();
+    //mutex->sem = xSemaphoreCreateMutex();
+    mutex->sem = xSemaphoreCreateRecursiveMutex();
 }
 
 
 int MutexLock(Mutex* mutex)
 {
-    return xSemaphoreTake(mutex->sem, portMAX_DELAY);
+    //return xSemaphoreTake(mutex->sem, portMAX_DELAY);
+    return xSemaphoreTakeRecursive(mutex->sem, portMAX_DELAY);
 }
 
 
 int MutexUnlock(Mutex* mutex)
 {
-    return xSemaphoreGive(mutex->sem);
+    //return xSemaphoreGive(mutex->sem);
+    return xSemaphoreGiveRecursive(mutex->sem);
 }
 
 void TimerCountdownMS(Timer* timer, unsigned int timeout_ms)

相关文章

  • ESP8266 MQTT断线重连问题

    MQTT进行publish的时候好像比较容易出现问题,这样改似乎有改善,仅供参考。

  • 状态同步的断线重连

    最近陆陆续续在给游戏做断线重连相关的工作,大厅服的断线重连问题不是很大,难点主要在于战斗中的断线重连。断线重连要解...

  • C# Mqtt 断线重连

    在通过 MqttClient 客户端连接之后,在服务端服务重启时,客户端如果没有重连机制,则无法再接收到订阅的消息...

  • 断线重连问题综述

    断线重连主要涉及到几个问题: 判定断线 怎么重连 重连后如何还原游戏环境 判定断线有两种方式,(1)是超时判定断线...

  • iOS MQTTClient使用时一直不断重连的问题

    使用MQTT时遇到一直断线重连的问题,排查了很久,最后才发现设置的ClientId都是一样的。 如果有特殊规则,设...

  • esp8266接入小爱同学,通过mqtt

    原理:esp8266连接mqtt服务,并订阅mqtt的主题,当通过小爱语音发出指令,相当于mqtt的消息推送,由于...

  • Jedis断线重连问题

    问题以及现象 前一阵子发现redis断线重连后,会出现类似如下的错误: 解决思路 socket write err...

  • 断线重连

    今天看了下之前游戏登录相关逻辑,重新整理下断线重连的一些做法。 首先,介绍下断线的几种常见情况:情况一:客户端网络...

  • 断线重连

    using System; using System.Collections; using System.Coll...

  • Meterpreter session x closed. Re

    问题 持续断线重连 Payload: 解决 exploit/multi/handler 使用的 Payload 与...

网友评论

    本文标题:ESP8266 MQTT断线重连问题

    本文链接:https://www.haomeiwen.com/subject/fafdkctx.html