#arduino #esp8266 #nodemcu
#arduino #esp8266 #nodemcu
Вопрос:
Я использую NodeMCU (ESP8266) в качестве клиента WiFi для подключения к брокеру MQTT, запущенному на моем компьютере. При использовании этой настройки в Windows с использованием WSL (Ubuntu) брокер MQTT, похоже, работает отлично. Однако ESP8266 немедленно выдает ошибку в последовательной консоли при попытке подключиться к серверу MQTT. Wi-Fi подключается без инцидентов.
Пожалуйста, найдите ниже рабочий пример моего кода:
#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:
}
Выполнение этого кода приводит к следующему исключению в тот момент, когда оно достигает
пока(!client.connect(«arduino», «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:UsersJoshAppDataLocalArduino15packagesesp8266hardwareesp82662.5.0coresesp8266/HardwareSerial.h line 175
0x40204665: Print::write(char const*) at C:UsersJoshAppDataLocalArduino15packagesesp8266hardwareesp82662.5.0coresesp8266/Print.h line 60
0x40204665: Print::write(char const*) at C:UsersJoshAppDataLocalArduino15packagesesp8266hardwareesp82662.5.0coresesp8266/Print.h line 60
0x40204690: Print::println() at C:UsersJoshAppDataLocalArduino15packagesesp8266hardwareesp82662.5.0coresesp8266Print.cpp line 178
0x402031bb: setup() at C:UsersJoshDesktopssid_scan/ssid_scan.ino line 52
0x40204ca4: loop_wrapper() at C:UsersJoshAppDataLocalArduino15packagesesp8266hardwareesp82662.5.0coresesp8266core_esp8266_main.cpp line 122
Но на данный момент я упираюсь в стену. Я не знаю, что с этим делать, и я пытался исследовать файлы, показанные в исключении, но безрезультатно. Кто-нибудь знает, что это значит или о чем вообще говорит ошибка?
Библиотеки, которые я использую, являются:
Заранее большое спасибо! Я занимался этим более 6 часов, и я мертв.
Комментарии:
1. Благодарю вас за проделанную большую отладку и выяснение трассировки стека. Также за предоставление такого четкого, сжатого фрагмента кода, демонстрирующего проблему. Так мало плакатов делают это, и это ооочень помогает. Спасибо!
Ответ №1:
Вам не хватает некоторых настроек на клиенте MQTT. К сожалению, эта библиотека MQTT недостаточно умна, чтобы заметить, что вы не установили имя сервера, и вылетает при вызове connect()
без полной настройки.
Перед вызовом begin()
метода требуется вызов connect()
.
Попробуйте переписать свою connect()
функцию следующим образом:
void connect() {
Serial.print("Connecting to broker...");
client.begin("MQTT-SERVER-HOSTNAME", net);
while (!client.connect("arduino")) {
Если вам нужно указать номер порта, отличный от установленного по умолчанию (1883), вы можете указать целочисленный номер порта после доменного имени сервера в begin()
методе.
Комментарии:
1. Это сделало это! На самом деле я пришел к тому же выводу, когда рассматривал другой (рабочий) пример. Было поздно, когда я был в тупике, и я предполагаю, что я просто пропустил это и / или случайно опустил эту строку, когда писал свой код. Спасибо!
2. Это случается и со мной … когда вы слишком долго смотрите на один и тот же код, трудно по-настоящему понять, что происходит 🙂
Ответ №2:
Решение моей проблемы на самом деле было двояким:
Как указал Джон Ромки, в моем скрипте не хватало строки, которая сообщает моему ESP8266, где находится брокер. Мне нужно было следующее:
client.begin("IP_ADDRESS_OF_BROKER", net);
Однако мне также нужно было отключить брандмауэр Windows, поскольку я запускаю это на WSL. Поди разберись.
Надеюсь, кто-то еще, кто засиживается допоздна и упускает небольшую деталь, не будет тратить несколько часов, пытаясь разобраться в этом. Спасибо!