• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

UDP server работает не стабильно

danpot3

New member
Добрый день форумчане!

Поднимаю UDP сервер в локальной сети из примера
Arduino/udp-examples.md at master · esp8266/Arduino · GitHub

Сервер работает нестабильно, если несколько минут (около 10) не отправлять пакеты, то при повторной попытке они уже не доходят. Бывает, что через некоторое время снова просыпается и принимает пакеты. Ставлю проверки соединения сервера в loopе:

if(WiFi.status() != WL_CONNECTED)
Serial.println("WIFI_CONNECTED NO");
if(WiFi.status() == WL_CONNECTION_LOST)
Serial.println("WL_CONNECTION_LOST");
if(WiFi.status() == WL_DISCONNECTED)
Serial.println("WL_DISCONNECTED");
if(!UDPTestServer)
Serial.println("UDP_SERVER NO");

но в ком порт ничего не пишет. Это у всех так? Как добиться стабильной постоянной работы?
Нужна постоянная работа в режиме приема редких пакетов.
 

Dmitry P

New member
Добрый день форумчане!

Поднимаю UDP сервер в локальной сети из примера
Arduino/udp-examples.md at master · esp8266/Arduino · GitHub

Сервер работает нестабильно, если несколько минут (около 10) не отправлять пакеты, то при повторной попытке они уже не доходят. Бывает, что через некоторое время снова просыпается и принимает пакеты. Ставлю проверки соединения сервера в loopе:

if(WiFi.status() != WL_CONNECTED)
Serial.println("WIFI_CONNECTED NO");
if(WiFi.status() == WL_CONNECTION_LOST)
Serial.println("WL_CONNECTION_LOST");
if(WiFi.status() == WL_DISCONNECTED)
Serial.println("WL_DISCONNECTED");
if(!UDPTestServer)
Serial.println("UDP_SERVER NO");

но в ком порт ничего не пишет. Это у всех так? Как добиться стабильной постоянной работы?
Нужна постоянная работа в режиме приема редких пакетов.
У меня та же сама проблема. как с UDP, так в TCP.
 

Evgeniy163

New member
но в ком порт ничего не пишет.
Для начало надо с этим разбираться.

У меня UDP работает стабильно на нескольких устройствах. Т.е. одна ESP держит постоянное соединение с роутором (разумеется с контролем) и слушает порт, вторая спит и просыпается каждые 15 мин. для отправки пакета. Работает уже больше месяца не выключаясь, сбоев нет.
 

danpot3

New member
"Для начало надо с этим разбираться."

Я вот и не знаю в какую сторону смотреть - wifi или udp? пробовал разные значения в WiFi.setOutputPower(), но результата нет...
 

Evgeniy163

New member
С ком портом разобрались? Без отладочной информации можно только гадать. Я думаю капать надо в сторону ВИФИ.
 

Dmitry P

New member
я решил вопрос кардинально :)
Мне был нужен фактически wifi удлинитель на 30-50 метров и я вместо UDP и ТСР использовал ESP-NOW.
все проще и быстрее
 

danpot3

New member
С ком портом разобрались? Без отладочной информации можно только гадать. Я думаю капать надо в сторону ВИФИ.
Вот что пишет COM порт в дебаге при подключении к роутеру:

[inline]
STA disconnect: 203
..wifi evt: 1
STA disconnect: 203
..wifi evt: 7
wifi evt: 7
wifi evt: 1
STA disconnect: 203
.wifi evt: 7
.wifi evt: 7
wifi evt: 7
..wifi evt: 0
....wifi evt: 3
.
WiFi connected
IP address:
192.168.1.69

wifi evt: 7
wifi evt: 7
wifi evt: 7
...
[/inline]

Далее шлю сообщение "ХХ"

[inline]
:urn 2
:urd 2, 2, 0
XX

wifi evt: 7
wifi evt: 7
wifi evt: 7
...
[/inline]

Когда отваливается - в COM порте ничего нет...

ЗЫ Вставил WiFi.printDiag(Serial), перепрошил... теперь вообще ничего не приходит

WiFi connected
IP address:
192.168.1.69
Mode: STA+AP
PHY mode: N
Channel: 10
AP id: 0
Status: 5
Auto connect: 1
SSID (14): Beeline..
Passphrase (10): 089.....
BSSID set: 0
 

Сергей_Ф

Moderator
Команда форума
@danpot3 у меня witty cloud отработал полгода без сбоев, а сейчас вроде работает, но с ВиФи не соединяет и сериал порт теряет после трех-пяти часов работы. Питание предернешь - опять работает несколько часов.
А что то делать, имея всего один модуль вообще не реально, имхо.
 

danpot3

