【发布时间】: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