NodeMCU (ESP8266) 连接到 MQTT 代理时出现异常 28
NodeMCU (ESP8266) Exception 28 when connecting to MQTT broker
我正在使用 NodeMCU (ESP8266) 作为 WiFi 客户端连接到我计算机上的 MQTT 代理 运行。使用 WSL (Ubuntu) 在 Windows 中使用此设置,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.5.0\cores\esp8266/HardwareSerial.h line 175
0x40204665: Print::write(char const*) at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266.5.0\cores\esp8266/Print.h line 60
0x40204665: Print::write(char const*) at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266.5.0\cores\esp8266/Print.h line 60
0x40204690: Print::println() at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266.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.5.0\cores\esp8266\core_esp8266_main.cpp line 122
但在这一点上我碰壁了。我不知道该怎么做,我已经尝试调查异常中显示的文件但无济于事。任何人都知道这意味着什么或者错误甚至在说什么?
我使用的库是:
非常感谢!我已经在这里待了 6 个多小时,我已经死了。
您在 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()
方法中的服务器域名后指定一个整数端口号。
我的问题实际上有两个解决方案:
正如 John Romkey 所指出的,我在脚本中遗漏了告诉我的 ESP8266 经纪人所在位置的那一行。我需要以下内容:
client.begin("IP_ADDRESS_OF_BROKER", net);
但是,我还需要禁用 Windows 防火墙 ,因为我在 WSL 上 运行 这个。去图吧。
希望熬夜而遗漏小细节的其他人不会浪费多个小时来弄清楚。谢谢!
我正在使用 NodeMCU (ESP8266) 作为 WiFi 客户端连接到我计算机上的 MQTT 代理 运行。使用 WSL (Ubuntu) 在 Windows 中使用此设置,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.5.0\cores\esp8266/HardwareSerial.h line 175
0x40204665: Print::write(char const*) at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266.5.0\cores\esp8266/Print.h line 60
0x40204665: Print::write(char const*) at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266.5.0\cores\esp8266/Print.h line 60
0x40204690: Print::println() at C:\Users\Josh\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266.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.5.0\cores\esp8266\core_esp8266_main.cpp line 122
但在这一点上我碰壁了。我不知道该怎么做,我已经尝试调查异常中显示的文件但无济于事。任何人都知道这意味着什么或者错误甚至在说什么?
我使用的库是:
非常感谢!我已经在这里待了 6 个多小时,我已经死了。
您在 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()
方法中的服务器域名后指定一个整数端口号。
我的问题实际上有两个解决方案:
正如 John Romkey 所指出的,我在脚本中遗漏了告诉我的 ESP8266 经纪人所在位置的那一行。我需要以下内容:
client.begin("IP_ADDRESS_OF_BROKER", net);
但是,我还需要禁用 Windows 防火墙 ,因为我在 WSL 上 运行 这个。去图吧。
希望熬夜而遗漏小细节的其他人不会浪费多个小时来弄清楚。谢谢!