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

ESP+ESP как независимый раиоудлиннитель.

Сергей_Ф

Moderator
Команда форума
@nicelight откопал свой код и посмотрел - ничего там нет, заслуживающего внимания. Использовал стандартную библиотеку WiFi и в ней WiFiUdp.h
ESP у меня работал только на прием. Примеры в библиотеке есть.

Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
unsigned int localPort = 50000;      // local port to listen for UDP packets
const int UDP_PACKET_SIZE = 512; // UDP time stamp is in the first 48 bytes of the message
char packetBuffer[UDP_PACKET_SIZE] = {0}; //buffer to hold incoming and outgoing packets
// A UDP instance to let us send and receive packets over UDP

WiFiUDP udp;


void loop(){
....
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");

  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
//Serial.printf("Heap: %u\n", ESP.getFreeHeap());

  Serial.println("Starting UDP");
  udp.begin(localPort);
  Serial.print("Local port: ");
  Serial.println(udp.localPort());
....
// Get UDP JSON string for change mode
  int cb = udp.parsePacket();
  if (cb) {
    Serial.print("======================= ");Serial.print(test_count++);Serial.println(" =======================");
    Serial.print("=================== Heap likes ");Serial.print(heap_start-ESP.getFreeHeap());Serial.println(" ===================");
    Serial.print("packet received, length=");
    Serial.println(cb);

    // We've received a packet, read the data from it
    udp.read(packetBuffer, UDP_PACKET_SIZE); // read the packet into the buffer
    packetBuffer[cb]=0;
    Serial.print("Received " );
    Serial.println(packetBuffer);

.....

}
 
Последнее редактирование:

nicelight

Member
Вобщем, расковырял библиотеку, посмотрел обучалку про то что такое UDP и где оно находится. Все стало понятно и удобно. Начал отправлять пакеты, и тут натыкаюсь на эту беду:
C UDP на WiFi беда - много потерянных пакетов.
И ведь блин, пакеты теряются не из-за плохой связи, а из-за того что esp чем то занимается во время их отправки.
Если шлю 10 пакетов в секунду, всреднем один проходит 2 теряется. раз в 3-5 секунд теряется пакетов 20-50 , ну это ожидаемо, если предположить, что там esp занимается поддержанием wifi связи))
Теперь опускаю частоту до 1 UDP пакета в секунду и все равно через каждых 2-5 пакетов, 1-2 стабильно теряется. Ну что это за беда то такая. И если у этой беды много если ( как и вообще у самой esp)
А т.к. слишком много если, то ответить на ваш запрос в раках форума невозможно. :)
Может быть как то можно Вас урвать за рамками форума? :)
 

nikolz

Well-known member
Спасибо, парень толковый. Посмотрел уже 70% лекций по работе модели OSI. Многое прояснилось.
Какой скорости можно ожидать от ESP при обмене данными по TCP ( если уж про UDP даже pvvx плохо отзывается ) ?
Давно это было, более года назад. На форуме где-то есть мои сообщения.
Я использовал UDP в скрипте чтения данных с датчиков температуры (2 шт) давление и температуры и влажности и температуры( DS, BMP и AM) гонял сутками потерь пакетов не было. Минимальное время опроса датчиков было 0.1 сек. Ограничивалось скоростью работы DS. и делал это все на LUA.
Поэтому ищите ошибки в программе.
 

nicelight

Member
.... Минимальное время опроса датчиков было 0.1 сек. Ограничивалось скоростью работы DS. и делал это все на LUA.
Поэтому ищите ошибки в программе.
Спасибо за совет, только программы там кот наплакал, стандартная библиотека от arduino. я ее уже крутил вертел наверное вечера 3-4 по пару часов. ничего нету кроме инкрементируемой переменной, которая отправляется по UDP и вывода в серийник принятой с другой стороны этой переменной.
Тут грешить или на arduino IDE или еще на какие грабли, что то там известно pvvx по этому поводу)
 

pvvx

Активный участник сообщества
И ведь блин, пакеты теряются не из-за плохой связи, а из-за того что esp чем то занимается во время их отправки.
Тут сложно уточнить - вариантов много. Если у вас один WiFi AP в округе...
Если шлю 10 пакетов в секунду, в среднем один проходит 2 теряется. раз в 3-5 секунд теряется пакетов 20-50 , ну это ожидаемо, если предположить, что там esp занимается поддержанием wifi связи))
На передачу, упаковку пакета, переливание его в буфера передатчика, ожидания "окна передачи" уходит достаточное время. Выходит, что на передачу 1 байта или 1024 в пакете, уходит примерно одинаковое время. ESP успевает обработать сотню таких транзакций в секунду. 100*1024 = передать минимум 100 килобайт. В реальности, при 166 MHz передача на TCP у ESP более 1.2 Мегабайта при пакете в 1500 байт. Т.е. более 800 переданных (по 1500 байт) и 400 принятых (ACK пакетов, в десяток байт, подтверждений приема предыдущих двух пакетов) TCP пакетов в секунду.
Что-то не то у вас с кодом...
Замеры и прочее можно найти в теме Web свалки
Например Кол-во и скорость открытия множественных Web соединений (JMeter)
Может быть как то можно Вас урвать за рамками форума? :)
А форум на что? :)
 
