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

Нужна помощь Не стабильная работа клиента.

kvs

New member
После нескольких минут работы происходит полное зависание или перезапуск скетча. Скрин в момент перезапуске и скетч прилагаю. Обработка ответа на сервере:

HTTP.send(200, "text/plain", "ok");
 

Вложения

NeoroN

Member
А принятый ответ типа не надо обрабатывать? Засирается входной буфер, возможно утечка памяти в клиенте, нужно правильно завершать отправку данных.
 

kvs

New member
А принятый ответ типа не надо обрабатывать? Засирается входной буфер, возможно утечка памяти в клиенте, нужно правильно завершать отправку данных.
У меня было так:
delay(800);
String s = "Прием - ";
while (client.available())
{
char c = client.read();
s += c;
}
Serial.println(s);

Задержка 800 мс. очень большая, хотя в примере была 50. Я пробовал уменьшать до 600-700мс., но ответ начинает иногда пропадать! Как уменьшить это время.
А можно в клиенте для приема использовать типа HTTP.send(200, "text/plain", "ok"); библиотеки <ESP8266WebServer.h> ?
 

Алексей.

Active member
kvs,
В деструкторе ~WiFiClient() сокет не закрывается, удивительно что в вашем коде закоментарен client.stop(), если со стороны сервера соединение не закрывать, вы рискуете на клиенте исчерпать все сокеты.
В примере WiFiClientBasic.ino если соединение установлено то в конце обработки вызывается client.stop(),
но в другом примере WiFiClient.ino забывают вызывать client.stop() для случая кода ответ принят (видимо считают что сервер всегда закрывает соединение) и не забывают если в течении таймаута ответ от сервера не приходит. Там же код ожидания ответа от сервера без каких либо delay-ев после отправки запроса, просто сначала в течении 5-ти секунд ожидают начало ответа
Код:
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
 

kvs

New member
kvs,
В деструкторе ~WiFiClient() сокет не закрывается, удивительно что в вашем коде закоментарен client.stop(), если со стороны сервера соединение не закрывать, вы рискуете на клиенте исчерпать все сокеты.
В примере WiFiClientBasic.ino если соединение установлено то в конце обработки вызывается client.stop(),
но в другом примере WiFiClient.ino забывают вызывать client.stop() для случая кода ответ принят (видимо считают что сервер всегда закрывает соединение) и не забывают если в течении таймаута ответ от сервера не приходит. Там же код ожидания ответа от сервера без каких либо delay-ев после отправки запроса, просто сначала в течении 5-ти секунд ожидают начало ответа
Код:
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }
С client.stop() вы правы, я закомментировал когда пробовал разные варианты. Меня не устраивает большое время приема ответа на которое зависает программа. Да и данные передавать необходимо через каждые 500-1000мс.

Хочу попробовать передавать данные между устройствами esp8266) get запросами, а принимать функцией библиотеки <ESP8266WebServer.h> без выдачи ответа.
 

Алексей.

Active member
Хочу попробовать передавать данные между устройствами esp8266) get запросами, а принимать функцией библиотеки <ESP8266WebServer.h> без выдачи ответа.
Жесть какая, зачем вообще в таком случае http протокол? Метод GET использовать не для получения данных от сервера? А сервер на метод GET не должен отвечать??? Если сервер (http сервер) не должен отвечать на запрос, то теряется смысл в запросе, типа мы отправили запрос в черную дыру и нам уже все равно.
 

kvs

New member
Жесть какая, зачем вообще в таком случае http протокол? Метод GET использовать не для получения данных от сервера? А сервер на метод GET не должен отвечать??? Если сервер (http сервер) не должен отвечать на запрос, то теряется смысл в запросе, типа мы отправили запрос в черную дыру и нам уже все равно.

Мне нужно к серверу подключить несколько клиентов.
Сервер должен передавать данные и управляющие сигналы клиентам (в произвольном порядке). В свою очередь клиенты должны передавать данные по мере готовности. Поэтому в мгновенный ответе, от клиентов нет большой необходимости. Отследить отсутствие или неисправность клиента легко в программе сервера при необходимости.
Если есть возможность подскажите или опишите правильный алгоритм обмена между сервером и клиентами. Или где если есть можно посмотреть примеры подобных устройств.
Спасибо.
 

Алексей.

