ESP8266 MQTT断线重连问题

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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简介 MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)...
    殖民_FE阅读 10,001评论 1 6
  • MQTT协议内部分享 时间:2018-07-26 讲解提纲 协议文档的解读 协议适用的场景 协议正确的使用方式 技...
    ProfessorTao阅读 14,583评论 0 25
  • 第六周总结 这周过的很快,忙碌而又充实。各项任务也整体都完成的不错。坚持每天...
    王晓慧_终身践行者阅读 897评论 0 1
  • 常听别人说,比你优秀的人还在努力,你为什不努力。 这是真的。我发现,城市越大,学习的人越多越自觉。 说起来好笑,十...
    浅颜若兮阅读 1,170评论 0 2
  • 文/ 路人锋 那是一个清晨或是一个午后 是鸟儿唱着歌衔来的?是阳光荡漾着溅起的?是风驾着花车送来的? 它是一个孩子...
    路人锋阅读 3,240评论 7 10