Esp8266 - MDNS在发送数据后停止响应一段时间

时间:2018-03-22 18:19:16

标签: esp8266 arduino-esp8266 mdns

我的代码非常简单,我使用我的esp8266作为服务器,它应该等待客户端连接从它读取数据并通过串行传输到Arduino。 我还使用mDNS来检测网络内ESP8266的IP地址,这里是代码:

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <EEPROM.h>


.....
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10); 

  if (!MDNS.begin("Device 1")) { //
    while (1) {  delay(1000); }
  }
  MDNS.addService("SmartDimmerx2", "tcp", 80);


  WiFi.mode(WIFI_STA);
  delay(4000);
  // Check if WiFi is already connected and if not, 
  if (WiFi.status() != WL_CONNECTED){
    Serial.println("Disconnected");
    ConnecStat_Toarduino = false;
  }
  else {
    Serial.println("Connected");
    ConnecStat_Toarduino = true;
  }
  // Start the server
  server.begin();

}



void loop() {
  MDNS.update();

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("Disconnected");
    ConnecStat_Toarduino = false;
    delay(100);
  }
  else if ((WiFi.status() == WL_CONNECTED) && (ConnecStat_Toarduino = false)) {
    Serial.println("Connected");
    ConnecStat_Toarduino = true;
  }


  if (Serial.available() > 0) {
    String incomingChars = Serial.readStringUntil('\n');
    if(incomingChars.indexOf("WPS") != -1) {
     WPS_fnct();
    }
  }
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    time_cnx = millis();
    return;
  }

  // Wait until the client sends some data

  while (!client.available()) {
    if ((millis() - time_cnx)>2000) 
    {return;}
    delay(1);
  }

  // Read the first line of the request
  String req = client.readStringUntil('\r');

  client.flush();
  client.stop();

  // Match the request
  int val;
  if (req.indexOf("V=") != -1)
  {
    Serial.print(req.substring(2,5));
    Serial.println(req.substring(7,11));
     //Serial.println(char(req.substring(8,10).toInt()));
  }

  else {
    client.stop();
    return;
  }
}

我使用我的手机应用程序作为客户端,代码工作正常,我扫描“_SmartDimmerx2._tcp.local。”并且手机用其IP地址检测esp。 我能够将数据发送到ESP并正确接收,然后通过串口将其发送回arduino,

问题出在我连续向ESP发送一些数据然后我再次尝试扫描ESP没有响应的mDNS之后。 ESP仍然没有响应mDNS扫描30秒/ 1分钟,之后它再次被发现。

与此同时,当mDNS没有响应时,ESP仍然能够从手机接收数据并通过串口发送没有任何问题,并显示正确的数据。所以esp没有被窃听。

当我从手机发送大量数据时,我觉得有什么东西挡住了mDNS服务。我的代码中出错了吗? 当mDns没有响应时,我尝试使用Zeroconf安卓应用程序进行扫描,直到一分钟之后它才响应。

1 个答案:

答案 0 :(得分:0)

所以我试图激活DEBUG以查看错误, 所以我在文件的开头添加#define DEBUG_ESP_MDNS_ERR并在IDE中激活串口调试,这就是我得到的。

1-当我第一次启动ESP时,我得到了这样的线条,每隔2秒就弹出一次:

:urn 33
:urd 4, 33, 13
:urd 4, 33, 18
:urd 5, 33, 23
:urn 283

2-每当我尝试使用(ZeroconfResolver / mdns)手机搜索esp这些线弹出时,我的手机就能找到esp8266

:urn 43
:urd 14, 43, 13
:urd 4, 43, 28
:urd 5, 43, 33

3-然后当我用手机向esp发送一系列数据时,我得到了这样的界限:

WS:ac
:rn 12
:ref 1
WS:av
:ref 2
:ur 2
:c0 1, 12
:ur 1
:close
WS:dis
:del
WS:ac
:rn 12
:ref 1
WS:av
:ref 2
:ur 2
:c0 1, 12
:ur 1
:close
WS:dis
:del
.........

所以我在手机中使用滑块,每次更改它的值时,都应该将此值发送到ESP

enter image description here

4.发送一些数据后,我再次尝试使用(ZeroconfResolver / mdns)搜索esp8266,esp没有响应,手机无法检测到,这就是我在调试中得到的:

:urn 43
:urd 14, 43, 13
:urd 4, 43, 28
:urd 5, 43, 33
failed _reservefailed _reservefailed _reservefailed _reservefailed _reservefailed _reservefailed _reservefailed _reservefailed _reservefailed _reservefailed _reservefailed .........

所以为了让esp再次被发现,我可以重新启动esp,或者我可以等待30秒到2分钟,ESP将再次被发现。

我搜索此错误'failed _reserve',我在UdpContext.h中找到它

https://github.com/esp8266/Arduino/blob/461c922586564b8b8b1ece7e5591531b38dbfb87/libraries/ESP8266WiFi/src/include/UdpContext.h#L270

任何人都可以解释一下为什么会触发这个问题?它看起来像tx缓冲区已满?那我该怎么办? 对不起,我是网络菜鸟,我只是一个电子设备。

THX