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