花了近乎两周时间才查清楚,为什么MQTT会不定时无故自动重新连接,并且毫无规律,且很频繁
最终查到,是因为在任务中发布MQTT主题所导致的。如下图
如果在loop函数中调用 1 就不会有自动重连问题
如果用任务的方式调用 2 就会引起MQTT频繁的无规律重新连接
引起这个问题的原因是:
如果你在使用任务来发布主题时遇到MQTT重新连接的问题,可能的原因是ESP32的多任务环境和WiFi库或MQTT库的交互问题。在ESP32的多任务环境中,如果两个任务都试图使用WiFi或MQTT客户端,可能会导致问题,因为这些库可能不是线程安全的。
解决办法是:
一种可能的解决方案是使用一个单独的任务来处理所有的MQTT操作,包括连接、发布和接收。这样可以确保在任何时候只有一个任务在使用MQTT客户端,避免了可能的线程安全问题。
另一种可能的解决方案是使用队列(queue)或其他同步机制来在任务之间传递消息。例如,你可以创建一个队列来保存要发布的消息,然后在一个单独的任务中从队列中取出消息并发布。这样也可以确保在任何时候只有一个任务在使用MQTT客户端。
如果是定时发布1的办法简单些,如果不定时发布,可能要用到互锁或队列来解决。
每个人的情况可能不太一样,细心排查,多次反复重现故障,并测试,以缩小故障代码范围,最终会查到问题所在。