• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

проблема с UDP-сокетом

Протестировал следующий код на C
Код:
#include <ets_sys.h>
#include "user_interface.h"
#include <osapi.h>
#include <os_type.h>
#include <gpio.h>
#include <espconn.h>
#include <ets_sys.h>
#include <c_types.h>
#include <mem.h>


// see eagle_soc.h for these definitions
#define LED_GPIO 2
#define LED_GPIO_MUX PERIPHS_IO_MUX_GPIO2_U
#define LED_GPIO_FUNC FUNC_GPIO2

#define DELAY 1000 /* milliseconds */

LOCAL os_timer_t blink_timer;
LOCAL uint8_t led_state=0;
struct espconn myUdp;

LOCAL void ICACHE_FLASH_ATTR blink_cb(void *arg)
{
    espconn_sendto(&myUdp, "hello", 6);
}

uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 8;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}

void ICACHE_FLASH_ATTR
myUdp_recv(void *arg, char *pusrdata, unsigned short len){
    // Если приняли пакет меняем состояние светодиода
    GPIO_OUTPUT_SET(LED_GPIO, led_state);
    led_state ^=1;

    espconn_sendto(&myUdp, "echo", 5);

    os_printf(pusrdata);
    os_printf("\n");
}

void ICACHE_FLASH_ATTR
create_socket(void){
    myUdp.type=ESPCONN_UDP;
    myUdp.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp));
    myUdp.proto.udp->local_port = 8888;
    myUdp.proto.udp->remote_port = 8888;

    myUdp.proto.udp->local_ip[0] = 172;
    myUdp.proto.udp->local_ip[1] = 23;
    myUdp.proto.udp->local_ip[2] = 4;
    myUdp.proto.udp->local_ip[3] = 44;

    myUdp.proto.udp->remote_ip[0] = 255;
    myUdp.proto.udp->remote_ip[1] = 255;
    myUdp.proto.udp->remote_ip[2] = 255;
    myUdp.proto.udp->remote_ip[3] = 255;

    espconn_regist_recvcb(&myUdp, myUdp_recv);
    espconn_create(&myUdp);
}

void ICACHE_FLASH_ATTR
conect_WiFi(void){
    const char ssid[32] = "XXXXX";
    const char password[32] = "XXXXXXXXXX";
    struct station_config stationConf;
    wifi_set_opmode( STATION_MODE );
    os_memcpy(&stationConf.ssid, ssid, 32);
    os_memcpy(&stationConf.password, password, 32);
    wifi_station_set_config(&stationConf);
    wifi_station_connect();
}

void ICACHE_FLASH_ATTR
setTimer(void){
    PIN_FUNC_SELECT(LED_GPIO_MUX, LED_GPIO_FUNC);
    os_timer_disarm(&blink_timer);
    os_timer_setfn(&blink_timer, (os_timer_func_t *)blink_cb, (void *)0);
    os_timer_arm(&blink_timer, DELAY, 1);
}

void ICACHE_FLASH_ATTR user_init(void)
{
    conect_WiFi();
    create_socket();
    setTimer();
}
1 час 38 минут
Тоже самое, перестал принимать но продолжает отправлять "hello"
 

nikolz

Well-known member
Протестировал следующий код на C
1 час 38 минут
Тоже самое, перестал принимать но продолжает отправлять "hello"
Я запустил подобный тест, без deep-sleep ,результат сообщу позже.
Пока могу сказать, что у Вас в программе, на мой взгяд , три ошибки.
Я о них уже писал другим страдающим от обрыва связи.
Перечислю еще раз:
1) нет функции wifi_station_set_auto_connect(1);
2) нет функции wifi_station_set_reconnect_policy(true);
3) нет проверки состояния при отправке сообщения.
Исправьте указанные ошибки
 
Последнее редактирование:

nikolz

Well-known member
пока вот такой результат:
число пакетов;дата и время текущего; интервал в сек
7490;11/14/16 12:37:55;1
т е 7490 пакетов или 7490 секунд.
Полет нормальный.
Летим дальше.
 
Ну не работает! Полтора часа и всё.
Код:
#include <ets_sys.h>
#include "user_interface.h"
#include <osapi.h>
#include <os_type.h>
#include <gpio.h>
#include <espconn.h>
#include <ets_sys.h>
#include <c_types.h>
#include <mem.h>


