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

Одна esp не видит другую.

kript0n

New member
Одна esp работает в режиме SOFTAP и раздает сеть, вторая должна к ней подключиться, но наотказ отказывается ее видеть. Компьютер и телефон прекрасно подключаются.

Не буду долго ходить вокруг да около...
Код подключающейся esp:
Код:
LOCAL void ICACHE_FLASH_ATTR scan_done_cb(void *arg, STATUS status)
{
    if(status == OK)
    {
        #ifdef DEBUG
        os_printf("Scan done\r\n");
        #endif // DEBUG
        struct bss_info *info = (struct bss_info*)arg;

        while(info != NULL)
        {
            #ifdef DEBUG
            os_printf("SSID: %s\tChannel: %d\r\n", info->ssid, info->channel);
            #endif // DEBUG

            info = info->next.stqe_next;
        }
    }
}


LOCAL bool ICACHE_FLASH_ATTR WIFI_init(void)
{
    struct station_config st_conf; // = //(struct station_config*)os_zalloc(sizeof(station_config));
    char ssid[32] = ACCESS_POINT_SSID;
    char pwd[64] = ACCESS_POINT_PWD;
    os_memcpy(&st_conf.ssid, ssid, 32);
    os_memcpy(&st_conf.password, pwd, 64);
    st_conf.bssid_set = 0;

    if(!wifi_set_opmode(STATION_MODE))
    {
        #ifdef DEBUG
        os_printf("Failed to set opmode\r\n");
        #endif // DEBUG
    }

    if(!wifi_set_channel(ACCESS_POINT_CHANNEL))
    {
        #ifdef DEBUG
        os_printf("Failed to set channel\r\n");
        #endif // DEBUG

        return false;
    }

    if(!wifi_station_set_config(&st_conf))
    {
        #ifdef DEBUG
        os_printf("Failed to set config\r\n");
        #endif // DEBUG
        return false;
    }

    return true;
}


LOCAL void ICACHE_FLASH_ATTR WIFI_start_scan(void)
{
    struct scan_config conf;
    conf.ssid = ACCESS_POINT_SSID;
    conf.bssid = NULL;
    conf.channel = ACCESS_POINT_CHANNEL;
    conf.show_hidden = TRUE;
    wifi_station_scan(&conf, scan_done_cb);
}


void ICACHE_FLASH_ATTR WIFI_connect(void)
{
    if(!WIFI_init())
    {
        #ifdef DEBUG
        os_printf("Initialization failed\r\n");
        #endif // DEBUG
    }

    WIFI_start_scan();
/*
    if(!wifi_station_connect())
    {
        #ifdef DEBUG
        os_printf("Failed to connect\r\n");
        #endif // DEBUG
    }*/
}
В user_init устанавливается таймер на вызов WIFI_connect() через 200мс.


Код раздающей esp:
Код:
LOCAL void ICACHE_FLASH_ATTR softap_init(void)
{
    char ssid[32] = ACCESS_POINT_SSID;
    char pwd[64] = ACCESS_POINT_PWD;

    struct softap_config ap_config;
    ap_config.authmode = AUTH_WPA2_PSK;
    ap_config.ssid_len = 32;
    os_memcpy(&ap_config.ssid, ssid, 32);
    os_memcpy(&ap_config.password, pwd, 64);
    ap_config.channel = ACCESS_POINT_CHANNEL;

    wifi_set_opmode(SOFTAP_MODE);
    if(!wifi_softap_set_config(&ap_config))
    {
        #ifdef DEBUG
            os_printf("\r\nError while setting AP config\r\n");
        #endif // DEBUG
    }
}

LOCAL void ICACHE_FLASH_ATTR set_station_info(void)
{
    struct ip_info info;
    info.gw.addr = ipaddr_addr(ACCESS_POINT_IP);
    info.ip.addr = ipaddr_addr(ACCESS_POINT_IP);
    info.netmask.addr = ipaddr_addr(ACCESS_POINT_NETMASK);

    if(!wifi_set_ip_info(SOFTAP_IF, &info))
    {
        #ifdef DEBUG
            os_printf("\r\nError while trying to set ip info\r\n");
        #endif // DEBUG
    }
}

