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

проблема с UDP-сокетом

Добрый день!
Имеется проблема с UDP-сокетом. Примерно через 1час 30 минут перестаёт принимать пакеты.
В логах ничего.
Проблема наблюдается и в “Arduino IDE” и на C с SDK “ESP8266_NONOS_SDK_V2.0.0_16_07_19”.
Видимо проблема в SDK, какие есть мысли а может быть решение по этому поводу?
 

Victor

Administrator
Команда форума
Примерно через 1час 30 минут перестаёт принимать пакеты.
Если утечки памяти нет, то
1. Проверьте в настройках роутера какое у вас время [inline]Association Expire[/inline] и [inline]DHCP lease time[/inline]
2. Сделайте логгирование WiFi событий
 
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <Ticker.h>
#include <WiFiUdp.h>

#define UDP_PORT 8888

#define LAMP2 2

Ticker tickerSet2;
bool zendHello = false;

WiFiUDP test_udp;

void ticker5s(){
  zendHello = true;
}

String readUdp(){
  int cb = test_udp.parsePacket();
  String stroka ="";
  if(cb){
    for(int i=0;i<cb;++i) stroka += char(test_udp.read());
    return stroka;
  }
  return stroka;
}

void sendUdp(String data){
IPAddress brobcastAddress(255,255,255,255);
int dataLendth = data.length();
char buff[dataLendth];
data.toCharArray(buff, dataLendth+1);
test_udp.beginPacket(brobcastAddress, 8888);
test_udp.write(buff, dataLendth);
test_udp.endPacket();
}

void test_udpHandle(){
 
  String test_udpData = readUdp();
 
 
  if(test_udpData != ""){
    digitalWrite(LAMP2,!digitalRead(LAMP2));
    sendUdp("echo");
  }
}

void setup() {
  // put your setup code here, to run once:
  pinMode ( LAMP2, OUTPUT );
 
  WiFi.mode(WIFI_STA);
  WiFi.begin("VOID", "12345678");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
   
  test_udp.begin(UDP_PORT);
  tickerSet2.attach_ms(5000, ticker5s);
 
}

void loop() {
  // put your main code here, to run repeatedly:
  test_udpHandle();

  if(zendHello){
    String helloData = "hello";
    sendUdp(helloData);
    zendHello = false;
  }
}
 
Также прога на pytonдля теста

Код:
# -*- coding: utf-8 -*-
from socket import *
import sys
import time
import time

print "Start : %s" % time.ctime()


host = '172.23.4.255'
port = 8888
addr = (host,port)
data = 'smart-echo'

udp_socket = socket(AF_INET, SOCK_DGRAM)

while 1:
    print("start")
    udp_socket.sendto(data, addr)
    time.sleep(1)
  

print("end")

udp_socket.close()
Через полтора часа светодиод “LAMP2” перестаёт мигать но слать "hello" модуль продолжает
 

nikolz

Well-known member
пишу на си, дурину не пользую, могу дать лишь предложения:
1) убрать из sendUdp получение адреса.
чтобы адрес получать один раз в момент соединения с точкой доступа.
2) Если Вы используете бродкаст то посылайте сразу и данные.
3) Сделайте контроль в LOOP наличия соединения с точкой доступа.
 
К сожалению не остался исходник на С.

Писалась для теста, модуль вёл себя также. На передачу работал а на приём нет, тоже через полтора часа. Видимо проблема глубже.
 

nikolz

Well-known member
К сожалению не остался исходник на С.

Писалась для теста, модуль вёл себя также. На передачу работал а на приём нет, тоже через полтора часа. Видимо проблема глубже.
Я использую внутри домашней сети исключительно UDP.
Так как нет причин использовать TCP (пакетов всегда один и путь всегда один, поэтому TCP ничего не дает , кроме задержки обмена, по сравнению с UDP)
На ESP у меня клиенты, асервер на компе. Обмен с подтверждением (послыка с сервера эхо).
Тестировал UDP сутки с посылкой пакета каждую секунду,
все работает без проблем.
 

nikolz

Well-known member
У вас скорее всего нет постоянно прослушивающих udp-сокетов на esp-модуле.
поясните, про что это Вы.
Что понимаете под постоянным прослушиванием сокетов на клиенте UDP?
Если у Вас из-за этого не работает, то выкиньте это.
 
Когда создаём сокет один раз при инициализации и на протяжении всей работы его не закрываем и постоянно слушаем его
 

nikolz

Well-known member
Когда создаём сокет один раз при инициализации и на протяжении всей работы его не закрываем и постоянно слушаем его
тогда у меня так и сделано.
Но сокет сам ничего не слушает.
Это просто метка, по которой определяется приложение,
когда придет пакет с IP и MAC адресом ESP или бродкаст и это примет приемник WIFI.
А приемник слушает всегда если Вы его не выключаете
 

nikolz

Well-known member
По этому у Вас и работает
Не соглашусь с Вами. примено полтора года назад еще на 0.9.5 версии делал на LUA (на сайте есть мои сообщения) работу с кучей датчиков и тоже тестировал сутки интервал 2 минуты Все работало без проблем на UDP, на TCP тогда была утечка памяти. сейчас утечки памяти нет и TCP тоже работает без проблем.
 
Сверху Снизу