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  

, 👍0


1 ответ


4

Мягкий сброс сторожевого таймера (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-адрес и порт.

,