You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266更换网络后每15-30分钟断开Mosquitto MQTT连接问题求助

问题根因与修复方案

你遇到的返回码rc=-2是PubSubClient库定义的MQTT_CONNECT_FAILED错误,代表ESP8266 WiFi连接正常,但无法和Mosquitto broker建立TCP连接,符合家用路由器TCP空闲连接超时回收的典型特征,结合代码优化可按以下步骤修复:

1. 路由器配置调整

绝大多数家用路由器默认会对15-30分钟无数据传输的空闲TCP连接主动断开,回收端口资源,这和你遇到的断开间隔完全匹配:

  • 进入路由器后台,找到「TCP超时设置」「连接保持配置」类选项,将内网TCP连接的超时时间调整为2小时以上,或直接关闭内网设备的TCP超时回收规则。
  • 部分运营商定制路由器没有相关配置入口,直接通过代码侧配置心跳保活即可解决。

2. 代码问题修复

现有代码存在几个冗余逻辑会加剧连接不稳定,需调整:

冗余逻辑删除

  • 删除reconnect()函数开头的WiFi.begin(wifi_ssid, wifi_password)调用:仅当WiFi实际断开时才需要重连WiFi,反复调用会干扰正常WiFi连接。
  • 删除callback()函数中的client.subscribe ("esp3/LED")调用:订阅操作仅需在MQTT连接成功时执行一次,每次收到消息重复订阅会增加不必要的负载。

添加MQTT保活配置

修改client.connect调用参数,设置20秒的MQTT保活时间,确保TCP连接不会被路由器判定为空闲:

// 原调用
// if (client.connect(clientId.c_str()))
// 修改为 最后一个参数为保活时间,单位秒
if (client.connect(clientId.c_str(), NULL, NULL, NULL, 0, false, NULL, false, 20))

优化重连逻辑

优化后的reconnect参考实现:

void reconnect() {
  // 仅WiFi断开时才触发WiFi重连
  if(WiFi.status() != WL_CONNECTED){
    setup_wifi();
  }
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId= "ESP8266-";
    clientId += String(random(0xffff), HEX);
    // 20秒保活
    if (client.connect(clientId.c_str(), NULL, NULL, NULL, 0, false, NULL, false, 20))  {
      Serial.println("connected");
      client.subscribe("esp3/LED");
      ResetCounter = 0;
    } else {
        ResetCounter++;
        Serial.print("failed, rc=");
        Serial.print(client.state());
        Serial.println(" try again in 5 seconds");
        Serial.println(ResetCounter);
        if (ResetCounter >=5)
        {
            setup_wifi(); 
            client.setServer(mqtt_server, 1883); 
            client.setCallback(callback); 
            ResetCounter =0;
        }
        delay(5000);
      }
   }
}

3. 兜底验证

如果修改后仍存在断开问题,可在树莓派本地运行mosquitto_sub命令长期订阅测试主题,如果树莓派本地客户端也出现断开,说明是Mosquitto broker配置问题,否则可确认问题在路由器或ESP代码侧。

内容的提问来源于stack exchange,提问作者Hotte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:45:03