// see eagle_soc.h for these definitions
#define LED_GPIO 2
#define LED_GPIO_MUX PERIPHS_IO_MUX_GPIO2_U
#define LED_GPIO_FUNC FUNC_GPIO2

#define DELAY 1000 /* milliseconds */

LOCAL os_timer_t blink_timer;
LOCAL uint8_t led_state=0;
struct espconn myUdp;


uint32 ICACHE_FLASH_ATTR user_rf_cal_sector_set(void)
{
    enum flash_size_map size_map = system_get_flash_size_map();
    uint32 rf_cal_sec = 0;

    switch (size_map) {
        case FLASH_SIZE_4M_MAP_256_256:
            rf_cal_sec = 128 - 8;
            break;

        case FLASH_SIZE_8M_MAP_512_512:
            rf_cal_sec = 256 - 5;
            break;

        case FLASH_SIZE_16M_MAP_512_512:
        case FLASH_SIZE_16M_MAP_1024_1024:
            rf_cal_sec = 512 - 5;
            break;

        case FLASH_SIZE_32M_MAP_512_512:
        case FLASH_SIZE_32M_MAP_1024_1024:
            rf_cal_sec = 1024 - 5;
            break;

        default:
            rf_cal_sec = 0;
            break;
    }

    return rf_cal_sec;
}

void ICACHE_FLASH_ATTR
myUdp_recv(void *arg, char *pusrdata, unsigned short len){
    // Если приняли пакет меняем состояние светодиода
    GPIO_OUTPUT_SET(LED_GPIO, led_state);
    led_state ^=1;
}

void ICACHE_FLASH_ATTR
create_socket(void){
    myUdp.type=ESPCONN_UDP;
    myUdp.proto.udp = (esp_udp *)os_zalloc(sizeof(esp_udp));
    myUdp.proto.udp->local_port = 8888;
    myUdp.proto.udp->remote_port = 8888;

    myUdp.proto.udp->local_ip[0] = 172;
    myUdp.proto.udp->local_ip[1] = 23;
    myUdp.proto.udp->local_ip[2] = 4;
    myUdp.proto.udp->local_ip[3] = 44;

    myUdp.proto.udp->remote_ip[0] = 255;
    myUdp.proto.udp->remote_ip[1] = 255;
    myUdp.proto.udp->remote_ip[2] = 255;
    myUdp.proto.udp->remote_ip[3] = 255;

    espconn_regist_recvcb(&myUdp, myUdp_recv);
    espconn_create(&myUdp);
}

void ICACHE_FLASH_ATTR
conect_WiFi(void){
    const char ssid[32] = "VOID";
    const char password[32] = "xxxxxxxxx";
    struct station_config stationConf;
    wifi_set_opmode( STATION_MODE );
    os_memcpy(&stationConf.ssid, ssid, 32);
    os_memcpy(&stationConf.password, password, 32);
    wifi_station_set_config(&stationConf);
    wifi_station_set_auto_connect(1);
    wifi_station_set_reconnect_policy(true);
    wifi_station_connect();
}


void ICACHE_FLASH_ATTR user_init(void)
{
    conect_WiFi();
    create_socket();
}
 

nikolz

Well-known member
51142;11/15/16 00:50:42;1
испытание остановил.
Работает без проблем.
 

pvvx

Активный участник сообщества
1 час 38 минут
Тоже самое, перестал принимать но продолжает отправлять "hello"
Со station у ESP такая странность - открытое соединение по TCP держит дольше, чем закрытые.
Websocket работает, а обращение к другим портам на модуле отваливается. Через время и Websocket отваливается, но часто перед этим начинает ужасно тормозить и в логах сплошные реконнекты TCP.
 

nikolz

Well-known member
Со station у ESP такая странность - открытое соединение по TCP держит дольше, чем закрытые.
Websocket работает, а обращение к другим портам на модуле отваливается. Через время и Websocket отваливается, но часто перед этим начинает ужасно тормозить и в логах сплошные реконнекты TCP.
Вы заголовок темы прочитайте.
 

pvvx

