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

Сеть из нескольких esp8266 01-01s (3 шт к примеру)

nikolz

Well-known member
Спасибо nikolz, тепрь все понятно. Согласен смысл есть. На ваш взгляд, можно ли использовать udp для передачи файлов с esp8266 через плохой интернет? Или лучше TCP?
TCP -это протокол передачи длинных сообщений несколькими пакетами через многолучевую сеть.
Именно в такой сети возникает несинхронность прихода пакетов и их потеря.
При этом важна именно целостность длинного сообщения.
В случае с датчиками (умным домом) эти особенности не имеют значение.
Короткие пакеты UDP пролезут там, где застрянут пакеты TCP.
Поэтому для датчиков нет альтернативы UDP.
Собственно BLE - это и есть развитие UDP. А BLE - это теперь стандарт для датчиков и не только.
--------------------
Для примера.
Делал эксперимент по реализации UDP сервера для приема коротких сообщений с датчиков.
Идея в том, чтобы использовать для задачи умного дома очень дешевые виртуальные сервера (
аренда такого сервера не более 10 долларов в год)
В итоге сервер на одноядерном компе смог обеспечить обработку до 50 000 обращений в секунду.
Что вполне достаточно не только для умного дома, но и для умного поселка.
---------------------
Поэтому не вижу каких либо положительных доводов за использование TCP для работы с датчиками.
В общем случая домашняя сеть должна иметь свой протокол, а выход в интернет должен выполнятся с одной единственной точки доступа, для которой не имеет значения энергосбережение или экономия трафика.
 

$Hunter$

Member
А с чего вдруг им взяться?

Если запустили AP, то ее адрес будет 192.168.4.1
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/soft-access-point-class.html?highlight=AP mode#set-up-network

Если вдруг надо с AP обратиться к другой есп, то проще всего и остальным есп назначить постоянные адреса
н.п. вторая 192.168.4.2, третья 192.168.4.3 и.т.д.
Делайте как в примере
https://arduino-esp8266.readthedocs.../station-class.html?highlight=staticIP#config

например для второй должно быть так
IPAddress staticIP(192.168.4.2);
IPAddress gateway(192.168.4.1);
С этим разобрался), спасибо)), но у меня почему-то всё-же не работает никак Udp, помогите пж, вот код:
C#:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

unsigned int localUdpPort = 8888;
char  rep[] = "Hi!";  // ответ
char incomingPacket[255];
WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  Serial.println();
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP("Xia_Bro", "YouAreFuckingCool") ? "Ready" : "Failed!");
  Udp.begin(localUdpPort);
}

void loop() {
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // получаем входящие UDP-пакеты:
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
              //  "Получено %d байт от %s, порт %d%"
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
              //  "Содержимое UDP-пакета: %s"
    String str(incomingPacket);
    if (str == "on") {
      digitalWrite(2, LOW);
    } else if (str == "off") {
      digitalWrite(2, HIGH);
    }
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(rep);
    Udp.endPacket();
  }
}
Точка доступа

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

//конфіги Wi-Fi
IPAddress ip(192, 168, 4, 2);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);

//Конфіги UDP
WiFiUDP Udp;
unsigned int localUdpPort = 8888;
char incomingPacket[255];
char  rep[] = "Hi!";  // ответ

void setup()
{
  Serial.begin(115200);
  Serial.println();
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  WiFi.begin("Xia_Bro", "YouAreFuckingCool");
  Udp.begin(localUdpPort);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  WiFi.config(ip, gateway, subnet);
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
  Udp.begin(localUdpPort);
}

void loop() {
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    int len = Udp.read(incomingPacket, 255);
    if (len > 0) {
      incomingPacket[len] = 0;
    }
    String str(incomingPacket);
    if (str == "on") {
      digitalWrite(2, LOW);
    } else if (str == "off") {
      digitalWrite(2, HIGH);
    }
  }
}
клиент
 

CodeNameHawk

