MQTT не работает на ESP8266 (Nodemcu 0.9)
Я пытаюсь использовать NodeMCU на моем ESP8266 (NodeMCU 0.9), но плата постоянно зависает, и я не понимаю, почему.
Я протестировал брокер mqtt с помощью командной строки, и он работает отлично, поэтому я могу предположить, что проблема не в сервере.
Я следовал этому руководству, но, похоже, оно мне не помогло.
Вот код, который я написал:
Ранее:
#include <PubSubClient.h>
#define MQTT_SERVER "1.2.3.4"
#define MQTT_PORT 1883
#define MQTT_USER "user"
#define MQTT_PSW "psw"
...
WiFiClient client;
Затем:
PubSubClient clientMqtt(MQTT_SERVER, MQTT_PORT, this->client);
//Попробуйте mqtt-подключение
while (!clientMqtt.connected()) {
Serial.print("Attempting MQTT connection...");
// Попытка подключения
if (clientMqtt.connect("ESP8266Client", MQTT_USER, MQTT_PSW)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(clientMqtt.state());
Serial.println(" try again in 5 seconds");
// Подождите 5 секунд перед повторной попыткой
delay(5000);
}
}
//Попробуйте отправить сообщение
clientMqtt.publish("bin", "test", true);
Код работал правильно до clientMqtt.connect("ESP8266Client", MQTT_USER, MQTT_PSW), где при первой/второй попытке произошел сбой.
Вот что получилось:
Attempting MQTT connection...
failed, rc=-2 try again in 5 seconds
Attempting MQTT connection...
failed, rc=-2 try again in 5 seconds
Attempting MQTT connection...
Soft WDT reset
ctx: cont
sp: 3ffefa90 end: 3ffefe30 offset: 01b0
>>>stack>>>
3ffefc40: 3ffe897d 40202c5d 3ffefcc4 40202dab
3ffefc50: 3ffe89b7 3ffefcc0 3ffefcc4 40203cdc
3ffefc60: 514d0400 00045454 3ffe89a7 40204cdc
3ffefc70: 3ffe89c0 3ffe89a9 00000000 3ffe88fa
3ffefc80: 3ffeeb70 3ffefdb0 3ffeedd8 3ffe88fa
@Timmy, 👍0
1 ответ
Мягкий сброс сторожевого таймера (WDT) означает сброс программного сторожевого таймера. В зависимости от версии ядра Arduino, использование функции delay() для ESP8266 может привести к этой ошибке, хотя текущие версии справляются с этим лучше, и использование функции delay() не вызывает проблем. Убедитесь, что у вас установлены актуальные определения Board Manager для проектов на базе ESP8266.
На этой странице содержится много информации о сторожевых таймерах, в частности, о том, как использовать инструмент под названием Декодер трассировки стека исключений ESP8266/ESP32, чтобы точно определить, какая строка кода вызвала сброс.
На этой странице отмечается, что библиотека PubSubClient может вызывать проблемы с питанием сторожевого таймера, и приводятся примеры некоторых альтернативных функций yield() и delay(), которые можно включить и вызывать вместо встроенных версий. Это помогает уменьшить количество сбросов при использовании PubSub на ESP8266.
Время ожидания сторожевого таймера программного обеспечения составляет порядка 3 секунд, поэтому вы также можете попробовать уменьшить delay(5000) до более короткого значения, например delay(1000) во время отладки, чтобы исключить 3-секундный сброс сторожевого таймера из-за вызова delay().
Ваш вывод также указывает на статус -2 функции state(). В документации по PubSubClient указано, что это означает «сбой сетевого подключения». Поэтому ещё один важный момент: убедитесь, что ваше устройство действительно подключено к сети Wi-Fi и что MQTT-сервер прослушивает указанные вами IP-адрес и порт.
- Преобразование byte* в int в Arduino
- Как определить размер Flash?
- В ESP-12E NodeMCU, какой выход PIN A0?
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- NodeMCU поддерживает внедрение ключей?
- Датчик движения PIR (HC-SR501) ложные результаты с NodeMCU
- Как получить текущую дату