Активный участник сообщества
Вы заголовок темы прочитайте.
Я и говорю - не отвечает на UDP запросы. Но при этом держит открытый TCP. Heap не переполняется - там всё хорошо.
Всё по теме автора, как он и описывает. (Вы уж перечитайте...). Только время работы зависит от кол-ва рядом работающих WiFi модулей.
Сопутствующие странности - при обращении к модулю, когда "отвалился", начинает мешать работать другим модулям. Очень похоже на проблемы в WiFi части.

Откатил SDK на V1.5.4. Пока полет нормальный...
 
Последнее редактирование:

nikolz

Well-known member
Я и говорю - не отвечает на UDP запросы. Но при этом держит открытый TCP. Heap не переполняется - там всё хорошо.
Всё по теме автора, как он и описывает. (Вы уж перечитайте...). Только время работы зависит от кол-ва рядом работающих WiFi модулей.
Сопутствующие странности - при обращении к модулю, когда "отвалился", начинает мешать работать другим модулям. Очень похоже на проблемы в WiFi части.

Откатил SDK на V1.5.4. Пока полет нормальный...
В тесте у него вроде бы нет создание сокета TCP.
У меня тоже подобный тест и все работает, если связь теряется ,то автоматом восстанавливается.
---------------------------------
Зеркало не виновато.
 

pvvx

Активный участник сообщества
В тесте у него вроде бы нет создание сокета TCP.
У меня тоже подобный тест и все работает, если связь теряется ,то автоматом восстанавливается.
---------------------------------
Зеркало не виновато.
С памятью всё хорошо, кроме udp сервера работает http с нём всё нормально.
nikolz - Посмотрели в зеркало? :)
Не надоело ли гнать рекламу, вместо поиска как исправить очередную кривую прошивку от Espressif?
------
C SDK 1.5.4 полет продолжается...
 
Последнее редактирование:

nikolz

Well-known member
nikolz - Посмотрели в зеркало? :)
Не надоело ли гнать рекламу, вместо поиска как исправить очередную кривую прошивку от Espressif?
------
C SDK 1.5.4 полет продолжается...
Я понимаю, что Вы медленно читаете, но
посмотрите дальше по теме, там где это написано:
"Ну не работает! Полтора часа и всё."
Там нет никакого TCP.
И обсуждался этот тест и его результаты.
-----------------------
Не надо ругать зеркало.
 

pvvx

Активный участник сообщества
Я понимаю, что Вы медленно читаете, но
посмотрите дальше по теме, там где это написано:
"Ну не работает! Полтора часа и всё."
Там нет никакого TCP.
И обсуждался этот тест и его результаты.
-----------------------
Не надо ругать зеркало.
Если действительно хотите найти и устранить причину глюков в EPS, то:
Известные условия теста: Несколько модулей WiFi включать и выключать рядом с испытуемым.
Испытуемого желательно опрашивать постоянно и наглядно убедиться, что когда включается рядом другой модуль – будут дыры в связи с ним. На других модулях, не Espressif, такого нет.
Работу испытуемого прервать кнопкой reset на передаче или начать перепрограммировать – пронаблюдать падение всей WiFi сети от данной “глушилки”.
Когда отвалиться от AP, дать пинг на испытуемого и наблюдать как прервется вся связь с другими модулями у данной AP. “Глушилка” что хочет сказать AP, но её никто не понимает :)
Кроме "глушения" всех, ESP8266 c китай прошивкой ещё страдает глухотой и невозможностью сопровождать соединение WiFi в группе. Возможно у него нарушена работа АРУ...
Ну и т.д. :)
 
Последнее редактирование:

nikolz

Well-known member
Если действительно хотите найти и устранить причину глюков в EPS, то:
Известные условия теста: Несколько модулей WiFi включать и выключать рядом с испытуемым.
Испытуемого желательно опрашивать постоянно и наглядно убедиться, что когда включается рядом другой модуль – будут дыры в связи с ним. На других модулях, не Espressif, такого нет.
Работу испытуемого прервать кнопкой reset на передаче или начать перепрограммировать – пронаблюдать падение всей WiFi сети от данной “глушилки”.
Когда отвалиться от AP, дать пинг на испытуемого и наблюдать как прервется вся связь с другими модулями у данной AP. “Глушилка” что хочет сказать AP, но её никто не понимает :)
Ну и т.д. :)
А если в одну тарелку накрошить картошку огурцы помидоры свеклу , то получится винигрет.
------------------------
Это не эксперимент, а нагромождение всего, что есть под рукой.
-----------------------------------------
Почитайте теорию научного познания и как ставить эксперименты, чтобы понять причину.
Иначе так и будете ругать китайцев, а не устранять причину.
В вашей постановке эксперимента куча изменяющихся параметров , поэтому причина может быть любая, как правило совершенно не та, которую думает экспериментатор.
 

