【问题标题】:Lose MQTT Connection after 15-30 minutes15-30 分钟后失去 MQTT 连接
【发布时间】:2021-12-26 13:26:48
【问题描述】:

目前,我的 ESP8266 与我的 mosquitto MQTT 代理建立稳定连接时遇到问题。 我搬家了,因此使用了不同的网络。 在之前的网络中,我的ESP运行稳定,完全没有问题。 MQTTserver 在 Raspberry PI 4 上运行。 如前所述,在新网络中,它每 15-30 分钟中断一次(没有固定的时间长度)。 代码当然要适应新的网络和broker的IP。

我使用的代码可能是众所周知的连接MQTT服务器的代码。

我只添加了一些 I/O 端口。 由于代码在旧网络中没有问题,我首先认为 WLAN 连接失败。 所以在循环中,我插入了与 WLAN 的重建。 但这运行稳定:

正在尝试 MQTT 连接...失败,rc=-2 5 秒后重试
正在尝试 MQTT 连接...失败,rc=-2 5 秒后重试
连接到 Vodafone-947E
.....
WiFi 连接
IP地址:
192.168.0.52
正在尝试 MQTT 连接...失败,rc=-2 5 秒后重试
正在尝试 MQTT 连接...失败,rc=-2 5 秒后重试
.....

可能是我的新路由器在一段时间后简单地中断了连接吗?否则,我不明白问题可能是什么。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>

//----------------------------------------------------------------------------------------------------------------------
#define wifi_ssid "xxxxxxx"
#define wifi_password "xxxxxxxxx"
#define mqtt_server "192.168.0.xxx"

//----------------------------------------------------------------------------------------------------------------------
WiFiClient espClient;  
PubSubClient client(espClient);  
  
bool status;  
const int OutputPin2 =  12;  
const int ResetPin = 4;
int ResetCounter =0;

//----------------------------------------------------------------------------------------------------------------------
void setup() {  
  Serial.begin(9600);   
  
  setup_wifi();  
  client.setServer(mqtt_server, 1883); 
  client.setCallback(callback);  
  pinMode(OutputPin2, OUTPUT);
  pinMode(ResetPin, OUTPUT);
  digitalWrite(OutputPin2, HIGH);
  digitalWrite(ResetPin, HIGH);
}  

//----------------------------------------------------------------------------------------------------------------------
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    WiFi.begin(wifi_ssid, wifi_password); 
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId= "ESP8266-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    delay(100);
    if (client.connect(clientId.c_str()))  {
      Serial.println("connected");
      // Once connected, publish an announcement...
      // ... and resubscribe
      
      client.subscribe("esp3/LED");
      
    } 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); 
            //digitalWrite(ResetPin, LOW);  
            ResetCounter =0;
        }

        // Wait 5 seconds before retrying
        delay(5000);
      }
   }
}

//----------------------------------------------------------------------------------------------------------------------
void loop() {  
  if (!client.connected()) {  
    reconnect();  
  }
  client.loop();
}  

//----------------------------------------------------------------------------------------------------------------------   
void setup_wifi() {  
  delay(10);  
  // We start by connecting to a WiFi network  
  Serial.println();  
  Serial.print("Connecting to ");  
  Serial.println(wifi_ssid);  
  WiFi.begin(wifi_ssid, wifi_password);  
  while (WiFi.status() != WL_CONNECTED) {  
   Serial.print("."); 
   delay(500);  
  }  
  Serial.println("");  
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");  
  Serial.println(WiFi.localIP());  
}  
 //----------------------------------------------------------------------------------------------------------------------
void callback(char* topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

 client.subscribe ("esp3/LED");

 if (strcmp(topic,"esp3/LED")) {
    Serial.print("Changing output to ");
    if(messageTemp == "on LED"){
    
      Serial.println("on LED");
      digitalWrite(OutputPin2, LOW);   //Invertiertes Signal
      
      delay(200);
    }
    else if(messageTemp == "off LED"){
    
      Serial.println("off LED");
      digitalWrite(OutputPin2, HIGH);  
      
      delay(200);
    }
  } 
}

```

【问题讨论】:

  • 当设备断开连接时,蚊子日志会说什么?
  • 代码...适应了新的网络 - 这到底是什么意思?
  • 你能测试一下其他设备在这个wifi上是否遇到类似问题吗?

标签: wifi mqtt esp8266 disconnect reconnect


【解决方案1】:

幸运的是,我能够解决这个问题。原因是 ESP8266 上的 WLAN 信号太低了。结果,ESP 无法永久留在网络上。我实际上排除了这一点,因为路由器就在一个房间之外。问题是周围公寓的许多路由器也在同一频段上传输,从而影响信号。我买了一个 WLAN 放大器(当然这并不能改善信号重叠的情况)。现在我不再有与 ESP 断开连接的问题了,这种情况已经持续了 2 天。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 2020-09-18
    • 2021-08-10
    • 2018-09-11
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多