• Система автоматизации с открытым исходным кодом на базе 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);
}
 
Сверху Снизу