Заведомо нестабильный ESP8266 MQTT-клиент
Я делаю проект, в котором ESP8266 получает данные от Arduino Uno и публикует их через MQTT. Через случайное время он перестанет отправлять данные моему MQTT-брокеру. Это может быть час, это может быть день или два.
Он настроен на отправку данных каждую секунду, и я сделал отладочный вывод, сообщающий мне также о качестве сигнала WiFi. Похоже, это не то.
Я пытался сделать проверки, которые будут повторно подключаться к MQTT, если он потеряет соединение, и сбросить себя, если он потеряет соединение WiFi. У меня нет идей прямо сейчас, любая помощь приветствуется!
Вот моя функция повторного подключения MQTT
void reconnect() {
// Цикл, пока мы снова не подключимся
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Создаем случайный идентификатор клиента
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Попытка подключения
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// После подключения публикуем объявление...
client.publish("pressure/debug", "ESP8266: reconnected!");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Подождите 5 секунд перед повторной попыткой
delay(5000);
}
}
}
и вот где он проверяет наличие Wi-Fi
void checkWifiConnection() {
if (WiFi.status() != WL_CONNECTED)
{
int countdown = millis() + 15000;
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
if (countdown > millis()) {
delay(500);
Serial.println("Connecting to WiFi..");
} else {
Serial.println("Timed out! Restarting...");
ESP.reset();
}
}
}
}
Оба выполняются в каждом цикле.
Arduino отправляет данные, как и предполагалось, и я снизил скорость соединения до 19200 бит/с, чтобы обеспечить более стабильное соединение, используя SoftwareSerial. Есть ли еще вещи, которые я мог бы контролировать? Я попробовал это с двумя разными платами ESP8266MOD/"ESP07" с тем же результатом.
Вот результат отладки:
09:13:05.039 -> unpub data 0/ AP:Akvasafe/ RSSI:-69 dB / Vcc:3519mV / free heap:49440 / fragmentation:1%
@Vincent Vega, 👍1
Обсуждение1 ответ
Я использую библиотеку adafruit mqtt. После нескольких исправлений он работает очень стабильно.
Советы:
1) Убедитесь, что вы добавили строку подписки ДО подключения к mqtt (вы можете добавить ее в настройки и подключиться к mqtt в цикле)
Нравится:
Настройка: mqtt.subscribe(&motor);
Цикл: MQTT_connect();
Да, вы можете публиковать и подписываться одновременно.
2) В ЛИНИИ: Adafruit_MQTT_Client(сервер,порт,пользователь,пароль)
ИЗМЕНИТЬ ЭТО: Adafruit_MQTT(сервер,порт,clientid,пользователь,пароль)
Используйте это с идентификатором клиента (ДОЛЖЕН БЫТЬ УНИКАЛЬНЫМ (например, разным для всех клиентов)) или ваш клиент будет отключен при подключении другого клиента с таким же идентификатором.
3) Преобразовать value.lastread из char* в int : int val = atoi((char *)sensor.lastread);
Подробнее о ESP8266 и amp; ESP32: http://github.com/ajaybnl
- Как подключиться к MQTT брокеру с помощью TLS?
- Преобразование byte* в int в Arduino
- esp32-cam публикует изображение в mqtt
- ESP8266 глубокий сон и MQTT
- ESP-01 неправильно просыпается после глубокого сна
- Приведение от 'char*' к 'char' теряет точность
- Публиковать данные json в mqtt
- Не удалось подключиться к брокеру MQTT через esp8266/32 и pub/sub client
используйте ядро arduino esp8266 2.4.2, @Juraj
Пробовали ли вы более стабильную библиотеку MQTT? Вы не сказали, какой из них вы используете сейчас., @Jaromanda X
@Juraj Я использую 2.5.0, разве это не рекомендуется?, @Vincent Vega
@JaromandaX Я использую PubSubClient, мне показалось, что он самый популярный., @Vincent Vega
2.5.0 имеет много проблем, @Juraj
Популярный не значит стабильный :p но этот, когда я его использовал, был в порядке, @Jaromanda X