NodeMCU (ESP8266) Исключение 28 при подключении к брокеру MQTT

Я использую NodeMCU (ESP8266) в качестве клиента WiFi для подключения к брокеру MQTT, запущенному на моем компьютере. Используя эту настройку в Windows с использованием WSL (Ubuntu), брокер MQTT, похоже, работает отлично. Однако ESP8266 сразу же выдает ошибку в последовательной консоли при попытке подключения к серверу MQTT. WiFi подключается без происшествий.

Ниже приведен рабочий пример моего кода:

#include <ESP8266WiFi.h>
#include <MQTT.h>

const char ssid[] = "MyWiFiNetwork";
const char pass[] = "MyWiFiPassword";

WiFiClient net;
MQTTClient client;


void connect() {
  Serial.print("Connecting to broker...");

  while (!client.connect("arduino")) {
    Serial.print(".");
    delay(1000);
  }

  Serial.println("\nconnected to broker!");
}


void setup() {
  Serial.begin(9600);

  WiFi.begin(ssid, pass);
  Serial.print("Attempting to connect to ");
  Serial.println(ssid);

  while(WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  if(WiFi.status() == WL_CONNECTED) {
    Serial.print("\nWiFi connected to ");
    Serial.println(WiFi.SSID());
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
    Serial.print("Gateway: ");
    Serial.println(WiFi.gatewayIP());
    Serial.println("");
  }

  connect();
}

void loop() {
  // put your main code here, to run repeatedly:

}

При выполнении этого кода возникает следующее исключение, когда он достигает

while (! client.connect ("arduino", "try", "try")) {

Exception (28):
epc1=0x40203051 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffd80 end: 3fffffc0 offset: 01a0
3fffff20:  3ffee6e4 00000003 0000000b 3ffee764  
3fffff30:  3ffe85a2 00000000 3ffee6e4 402043ec  
3fffff40:  3ffe85a2 3ffee658 3ffee6e4 40204665  
3fffff50:  3ffe884f 3ffee658 3fffff90 40204665  
3fffff60:  3ffe8851 3ffee658 3ffee6e4 40204690  
3fffff70:  dc2ba8c0 00ffffff 3ffee6e4 3ffee764  
3fffff80:  3ffe85a2 3ffee658 3ffee6e4 402031bb  
3fffff90:  40205188 412ba8c0 00000000 feefeffe  
3fffffa0:  3fffdad0 00000000 3ffee734 40204ca4  
3fffffb0:  feefeffe feefeffe 3ffe8508 40100801  
<<<stack<<<

Из других сообщений на форуме я понял, как декодировать исключение стека, чтобы произвести следующее:

0x402043ec: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266/HardwareSerial.h line 175
0x40204665: Print::write(char const*) at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266/Print.h line 60
0x40204665: Print::write(char const*) at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266/Print.h line 60
0x40204690: Print::println() at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266\Print.cpp line 178
0x402031bb: setup() at C:\Users\Josh\Desktop\ssid_scan/ssid_scan.ino line 52
0x40204ca4: loop_wrapper() at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266\core_esp8266_main.cpp line 122

Но в этот момент я упираюсь в стену. Я не знаю, что с этим делать, и безуспешно пытался исследовать файлы, указанные в исключении. Кто-нибудь знает, что это означает или что ошибка вообще говорит?

Я использую следующие библиотеки:

ESP8266WiFi.h от Arduino

MQTT.h, автор Джоэл Гэвиллер

Спасибо заранее! Я занимаюсь этим более 6 часов, и я мертв.


person ds_k7    schedule 15.03.2019    source источник
comment
Престижность вам за столько отладки и выяснение трассировки стека. Также за предоставление такого ясного и лаконичного фрагмента кода, демонстрирующего проблему. Так мало плакатов делают это, и это очень помогает. Спасибо!   -  person romkey    schedule 15.03.2019


Ответы (2)


Вам не хватает настроек клиента MQTT. К сожалению, эта библиотека MQTT недостаточно умна, чтобы заметить, что вы не установили имя сервера, и дает сбой при вызове connect() без полной настройки.

Перед вызовом connect() вам необходимо вызвать метод begin().

Попробуйте переписать вашу connect() функцию следующим образом:

void connect() {
  Serial.print("Connecting to broker...");

  client.begin("MQTT-SERVER-HOSTNAME", net);

  while (!client.connect("arduino")) {

Если вам нужно указать номер порта, отличный от номера по умолчанию (1883), вы можете указать целочисленный номер порта после имени домена сервера в методе begin().

person romkey    schedule 15.03.2019
comment
Вот и все! Я фактически пришел к тому же осознанию, когда смотрел на другой (рабочий) пример. Было уже поздно, когда я был в тупике, и, думаю, я просто пропустил это и / или случайно пропустил эту строку, когда писал свой код. Спасибо! - person ds_k7; 15.03.2019
comment
Это случается и со мной ... когда вы слишком долго смотрите на один и тот же код, трудно понять, что происходит :) - person romkey; 15.03.2019

На самом деле моя проблема была двоякой:

Как заметил Джон Ромки, мне не хватало строки в моем скрипте, которая сообщает моему ESP8266 где находится брокер. Мне понадобилось следующее:

  client.begin("IP_ADDRESS_OF_BROKER", net);

Однако мне также нужно было отключить брандмауэр Windows, поскольку я использую его на WSL. Иди разберись.

Надеюсь, кто-то, кто не ложится спать допоздна и упускает какую-то мелочь, не будет тратить несколько часов, пытаясь понять это. Спасибо!

person ds_k7    schedule 15.03.2019