New member
Сергей_Ф, я понимаю что качество платы не 100%, но хотелось бы понять:
- пример UDP сервера с подключением через роутер он вообще рабочий?, т.е. есть люди у которых все пашет без обрывов?
- если пример рабочий, то остается 2 причины: настройки роутера (что можно посмотреть?) и сама плата...

а вообще странно, если в setup добавить WiFi.printDiag(Serial), то пишет WiFi connected и ниже Status: 5 (что означает disconnect насколько я понимаю?) - вообще ничего не принимает. Если строку закомментить, то работает как описано в посте №1.
 

Evgeniy163

New member
А скетч можно посмотреть. Если как в примере, то при плохом fiwi так и будет работать:
Сервер работает нестабильно, если несколько минут (около 10) не отправлять пакеты, то при повторной попытке они уже не доходят.
 

danpot3

New member
А скетч можно посмотреть.
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "Beeline_2G_FF2";
const char* password = "089.......7";

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // local port to listen on
char incomingPacket[255];  // buffer for incoming packets
//char  replyPacekt[] = "Hi there! Got the message :-)";  // a reply string to send back


void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");

  Udp.begin(localUdpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}


void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // receive incoming UDP packets
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    Serial.printf("UDP packet contents: %s\n", incomingPacket);

    // send back a reply, to the IP address and port we got the packet from
    //Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    //Udp.write(replyPacekt);
    //Udp.endPacket();
  }
}
 

Evgeniy163

New member
@danpot3, некоторые роутеры, если долго нет активности по вифи могут отключать клиента.
А процедуры реконнекта на случай потери связи в скетче нет.
Попробуй выкинуть все из loop и добавить только мониторинг wifi.

delay(2000);
if (WiFi.status() == WL_CONNECTED)
Serial.println("CONNECTED");
else
Serial.println("DISCONNECTED");

Поставь на прогон, посмотри, что будет.
 

danpot3

New member
Evgeniy163, если в цикле оставить только
Код:
delay(2000);
if (WiFi.status() == WL_CONNECTED)
Serial.println("CONNECTED");
else 
Serial.println("DISCONNECTED");
то "CONNECTED" пишет в ком порт без сбоев (пробовал 1 час, дальше не стал).
Если добавить

Код:
int cb = UDPTestServer.parsePacket();
  if (cb) {
    UDPTestServer.read(packetBuffer, packetSize);
    String myData = ""; 
    for(int i = 0; i < packetSize; i++) {
      myData += (char)packetBuffer[i];
    }
    Serial.println(myData);
    Serial.println( ESP.getFreeHeap(),DEC);
    }
то также пишет "CONNECTED", но пакеты, которые шлю доходят так же, т.е. когда хотят)
т.е. дело не в вифи...
 

Ildarmustafin86

Active member
Хоть поздно, но вставлю свои 5 копеек. У меня также терялись пакеты на ESP8266 UDP сервере. Решил проблему добавлением
Код:
#include "user_interface.h"
и
Код:
  wifi_set_sleep_type(NONE_SLEEP_T);
после
Код:
WiFi.mode(WIFI_STA);
Полный скетч:
Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include "user_interface.h"
#define LED_RXTX      D0  // RX_TX LED
#define LED_WIFI      D4  // WIFI Module LED
const char* ssid = "smart";
const char* password = "11111111";
String buf_1, buf_2;
unsigned int g_port = 8888;
char incomingPacket[255];
WiFiUDP Udp;
void setup(void) {
  pinMode(LED_RXTX, OUTPUT);
  pinMode(LED_WIFI, OUTPUT);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  wifi_set_sleep_type(NONE_SLEEP_T);
  WiFi.begin(ssid, password);
  if (WiFi.getAutoConnect() != true) WiFi.setAutoConnect(true);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    digitalWrite(LED_WIFI, LOW);
    delay(250);
    digitalWrite(LED_WIFI, HIGH);
    delay(250);
  }
  Udp.begin(g_port);
  if (WiFi.status() != WL_CONNECTED)  {
    digitalWrite(LED_WIFI, LOW);
  }
  else {
    digitalWrite(LED_WIFI, HIGH);
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
    WiFi.setAutoReconnect(true);
  }
}
void loop(void) {
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    digitalWrite(LED_RXTX, LOW);
    int len = Udp.read(incomingPacket, 255);
    if (len > 0) {
      incomingPacket[len] = 0;
    }
  String bufString = String(incomingPacket);
  byte dividerIndex = bufString.indexOf('=');
  buf_1 = bufString.substring(0, dividerIndex);
  buf_2 = bufString.substring(dividerIndex + 1);
    Serial.print(buf_1.toInt());
    Serial.print(" = ");
    Serial.println(buf_2.toInt());
  }
  digitalWrite(LED_RXTX, HIGH);
}
 
Сверху Снизу