pvvx

Активный участник сообщества
А если в одну тарелку накрошить картошку огурцы помидоры свеклу , то получится винигрет.
------------------------
Это не эксперимент, а нагромождение всего, что есть под рукой.
-----------------------------------------
Почитайте теорию научного познания и как ставить эксперименты, чтобы понять причину.
Иначе так и будете ругать китайцев, а не устранять причину.
В вашей постановке эксперимента куча изменяющихся параметров , поэтому причина может быть любая, как правило совершенно не та, которую думает экспериментатор.
Вы предлагаете выделенный тест - одна AP и одын модуль ESP в бункере?
Так китайцы и купили на него сертификат. По этому проверять такое нет смысла - рекламщик nikolz сошлется, что надо перегружать модуль в случаях помех и при работе в реальной обстановке. Сравнить работу китайской проделки с SDK 2.0.0 ESP nikolz-у не с чем...
 

nikolz

Well-known member
Вы предлагаете выделенный тест - одна AP и одын модуль ESP в бункере?
Так китайцы и купили на него сертификат. По этому проверять такое нет смысла - рекламщик nikolz сошлется, что надо перегружать модуль в случаях помех и при работе в реальной обстановке. Сравнить работу китайской проделки с SDK 2.0.0 ESP nikolz-у не с чем...
Я предлагаю сначала сформулировать вопрос на который должен дать ответ эксперимент.
Например, Ваш эксперимент поставлен для ответа на какой вопрос?
 

pvvx

Активный участник сообщества
Я предлагаю сначала сформулировать вопрос на который должен дать ответ эксперимент.
Например, Ваш эксперимент поставлен для ответа на какой вопрос?
Пока не удается выловить причину отваливания station в ESP с последним SDK.
Происходит это при описанных условиях, стихийно, без четкой логики. Вот когда найду, твердое, то и конкретизирую. А пока ESP не позволяет произвести никакой диагностики. При отваливании station через клиента её AP, считывается, что всё у неё со station хорошо - GOT_IP, все IP и открытые порты...
Надеюсь, у вас есть какой телефон или другая вещь с WiFi - это позволит вам пронаблюдать выше описанное при подключении к одной AP. Так что отссылки, что у вас один модуль не прокатят :)

Да - модуль с SDK 1.5.4 пока ещё не отвалился. Условия у него те-же (изменена только прошивка), но пока не отваливается.
 
Последнее редактирование:

nikolz

Well-known member
Пока не удается выловить причину отваливания station в ESP с последним SDK.
Происходит это при описанных условиях, стихийно, без четкой логики. Вот когда найду, твердое, то и конкретизирую. А пока ESP не позволяет произвести никакой диагностики. При отваливании station через клиента её AP, считывается, что всё у неё со station хорошо - GOT_IP, все IP и открытые порты...
Надеюсь, у вас есть какой телефон или другая вещь с WiFi - это позволит вам пронаблюдать выше описанное при подключении к одной AP. Так что отссылки, что у вас один модуль не прокатят :)

Да - модуль с SDK 1.5.4 пока ещё не отвалился. Условия у него те-же (изменена только прошивка), но пока не отваливается.
У меня много модулей. Но пока озадачен другими вопросами, так как у меня станция не отваливается, хотя и наблюдалось такое раньше, но я это решил на основе SDk
Я Вам задавал свои вопросы в переписке, но Вы не сочли нужным на них ответить.
Поэтому - спасение утопающих -дело рук самих утопающих.
-----------------------------------------
Возможно что Вы используете tCP а мне оно не нужно, я использую UDP.
Короче, не буду гадать.
У меня работает, так как мне надо.
 
Сверху Снизу