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

SoftAP mode в Non-OS SDK

x8973

Member
Приветствую здешних обитателей.
С МК я вроде как уже давно не начинающий, но вот с ESP начал разбираться совсем недавно, а потому имею вопросы, ради которых решил зарегистрироваться здесь, ибо в Интернетах ответов на них не нашел. Беглый поиск по форуму дал только решения на основе Ардуино, коим я не пользуюсь по религиозным и психологическим соображениям.
Собственно, проблема моя состоит в том, что мне не удается поднять точку доступа. В режиме STATION все уже более-менее получается, и даже получилось некое подобие веб-интерфейса сделать на основе espconn. А вот в режимах SOFTAP и STATIONAP тупик. Сеть появляется, в консоль в первом случае выводится следующее:
Код:
mode : softAP(5e:cf:7f:17:53:d4)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
Однако попытка подключиться телефоном ни к чему не приводит. В консоль выводится сообщение "Max connection!", а телефон даже не пытается получить ip-адрес. Подозреваю, что я просто что-то не до конца сделал, но ни одного конкретного примера для Non-OS SDK я так и не смог найти. Собственно, прошу волшебного пенделя в правильном направлении)

Код:
void ICACHE_FLASH_ATTR wifi_callback(System_Event_t *evt)
{
    switch (evt->event)
    {
    case EVENT_SOFTAPMODE_STACONNECTED:
        break;
    case EVENT_SOFTAPMODE_STADISCONNECTED:
        break;
    case EVENT_SOFTAPMODE_PROBEREQRECVED:
        break;
    case EVENT_STAMODE_CONNECTED:
        os_printf("Connected to ssid %s, channel %d\n",
                    evt->event_info.connected.ssid,
                    evt->event_info.connected.channel);
        break;

    case EVENT_STAMODE_DISCONNECTED:
        os_printf("Disconnected from ssid %s, reason %d\n",
                    evt->event_info.disconnected.ssid,
                    evt->event_info.disconnected.reason);

        deep_sleep_set_option( 0 );
        system_deep_sleep( 60 * 1000 * 1000 );  // 60 seconds
        break;

    case EVENT_STAMODE_GOT_IP:
        os_printf("Got IP:" IPSTR ", mask:" IPSTR ", gw:" IPSTR,
                    IP2STR(&evt->event_info.got_ip.ip),
                    IP2STR(&evt->event_info.got_ip.mask),
                    IP2STR(&evt->event_info.got_ip.gw));
        os_printf("\n");

        webserver_init(80);
        registerActionHandler((ActionHandler *)serverActionHandler);
        break;

    default:
        break;
    }
}

void ICACHE_FLASH_ATTR user_init(void)
{
    system_timer_reinit();
    static struct station_config config;
    static struct softap_config ap_config;

    uart_div_modify(0, UART_CLK_FREQ / 115200);

    wifi_set_opmode_current(SOFTAP_MODE);

    gpio_init();

    ap_config.ssid_len = 10;
    ap_config.channel = 5;
    ap_config.authmode = AUTH_WPA2_PSK;
    os_memcpy(&ap_config.ssid, "ESP softAP", 32);
    os_memcpy(&ap_config.password, "password", 64);
    wifi_softap_set_config(&ap_config);

    char ssid[32] = "MyWiFi";
    char pass[64] = "MyPassWd";

    config.bssid_set = 0;
    os_memcpy(&config.ssid, ssid, 32);
    os_memcpy(&config.password, pass, 64);
    wifi_station_set_config(&config);

    wifi_set_event_handler_cb(wifi_callback);
}
 

nikolz

Well-known member
Приветствую здешних обитателей.
С МК я вроде как уже давно не начинающий, но вот с ESP начал разбираться совсем недавно, а потому имею вопросы, ради которых решил зарегистрироваться здесь, ибо в Интернетах ответов на них не нашел. Беглый поиск по форуму дал только решения на основе Ардуино, коим я не пользуюсь по религиозным и психологическим соображениям.
Собственно, проблема моя состоит в том, что мне не удается поднять точку доступа. В режиме STATION все уже более-менее получается, и даже получилось некое подобие веб-интерфейса сделать на основе espconn. А вот в режимах SOFTAP и STATIONAP тупик. Сеть появляется, в консоль в первом случае выводится следующее:
Код:
mode : softAP(5e:cf:7f:17:53:d4)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
Однако попытка подключиться телефоном ни к чему не приводит. В консоль выводится сообщение "Max connection!", а телефон даже не пытается получить ip-адрес. Подозреваю, что я просто что-то не до конца сделал, но ни одного конкретного примера для Non-OS SDK я так и не смог найти. Собственно, прошу волшебного пенделя в правильном направлении)

Код:
void ICACHE_FLASH_ATTR wifi_callback(System_Event_t *evt)
{
    switch (evt->event)
    {
    case EVENT_SOFTAPMODE_STACONNECTED:
        break;
    case EVENT_SOFTAPMODE_STADISCONNECTED:
        break;
    case EVENT_SOFTAPMODE_PROBEREQRECVED:
        break;
    case EVENT_STAMODE_CONNECTED:
        os_printf("Connected to ssid %s, channel %d\n",
                    evt->event_info.connected.ssid,
                    evt->event_info.connected.channel);
        break;

    case EVENT_STAMODE_DISCONNECTED:
        os_printf("Disconnected from ssid %s, reason %d\n",
                    evt->event_info.disconnected.ssid,
                    evt->event_info.disconnected.reason);

        deep_sleep_set_option( 0 );
        system_deep_sleep( 60 * 1000 * 1000 );  // 60 seconds
        break;

    case EVENT_STAMODE_GOT_IP:
        os_printf("Got IP:" IPSTR ", mask:" IPSTR ", gw:" IPSTR,
                    IP2STR(&evt->event_info.got_ip.ip),
                    IP2STR(&evt->event_info.got_ip.mask),
                    IP2STR(&evt->event_info.got_ip.gw));
        os_printf("\n");

        webserver_init(80);
        registerActionHandler((ActionHandler *)serverActionHandler);
        break;

    default:
        break;
    }
}

