• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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, так оно и стоит. Работе не мешает.
 
Сверху Снизу