Esp8266 - MDNS перестает отвечать в течение некоторого времени после отправки данных

Мой код очень прост, я использую свой esp8266 в качестве сервера, который должен ждать, пока клиентское соединение прочитает с него данные и передаст их в Arduino через последовательный порт. Я также использую mDNS для обнаружения IP-адресов ESP8266 внутри сети, и вот код:

#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». и телефон обнаруживает esp по его IP-адресам. Я смог отправить данные в ESP, и он получил их правильно, а затем отправил обратно в Arduino через последовательный порт,

Проблема заключалась в том, что я постоянно отправляю некоторые данные в ESP, а затем снова пытаюсь сканировать mDNS, на который ESP не ответил. ESP все еще не отвечает на сканирование mDNS в течение примерно 30 секунд / 1 минуты, после чего он снова становится обнаруживаемым.

Тем временем, когда mDNS не отвечает, ESP все еще может получать данные с телефона и отправлять их через последовательный порт без каких-либо проблем и отображать правильные данные. Так что esp не глючит.

Мне кажется, что что-то блокирует службу mDNS, когда я отправляю много данных с телефона. Я сделал что-то не так в своем коде? Когда mDns не отвечает, я попытался выполнить сканирование с помощью приложения для Android Zeroconf, и оно тоже не отреагировало примерно через одну минуту.


person Tizana    schedule 22.03.2018    source источник


Ответы (1)


поэтому я попытался активировать 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- и каждый раз, когда я пытаюсь найти esp на моем телефоне с помощью (ZeroconfResolver / mdns), эта строка всплывает, и мой телефон смог найти 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

введите описание изображения здесь

4. после отправки некоторых данных я снова пытаюсь найти esp8266 с помощью (ZeroconfResolver / mdns), и 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

может кто-нибудь объяснить мне, почему возникает эта проблема? похоже, буфер tx заполнен? что мне тогда делать? Извините, я новичок в сетевых вещах, я всего лишь электронный инженер.

Спасибо

person Tizana    schedule 23.03.2018
comment
Есть новости об этом @Tizana? Я просматриваю журналы в 3 и не знаю, что с этим делать. - person Andy Novak; 10.03.2020
comment
Я пытался запустить обновление MDNS, редко, как 1 в секунду, но снова терпит неудачу - person nerkn; 07.07.2021