• Система автоматизации с открытым исходным кодом на базе 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.
Короче, не буду гадать.
У меня работает, так как мне надо.
 
Сверху Снизу