乐鑫技术交流
直播中

周臻庸

7年用户 820经验值
私信 关注
[问答]

ESP8266的MQTT为什么会连接丢失?

在我的 ESP8266 项目中,如果 MQTT 连接丢失并重新连接失败,几分钟后,我通过 ESP.restart() 重新启动 ESP8266。我真的不知道为什么会发生这种 MQTT 连接丢失(或 WiFi),但这将是另一个消息线程的主题(我的一些 ESP8266 每周 7 天每天 24 小时运行数月而没有任何 MQTT 连接丢失,其他人可能每月两次遇到这种连接中断)。
因此,在这种连接 MQTT 丢失且无法重新连接的情况下,我通过 ESP.restart() 重新启动了 ESP,通常问题由代码自行解决。伟大的!但不幸的是,我不时注意到这并没有正常发生。否则 ESP8266 不再响应 ping。在这种情况下,我将其关闭然后再打开,它会立即再次运行。请注意,此问题与此问题无关:您必须在串行闪存编程后关闭/打开电源(我知道这个问题)。
因此,我正在寻找能让我 100% 确定(如果 100% 可能)ESP8266 将(正确)重启的解决方案。我正在考虑用 ESP.reset() 替换 ESP.restart()。此外,此消息线程(viewtopic.php?f=32&t=9459&start=8
) 提到了一个可能是我的问题,并建议以 DIO 模式而不是 QIO 模式进行闪存。
回答我的问题:

1. 关于 ESP.reset() 而不是 ESP.restart(),我目前使用 ESP.restart() 因为网络上提到的 ESP.restart 没有太多细节(我想每个人都在互相抄袭) () 比 ESP.reset() 更好,它可以保留已初始化的寄存器。但是哪个寄存器?我必须说我不明白这个问题,因为如果 ESP.reset() 就像一个开机,当你打开你的 ESP8266 时,你怎么会遇到问题?那么 ESP.reset() 是如何成为一个潜在问题的呢?
2. 我查看了 ESPclass 代码以查找 ESP.restart() 和 ESP.reset() 的作用。我发现
extern "C" void __real_system_restart_local ();
void EspClass :: reset (void)
{
  __real_system_restart_local ();
}
void EspClass :: restart (void)
{
  system_restart ();
  esp_yield(); 我们在哪里可以找到有关 system_restart() 和 __real_system_restart_local() 功能的更多信息
?3. 我们今天是否有关于此消息线程 ( viewtopic.php?f=32&t=9459&start=8 ) 建议的更多信息以及为什么闪烁 DIO 而不是 QIO 会取消一些非重启原因?最后,如果我只问一个问题,你会建议我用哪种方式来更确定 ESP 将在我通过代码决定时重新启动。
                                       
               



更多回帖

发帖
×
20
完善资料,
赚取积分