void ICACHE_FLASH_ATTR user_init(void)
{
    system_timer_reinit();
    static struct station_config config;
    static struct softap_config ap_config;

    uart_div_modify(0, UART_CLK_FREQ / 115200);

    wifi_set_opmode_current(SOFTAP_MODE);

    gpio_init();

    ap_config.ssid_len = 10;
    ap_config.channel = 5;
    ap_config.authmode = AUTH_WPA2_PSK;
    os_memcpy(&ap_config.ssid, "ESP softAP", 32);
    os_memcpy(&ap_config.password, "password", 64);
    wifi_softap_set_config(&ap_config);

    char ssid[32] = "MyWiFi";
    char pass[64] = "MyPassWd";

    config.bssid_set = 0;
    os_memcpy(&config.ssid, ssid, 32);
    os_memcpy(&config.password, pass, 64);
    wifi_station_set_config(&config);

    wifi_set_event_handler_cb(wifi_callback);
}
1) посмотрите док на SDK там есть примеры.
2) А у Вас случаем роутер в квартире не создает ту же самую сеть?
 

x8973

Member
1) посмотрите док на SDK там есть примеры.
Это который? Если речь идет об Api Reference, то там в разделе А.4 описано именно то, что я уже сделал. Мне кажется, что проблема не в настройке АР, тем более что точка доступа поднимается, а в обработке эвентов PROBEREQRECVED, CONNECTED и DISCONNECTED.
Домашняя сеть имеет другое имя.
 

nikolz

Well-known member
Это который? Если речь идет об Api Reference, то там в разделе А.4 описано именно то, что я уже сделал. Мне кажется, что проблема не в настройке АР, тем более что точка доступа поднимается, а в обработке эвентов PROBEREQRECVED, CONNECTED и DISCONNECTED.
Домашняя сеть имеет другое имя.
 

Вложения

x8973

Member
Да, вот именно этот документ я уже исследовал вдоль и поперек. В примере использования wifi_set_event_handler_cb() приведена обработка событий connected и disconnected, а у меня до них дело даже не доходит.
 

nikolz

Well-known member
Да, вот именно этот документ я уже исследовал вдоль и поперек. В примере использования wifi_set_event_handler_cb() приведена обработка событий connected и disconnected, а у меня до них дело даже не доходит.
посмотрите свалку pvvx в качестве примера.
---------------
еще в доке пример стр 50
 

x8973

Member
Ну в общем-то результаты следующие:
- установка диапазона адресов для DHCP-сервера со страницы 50 не помогла;
- в каталоге examples в SDK хоть какое-то упоминание SOFTAP или STATIONAP нашел лишь в примере IoT_Demo. Ситуация не прояснилась.
Пытаюсь шерстить гитхаб товарища pvvx и ардуиновскую либу ESP8266WiFi.
 

x8973

Member
Внезапно проблема решилась установкой ap_config.max_connection в 255. Это странно, учитывая комментарий в user_interface.h:
Код:
struct softap_config {
    ...
    uint8 max_connection;    // Note: default 4, max 4
    ...
};
 

pvvx

Активный участник сообщества
Внезапно проблема решилась установкой ap_config.max_connection в 255. Это странно, учитывая комментарий в user_interface.h:
Код:
struct softap_config {
    ...
    uint8 max_connection;    // Note: default 4, max 4
    ...
};
В коде либ все равно нет больше буферов. Они и частью статические. Пересборка всех исходников может помочь, но исходников на RF дрова нет.
 

nuprosto4uvak

New member
Это в коде, перед настройкой WiFi SoftAP.
у меня на это

"WiFi.softap_config_max.connection = 8;"
ругается вот так
'class ESP8266WiFiClass' has no member named 'softap_config_max'
а если так
"softap_config_max.connection = 8;"
вот такое сообщение
"'softap_config_max' was not declared in this scope"

я неправильно записал как-то?
 

x8973

Member
у меня на это

"WiFi.softap_config_max.connection = 8;"
ругается вот так
'class ESP8266WiFiClass' has no member named 'softap_config_max'
а если так
"softap_config_max.connection = 8;"
вот такое сообщение
"'softap_config_max' was not declared in this scope"

я неправильно записал как-то?
Я не разбираюсь в Ардуиновской библиотеке, но как минимум у вас стоит точка не там, где надо. Ну и компилятор вам прямо говорит, что нет такого члена в классе. Смотрите, может быть у этого класса есть метод, поименованный как-нибудь типа setMaxConnection().
 

x8973

Member
В описании этого класса я вообще не нашел упоминаний этой переменной. Придется вам ждать кого-то, кто знает Ардуино лучше меня)
 

nuprosto4uvak

New member
Я не разбираюсь в Ардуиновской библиотеке, но как минимум у вас стоит точка не там, где надо. Ну и компилятор вам прямо говорит, что нет такого члена в классе. Смотрите, может быть у этого класса есть метод, поименованный как-нибудь типа setMaxConnection().
Спасибо! нашел это в библиотеке
softAP(const String& ssid,const String& passphrase = emptyString,int channel = 1,int ssid_hidden = 0,int max_connection = 4);

компилируется даже с такими значениями: WiFi.softAP(APSSID,PASSWORD,1,0,32). Жаль нечем проверить, что оно 32 устройства подключит.
 

x8973

Member
Я у себя там как поставил 255, так оно и стоит. Работе не мешает.
 
Сверху Снизу