Active member
Сервер должен передавать данные и управляющие сигналы клиентам (в произвольном порядке). В свою очередь клиенты должны передавать данные по мере готовности.
тут у вас роль http сервера и клиента меняется, получается сервер дает команду а клиент по мере готовности отвечает.

Не понятно что хотите получить?
Клиенты подключаются к серверу и ожидают от него команд? А сервер с интервалом 500-1000мс отправляет данные и управляющие сигналы клиентам и ожидает от клиентов ответа?
Если это так то получается http сервер должен быть на каждом устройстве которому нужно передавать данные и управляющие сигналы, а устройство обрабатывало запрос и по мере готовности отправляло ответ.
 

kvs

New member
Алексей.,
тут у вас роль http сервера и клиента меняется, получается сервер дает команду а клиент по мере готовности отвечает.

Не понятно что хотите получить?
Клиенты подключаются к серверу и ожидают от него команд? А сервер с интервалом 500-1000мс отправляет данные и управляющие сигналы клиентам и ожидает от клиентов ответа?
Если это так то получается http сервер должен быть на каждом устройстве которому нужно передавать данные и управляющие сигналы, а устройство обрабатывало запрос и по мере готовности отправляло ответ.
Я применяю мультирежим - WIFI_AP_STA.

Часть блок-схемы накидал и прилагаю в файле. Передача данных от сервера к устройству нужна без ответа от устройства (точнее ответ не требуется), и обратно передача данных от устройства к серверу без ответа. Это не запрос данных с их ответом, а просто передача данных. (например, в течении минуты сервер передал 5 раз, а клиент -> серверу 1 раз).

Обмен с сервером и передача данных от клиентов на сервер вроде получилось. Стал делать передачу от сервера -> клиенту запутался и ………

Короче, я в этой области новичок и если есть возможность помогите разобраться как написать программу (какие режимы применить у клиентов и сервера и т.д.) по этой блок-схеме.
Спасибо.
 

Вложения

Алексей.

Active member
Обмен с сервером и передача данных от клиентов на сервер вроде получилось. Стал делать передачу от сервера -> клиенту запутался и ………
Если передача от одного устройства (от клиента) другому устройству (серверу) получилась, то чем отличается передача от сервера клиенту?

Короче, я в этой области новичок и если есть возможность помогите разобраться как написать программу (какие режимы применить у клиентов и сервера и т.д.) по этой блок-схеме.
На схеме совсем не понятно назначение роутера и телефона, зачем они?
Если хотите организовать сеть между сервером и клиентами (до 4-х клиентов) то на сервере достаточно включить wifi в режиме ap а на клиентах в sta.
 

kvs

New member
Если передача от одного устройства (от клиента) другому устройству (серверу) получилась, то чем отличается передача от сервера клиенту?


На схеме совсем не понятно назначение роутера и телефона, зачем они?
Если хотите организовать сеть между сервером и клиентами (до 4-х клиентов) то на сервере достаточно включить wifi в режиме ap а на клиентах в sta.

Попорядку:

  1. Передача (не ответ) от клиента к серверу у меня не получается. Я делал GET – передачей.

  2. Телефон нужен для настройки устройств, подключения/отключения новых устройств, считывания данных от устройств и сервера и т.д. Телефон подключен через роутер для того что бы одновременно выходить в интернет и иметь связь с устройствами. Хотя есть возможность подключится к серверу без роутера - напрямую. ЭТО ВСЕ РАБОТАЕТ!

  3. На схеме клиентов не 4-е, а 1,2,3….N. Клиенты у меня в режиме STA а сервер в режиме AP_STA. Причину я объяснил в пункте 2.

    Вопрос у меня пока только один, как организовать передачу данных от сервера к клиенту с учетом моей блок-схемы. Мне нужно передавать данные без запроса от клиента!
 

kvs

New member
Попорядку:

  1. Передача (не ответ) от клиента к серверу у меня не получается. Я делал GET – передачей.

  2. Телефон нужен для настройки устройств, подключения/отключения новых устройств, считывания данных от устройств и сервера и т.д. Телефон подключен через роутер для того что бы одновременно выходить в интернет и иметь связь с устройствами. Хотя есть возможность подключится к серверу без роутера - напрямую. ЭТО ВСЕ РАБОТАЕТ!

  3. На схеме клиентов не 4-е, а 1,2,3….N. Клиенты у меня в режиме STA а сервер в режиме AP_STA. Причину я объяснил в пункте 2.

    Вопрос у меня пока только один, как организовать передачу данных от сервера к клиенту с учетом моей блок-схемы. Мне нужно передавать данные без запроса от клиента!