Последнее редактирование:

nicelight

Member
Что-то не то у вас с кодом...
может быть попробуете оценить. не замечаю каких либо аномалий.
Код:
/* Create a WiFi access point and provide a web server on it. */

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiClient.h>
#include <WiFiUdp.h>

int num=0;
int recievedNum=0;

/*
const int LDR = A0;
const int BUTTON = 4;
const int green = 12;
const int blue = 13;

/* Set these to your desired credentials. */
// имя создаваемой точки доступа
const char *ssid = "ESP_node_server";
const char *password = "thereisnoanyspoon";

unsigned int localPort = 8888; // local port to listen on with UDP
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "recieved"; // a string to send back
WiFiUDP Udp; // создаем обект udp класса wifiudp

void setup() {
   
    delay(300);
    Serial.begin(115200);
    Serial.println();
    Serial.println("Configuring access point...");
    /* You can remove the password parameter if you want the AP to be open. */
  delay(100);
    WiFi.softAP(ssid, password);
 
    IPAddress myIP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(myIP);
  delay(300);
  Udp.begin(localPort); // стартуем UDP сервер по идее
Serial.println("udp reciever ready");
}

void loop() {
int packetSize = Udp.parsePacket();

if (packetSize){
  IPAddress remote = Udp.remoteIP(); // Откуда получили запрос
 
  Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
 
  // Шлём ответ для подтверждения
  //Udp.beginPacket(remote, 8889);
  //Udp.write(ReplyBuffer);
  //Udp.endPacket();
 
  recievedNum=packetBuffer[0]; // запоминаем значение пришедшее по UDP
  Serial.print("udp rec-ed: ");
  Serial.println(int(packetBuffer[0]));
  Serial.print(" lost packets:");
    Serial.println(recievedNum-num-1);
    num=recievedNum; 
}//if incoming UDP packet is

}//loop
 

pvvx

Активный участник сообщества
может быть попробуете оценить. не замечаю каких либо аномалий.
Что-то отсылки UDP пакетов там не видно...
Какой-то прием, не по событиям приема, вывод в UART тормозящий до 115200/10/40 циклов опроса в сек...
PS: На Arduino IDE можно писать только тогда, когда вы сами составили библиотеки и досконально знаете как они работают. Иначе даже браться не стоит - выйдет белиберда. По этому писанина на Arduino не сокращает времени набивки приложений, а увеличивает на время изучения и исправления чужого кода входящих в него библиотек... :p
 
Последнее редактирование:

nicelight

Member
Что-то отсылки UDP пакетов там не видно...
Какой-то прием, не по событиям приема, вывод в UART тормозящий до 115200/10/40 циклов опроса в сек...
Речь зашла о том, что пакеты вроде как теряются при получении, а не при отправке. Выше скетч приемника, он не отвечает подтверждениями, только слушает. Передатчик только отправляет через тупой delay. Пробовал без делаев тайминги отправки формировать, поведение на приеме никак не изменилось. Uart на какой скорости предпочтительней юзать? )
PS: ... писанина на Arduino не сокращает времени набивки приложений, а увеличивает на время изучения и исправления чужого кода входящих в него библиотек... :p
Да знаю я, знаю ваше отношение к дурине)) Хочу писать норм код, сложно мне пока осилить udk или на чем там Вы кодите эту конфетку?) Это ж скока потрахов надо выучить. инфы толком нет систематизированной, все по крупицам собирать, правильно? в итоге что лучше, потратить еще месяц на изучение и попытки писать на низком уровне, набить огромный шишак на лбу, и в итоге не реализовать вообще ничего из задуманного, потому что тупо не хватает времени нырнуть в этот омут. На столько глубоким он выглядит на мой взгляд...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Речь зашла о том, что пакеты вроде как теряются при получении, а не при отправке. Выше скетч приемника, он не отвечает подтверждениями, только слушает.
Ну 'кекс' или как-там - скеч, кривой. Он и пропускает.
 
Сверху Снизу