连接到MQTT代理时,NodeMCU(ESP8266)异常28

时间:2019-03-15 05:38:59

标签: arduino esp8266 nodemcu

我正在使用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 by Arduino

MQTT.h by Joel Gaehwiler

非常感谢!我在这里待了6个多小时,我已经死了。

2 个答案:

答案 0 :(得分:0)

您缺少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 :(得分:0)

解决我的问题的方法实际上有两个:

正如John Romkey所指出的那样,我在脚本中遗漏了告诉我ESP8266经纪人在哪里的那行。我需要以下条件:

.svg {
  height: 45mm;
  z-index: 1;
  transform-origin: center;
}

.svg-path {
  stroke-dasharray: 1200;
  stroke-dashoffset: 0;
  stroke: #60206F;
}

@keyframes draw {
  from {
    stroke-dashoffset: 1200
  }
  to {
    stroke-dashoffset: 0;
  }
}

.legende {
  margin: auto;
  bottom: 150px;
  position: relative;
  z-index: 2;
  opacity: 0;
}

#svg-1:hover .legende, #svg-2:hover .legende, #svg-3:hover .legende {
  opacity: 1;
  transition-property: opacity;
  transition-duration: 2s;
}
#svg-1:hover .svg, #svg-2:hover .svg, #svg-3:hover .svg {
  opacity: 0.1;
  transform: scale(2);
  transition-property: transform;
  transition-duration: 2s;
  z-index: 1;
}

但是,我还需要禁用Windows防火墙,因为我正在WSL上运行它。走吧。

希望其他熬夜但错过了一个小细节的人不会浪费很多时间来弄清楚它。谢谢!