У вас была фраза "Если хотите организовать сеть между сервером и клиентами (до 4-х клиентов)", если можно поподробнее.
 

Алексей.

Active member
У вас была фраза "Если хотите организовать сеть между сервером и клиентами (до 4-х клиентов)", если можно поподробнее.
Вы используете режим AP+STA, обратите внимание на структуру параметров для режима AP
Код:
struct softap_config {
    uint8 ssid[32];
    uint8 password[64];
    uint8 ssid_len;    // Note: Recommend to set it according to your ssid
    uint8 channel;    // Note: support 1 ~ 13
    AUTH_MODE authmode;    // Note: Don't support AUTH_WEP in softAP mode.
    uint8 ssid_hidden;    // Note: default 0
    uint8 max_connection;    // Note: default 4, max 4
    uint16 beacon_interval;    // Note: support 100 ~ 60000 ms, default 100
};
Вы можете попробовать установить max_connection более максимально возможного для сдк, я не пробовал, может у вас получится подключить большее количество клиентов, это было одной из причин отказаться от есп8266 и использовать есп32, но из за плавающего пинга (от неожиданных лагов на wifi) сейчас рассматривается использование более дорогого медиатека (600р против 200р за есп32)
 

kvs

New member
Вы используете режим AP+STA, обратите внимание на структуру параметров для режима AP
Код:
struct softap_config {
    uint8 ssid[32];
    uint8 password[64];
    uint8 ssid_len;    // Note: Recommend to set it according to your ssid
    uint8 channel;    // Note: support 1 ~ 13
    AUTH_MODE authmode;    // Note: Don't support AUTH_WEP in softAP mode.
    uint8 ssid_hidden;    // Note: default 0
    uint8 max_connection;    // Note: default 4, max 4
    uint16 beacon_interval;    // Note: support 100 ~ 60000 ms, default 100
};
Вы можете попробовать установить max_connection более максимально возможного для сдк, я не пробовал, может у вас получится подключить большее количество клиентов, это было одной из причин отказаться от есп8266 и использовать есп32, но из за плавающего пинга (от неожиданных лагов на wifi) сейчас рассматривается использование более дорогого медиатека (600р против 200р за есп32)
Подскажите для начинающего как или где посмо
Вы используете режим AP+STA, обратите внимание на структуру параметров для режима AP
Код:
struct softap_config {
    uint8 ssid[32];
    uint8 password[64];
    uint8 ssid_len;    // Note: Recommend to set it according to your ssid
    uint8 channel;    // Note: support 1 ~ 13
    AUTH_MODE authmode;    // Note: Don't support AUTH_WEP in softAP mode.
    uint8 ssid_hidden;    // Note: default 0
    uint8 max_connection;    // Note: default 4, max 4
    uint16 beacon_interval;    // Note: support 100 ~ 60000 ms, default 100
};
Вы можете попробовать установить max_connection более максимально возможного для сдк, я не пробовал, может у вас получится подключить большее количество клиентов, это было одной из причин отказаться от есп8266 и использовать есп32, но из за плавающего пинга (от неожиданных лагов на wifi) сейчас рассматривается использование более дорогого медиатека (600р против 200р за есп32)
Подскажите для начинающего как организовать или где посмотреть примерчик обмена сервера и 4- клиентов.
 

Алексей.

Active member
max_connection - максимальное количество wifi клиентов, не путай те с максимальным количеством tcp соединений, для начала можно почитать то что дает производитель оборудования
примеры в ардуине для WIFI_AP - DNSServer.ino WiFiEvents.ino для WiFiServer - SimpleServerWiFi.ino
можно посмотреть и папку с примерами, кое что интересное попадается :)
 

kvs

New member
max_connection - максимальное количество wifi клиентов, не путай те с максимальным количеством tcp соединений, для начала можно почитать то что дает производитель оборудования
примеры в ардуине для WIFI_AP - DNSServer.ino WiFiEvents.ino для WiFiServer - SimpleServerWiFi.ino
можно посмотреть и папку с примерами, кое что интересное попадается :)
Well documentation in English for me - a hard case! Since I have not studied it properly in my time, now I am suffering!
Короче буду пробовать другие варианты.....
Спасибо.
 
Сверху Снизу