Moderator
Команда форума
Пишите проще, "Угадайте что у меня не работает и чего я хочу."

В клиенте прокоментируйте все строки в Setup и сами увидите неразбериху.

ps. Если двое (две есп) только ждут посылку то не значит, что они ее получат.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Короткие пакеты UDP пролезут там, где застрянут пакеты TCP.
Поэтому для датчиков нет альтернативы UDP.
Собственно BLE - это и есть развитие UDP. А BLE - это теперь стандарт для датчиков и не только.
Это вы от куда взяли? Из своей головы или из cтандартов?
В стандарте протокол низкоуровневой передачи пакетиков по RF - аж набора самого RTU в BLE очень близок к TCP.
Те-же sun/asc :p
А выше уровнем в BLE уже типичный TCP.
В итоге сервер на одноядерном компе смог обеспечить обработку до 50 000 обращений в секунду.
Что вполне достаточно не только для умного дома, но и для умного поселка.
50 000 обращений в секунду при пусть 512 байтных пакетах со всеми лишними заголовочными и синхро-битиками дает поток в 50 000*8*512 = 204 800 000 bit/s.
На подтверждение получения нужно хотя-бы один дополнительный пакет.
В итоге имеем, что вам нужна сетевая карта c PHY от 10 реально дуплексных пропускных Gbps, а разговор идет о ESP с теоретической PHY в 54 Mbps :) :p
 

pvvx

Активный участник сообщества
Вот там и говорится, что лепят новый TCP на UDP, учитывая все наработки TCP. :) :)
Но для реализации использования, т.е. для дома, для хаты, когда можно будет общаться в сети инет по новому протоколу надо подождать лет пятьдесят... или более? - ну когда сменят все оборудование, и это даст выигрыш в скорости на 10% ! :) :)
 

pvvx

Активный участник сообщества
nikolz- Если вы когда то, когда изучите всю эпопею жизни интернет коммуникаций и имеющиеся протоколы, т.е. посерьезней взгляните на ваше недовольство и спор между аббревиатурой “TCP” или “UDP”, то придете к выводу, что всё отличие находится в одном бите пакета и это никак не может изменить скорости и оптимальности передачи! :p
Всё остальное – это как расставлены биты для одного и того-же алгоритма подтверждения и прочих необходимых полей для путешествия пакетика по сети. И кол-во бит всегда одинаково, как и кол-во пакетов для определенных текущих и модных нормативов.
 

pvvx

Активный участник сообщества
Но между TCP и UDP есть глобальное "НО" - текущее доступное оборудование пересылки данных заточено на TCP битик в пакетике, а помеченный как UDP пакетик нещадно скипается. И чем дешевле и старее оборудование - тем больше дропов UDP.
И всё это никак не относится к ESP - они могут соединятся с подтверждением только через LwIP, писанный в том веке, и это TCP. Другого пакета для обслуживания протокола с подтверждением передачи к ESP никто не написал и не будет этого делать.
Реализации QUIC на ESP не вижу.
 

nikolz

Well-known member
Но между TCP и UDP есть глобальное "НО" - текущее доступное оборудование пересылки данных заточено на TCP битик в пакетике, а помеченный как UDP пакетик нещадно скипается. И чем дешевле и старее оборудование - тем больше дропов UDP.
И всё это никак не относится к ESP - они могут соединятся с подтверждением только через LwIP, писанный в том веке, и это TCP. Другого пакета для обслуживания протокола с подтверждением передачи к ESP никто не написал и не будет этого делать.
Реализации QUIC на ESP не вижу.
Очевидно, что я не знал , что Все так сложно, поэтому у меня все работает без проблем.
--------------------------
Большинство моих исследований по энергопотреблению при работе по протоколу UDP,
результаты которых выкладывал на форуме сделаны именно с подтверждением.
------------------------------
Для этого написал на компе сервер на луа (10 строк), который отправлял подтверждение на сообщение ESP.
----------------------------
На ESP ждал подтверждение по тайму.
Либо получал его и отправлял спать, либо не получал и отправлял спать по тайму.
 

