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