• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Пропадает WiFi через некоторое время после подключения платы ESP8266 к роутеру (NodeMCU, Wemos D1 mini)

Nikitos

New member
Добрый день! Возникла проблема при передаче данных от скрипта Python, который запущен на ПК ESP8266 с помощью протокола UDP (также подобная проблема появлялась и при использовании TCP). Суть проблемы: пропадает WiFi сеть и проводной интернет на ПК, который подключен к роутеру ZyXEL. Данные отправляю 10 раз в секунду. Wireshark видит запросы, размер одного запроса 57 байт.

C++:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "ZyXEL";
const char* password = "*******";

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // локальный порт для прослушки
char incomingPacket[1024];          // буфер для входящих пакетов
String getString  = "abvgdefg 123 456";

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

  Serial.printf("Connecting to %s ", ssid);
  //  "Подключение к %s "
  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);
  //  "Теперь прослушиваем IP-адрес %s, UDP-порт %d"
}

void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // получаем входящие UDP-пакеты:
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    getString = String(incomingPacket);
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
    //  "Содержимое UDP-пакета: %s"

  }
}


Python:
from socket import *
import sys

host = '192.168.0.3'
port = 4210
addr = (host,port)

udp_socket = socket(AF_INET, SOCK_DGRAM)
import time

time.sleep(0.2)

for i in range(10000):
    data = str(i) + "draww 1 2 3"
    # data = input('write to server: ')
    if not data :
        udp_socket.close()
        sys.exit(1)
    
    #encode - перекодирует введенные данные в байты, decode - обратно
    data = str.encode(data)
    ok = udp_socket.sendto(data , addr)
    time.sleep(0.14)
    print("ok", ok, i)


udp_socket.close()
 

nikolz

Well-known member
Добрый день! Возникла проблема при передаче данных от скрипта Python, который запущен на ПК ESP8266 с помощью протокола UDP (также подобная проблема появлялась и при использовании TCP). Суть проблемы: пропадает WiFi сеть и проводной интернет на ПК, который подключен к роутеру ZyXEL. Данные отправляю 10 раз в секунду. Wireshark видит запросы, размер одного запроса 57 байт.

C++:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "ZyXEL";
const char* password = "*******";

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // локальный порт для прослушки
char incomingPacket[1024];          // буфер для входящих пакетов
String getString  = "abvgdefg 123 456";

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

  Serial.printf("Connecting to %s ", ssid);
  //  "Подключение к %s "
  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);
  //  "Теперь прослушиваем IP-адрес %s, UDP-порт %d"
}

void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // получаем входящие UDP-пакеты:
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    getString = String(incomingPacket);
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
    //  "Содержимое UDP-пакета: %s"

  }
}


Python:
from socket import *
import sys

host = '192.168.0.3'
port = 4210
addr = (host,port)

udp_socket = socket(AF_INET, SOCK_DGRAM)
import time

time.sleep(0.2)

for i in range(10000):
    data = str(i) + "draww 1 2 3"
    # data = input('write to server: ')
    if not data :
        udp_socket.close()
        sys.exit(1)
   
    #encode - перекодирует введенные данные в байты, decode - обратно
    data = str.encode(data)
    ok = udp_socket.sendto(data , addr)
    time.sleep(0.14)
    print("ok", ok, i)


udp_socket.close()
у Вас маяк на роутере работает с шагом 100 мс (10 раз в секунду).
У вас очевидно хорошая глушилка получилась.

Надо на компе отправлять подтверждение, а на ESP ждать его до отправки нового сообщения.
 

pvvx

Активный участник сообщества
Serial.begin(9600); -> 960 байт в сек.
Данные отправляю 10 раз в секунду. Wireshark видит запросы, размер одного запроса 57 байт.
Serial.printf("UDP packet contents: %s\n", incomingPacket);
"UDP packet contents: %s\n" = 22 байта + incomingPacket(57) = 79 байт.
79*10(раз в сек) = 790 байт в сек.
Видимо это предельная скорость приема у ESP :)
 
Сверху Снизу