$Hunter$

Member
Пишите проще, "Угадайте что у меня не работает и чего я хочу."

В клиенте прокоментируйте все строки в Setup и сами увидите неразбериху.

ps. Если двое (две есп) только ждут посылку то не значит, что они ее получат.
Ну знаете ли, если бы я обладал знаниями по компьютерным сетям, то сюда не обращался бы тратя своё время, а сам всё сделал бы, по этому извиняйте, что я не могу вам на техническом языке описать всё, что надо. Знаете как решить проблему? Подскажите! Нет? Не тратьте ни моё, ни своё время. На клиент при надобности может посылаться пакет для включения устройства по пину, тестю я это пином привязаным к светодиоду, но ничего не приходит (но на точку доступа всё хорошо идёт), а в скетче клиента как по мне всё понятно написано, по-другому меня не учили и я не видел, так что извиняйте за моё написание, да, может ошибка в очерёдности написания кода, так помогите, я пока только учусь
 

CodeNameHawk

Moderator
Команда форума
Посмотрите готовые промеры в ардуиноиде.
А если нет желания учится, есть на сайте платный раздел .

У вас проблема с пониманием работы.
Что бы есп что то приняла, вторая должна что то послать, у вас этого нет, само подключение не в счет и оно не правильное.
 

$Hunter$

Member
Посмотрите готовые промеры в ардуиноиде.
А если нет желания учится, есть на сайте платный раздел .

У вас проблема с пониманием работы.
Что бы есп что то приняла, вторая должна что то послать, у вас этого нет, само подключение не в счет и оно не правильное.
я уж точно не против учиться, было бы откуда, да, ничто никуда не посылает так, как я это делаю с программы на пк для проверки. А в подключении что именно не правильно?
 

nikolz

Well-known member
я уж точно не против учиться, было бы откуда, да, ничто никуда не посылает так, как я это делаю с программы на пк для проверки. А в подключении что именно не правильно?
Ну Вы батенька насмешили. Интернет у Вас есть. Что что, а учиться там можно всему что захотите. Было бы желание.
На форуме эффективнее спрашивать что-то конкретное, а не просить пересказать учебник своими словами.
 

$Hunter$

Member
Ну Вы батенька насмешили. Интернет у Вас есть. Что что, а учиться там можно всему что захотите. Было бы желание.
На форуме эффективнее спрашивать что-то конкретное, а не просить пересказать учебник своими словами.
а я что по вашему делал, вы думаете мне интересно выслушивать эти высказывания, да я так скоро на хинди научусь разговаривать, я кучу всего пересмотрел, но того, что я описал нету! глуп тот, кто не зная почти ничего называет так кого-то
 

$Hunter$

Member
Какой толк вам подсказывать, если вы не делаете то, что уже подсказано?

Это как?
я сделал вообще-то

вот AP:
C++:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

unsigned int port = 8888;
const int PS = 48;
char bufer[PS];
WiFiUDP Udp;

const char* ip = "192.168.4.20";
const int port1 = 999;

void setup() {
  Serial.begin(115200);
  WiFi.softAP("Xia_Bro", "YouAreFuckingCool");
  Udp.begin(port);
}

void loop() {
  int cb = Udp.parsePacket();
  if (cb) {
    Udp.read(bufer, PS);
    String mess = (bufer);
    Serial.println(mess);
  }
  while(true) {
    delay(5000);
    int i = 0;
    Udp.beginPacket(ip, port1);
    Udp.write("on");
    Udp.endPacket();
    delay(5000);
    Udp.beginPacket(ip, port1);
    Udp.write("off");
    Udp.endPacket();
  }
}
первая ESP:
C++:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

//configs of Wi-Fi
IPAddress ip(192, 168, 4, 10);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);