LOCAL void ICACHE_FLASH_ATTR set_dhcp_lease(void)
{
    const char* start_ip = "192.168.0.1";
    const char* end_ip = "192.168.0.255";
    struct dhcps_lease lease;
    lease.start_ip.addr = ipaddr_addr(start_ip);
    lease.end_ip.addr = ipaddr_addr(end_ip);

    if(!wifi_softap_set_dhcps_lease(&lease))
    {
        #ifdef DEBUG
        os_printf("Error while trying to set DHCP lease\r\n");
        #endif // DEBUG
    }
}


void ICACHE_FLASH_ATTR SOFTAP_create(void)
{
    softap_init();
    if(!wifi_softap_dhcps_stop())
    {
        #ifdef DEBUG
            os_printf("\r\nError while trying to stop DHCP\r\n");
        #endif // DEBUG
    }
    set_station_info();
    set_dhcp_lease();
    if(!wifi_softap_dhcps_start())
    {
        #ifdef DEBUG
            os_printf("\r\nError while trying to start DHCP\r\n");
        #endif // DEBUG
    }
    TCP_accept();
}
В user_init также устанавливается таймер на SOFTAP_create()
 

pvvx

Активный участник сообщества
  1. dhcp_lease - предел x.x.x.n+1 ... x.x.x.n+100. От 1 до 255 не может быть. Но установиться сама в default, там при старте стоит проверка, если более 100 то default.
  2. ap_config.ssid_len=32; С чего? Он действительно у вас 32 символа?
Вообще достаточно написать wifi_set_opmode(SOFTAP_MODE); и при первом старте, с чистыми настройками (последние 3 сектора flash), появиться станция ESP_XXXX, где XXXX - последние цифры MAC.
 

kript0n

New member
  1. dhcp_lease - предел x.x.x.n+1 ... x.x.x.n+100. От 1 до 255 не может быть. Но установиться сама в default, там при старте стоит проверка, если более 100 то default.
  2. ap_config.ssid_len=32; С чего? Он действительно у вас 32 символа?
Вообще достаточно написать wifi_set_opmode(SOFTAP_MODE); и при первом старте, с чистыми настройками (последние 3 сектора flash), появиться станция ESP_XXXX, где XXXX - последние цифры MAC.
Хех, понятно, почему ругался на dhcp_lease.
32 стоит просто потому, что я уже совсем не понимаю в чем проблема, поэтому пробовал менять все. Именно 32, потому что массив длинной 32 копируется, но все же это правда необоснованно.

Очень странно, что компьютер и телефон сеть видят и подключаются к ней без проблем, а при поиске с другой esp - пусто.

Еще есть такой момент: в programming guide написано, что если wifi_station_set_config вызвана в user init, то вызывать wifi_station_connect не нужно, если же она вызвана после, то wifi_station_connect нужно вызывать. В user_init последняя строчка это регистрация таймера на вызов connect через 200 мс. Т.е set_config вызовется после инициализации и по идее нужно вызывать station_connect, но esp начинает автоматически подключаться. Наверное просто баг, но мало ли..
 
Последнее редактирование:

pvvx

Активный участник сообщества
Хех, понятно, почему ругался на dhcp_lease.
Исходники этого выложены в Open source LWIP for ESP_IOT_SDK_V1.4.0
Еще есть такой момент: в programming guide написано, что если wifi_station_set_config вызвана в user init, то вызывать wifi_station_connect не нужно, если же она вызвана после, то wifi_station_connect нужно вызывать. В user_init последняя строчка это регистрация таймера на вызов connect через 200 мс.
При чем тут wifi_station ? Вы пишите, что не видно AP модуля.
Есть wifi_station_set_auto_connect(). Зачем мучатся?
wifi_station_connect отрабатывает не менее пары секунд... она только заряжает таймеры и прочие процессы.
 
Сверху Снизу