const char* ip1 = "192.168.4.1";
unsigned int port = 8888;
WiFiUDP Udp;

void setup() {
  WiFi.config(ip, gateway, subnet);
  WiFi.begin("Xia_Bro", "YouAreFuckingCool");
}

void loop() {
  while(true) {
    delay(5000);
    int i = 0;
    const char* mess = "hello" + char(i);
    Udp.beginPacket(ip1, port);
    Udp.write(mess);
    Udp.endPacket();
    i++;
  }
}
вот вторая ESP:
C++:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

//configs of Wi-Fi
IPAddress ip(192, 168, 4, 20);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);

//udp settings
const char* ip1 = "192.168.4.1";
unsigned int port = 999;
const int PS = 48;
char bufer[PS];
WiFiUDP Udp;

void setup(){
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin("Xia_Bro", "YouAreFuckingCool");
  Udp.begin(port);
}

void loop() {
  int cb = Udp.parsePacket();
  if (cb) {
    Udp.read(bufer, PS);
    String req = (bufer);
    
    if (req == "on") {
      digitalWrite(2, LOW);
    } else if (req == "off") {
      digitalWrite(2, HIGH);
    }
  }
}
 

nikolz

Well-known member
Начните с малого:
1) если у вас есть роутер с wifi
то запрограммируйте ESP как станцию и подключитесь к своей сети через роутер
выход esp на терминал на компе.
2) если есть смартфон, то запрограммируйте одну esp как AP и подключитесь к ней со смартфона.
выход ESP на терминал на компе.
В итоге Вы поймете как программировать AP и station.
потом сделаете тоже самое но только на двух ESP и с двумя терминалами на компе.
 

$Hunter$

Member
Начните с малого:
1) если у вас есть роутер с wifi
то запрограммируйте ESP как станцию и подключитесь к своей сети через роутер
выход esp на терминал на компе.
2) если есть смартфон, то запрограммируйте одну esp как AP и подключитесь к ней со смартфона.
выход ESP на терминал на компе.
В итоге Вы поймете как программировать AP и station.
потом сделаете тоже самое но только на двух ESP и с двумя терминалами на компе.
спасибо), попробую
 

$Hunter$

Member
Начните с малого:
1) если у вас есть роутер с wifi
то запрограммируйте ESP как станцию и подключитесь к своей сети через роутер
выход esp на терминал на компе.
2) если есть смартфон, то запрограммируйте одну esp как AP и подключитесь к ней со смартфона.
выход ESP на терминал на компе.
В итоге Вы поймете как программировать AP и station.
потом сделаете тоже самое но только на двух ESP и с двумя терминалами на компе.
хорошо, я сделал, всё гуд, теперь всё работает, а как мне сделать синхронизацию отправки получения?? На АР поступили данные из вне для отправки, что та и сделала, они могут быть получены в любой момент, а вот сама АР получает данные каждые 5 секунд. Как не попасть на конфликт при работе. Типа вот данные надо отправить и они же пришли. Всё тот же UDP. Вот чего я хочу добиться: на АР может поступить команда об включении реле, что та и ожидает, а клиент - датчик влажности и температуры периодически отправляет те каждые 5 секунд на АР. И не надо угадывать, чего я хочу, сам написал)
 

CodeNameHawk

Moderator
Команда форума
Вот чего я хочу добиться: на АР может поступить команда об включении реле, что та и ожидает, а клиент - датчик влажности и температуры периодически отправляет те каждые 5 секунд на АР. И не надо угадывать, чего я хочу, сам написал)
Придумайте алгоритм работы есп.

Представьте, что есп это вы и опишите, что вы будите делать, если одновременно один датчик вам "кричит" температуру, а другой кричит включи реле, при этом, когда оба кричат, вы одновременно вы ничего не услышите, ну или услышите только одного.

А потом ваши действия по разруливании ситуаций, перенесите на логику работы есп.
 
Сверху Снизу