Page 4 of 5

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Wed Nov 10, 2021 4:34 am
by Ritesh
Sorry, it took me some time to prepare the example. The following code snipped should be able to create an AP an also connect to a available WiFi - it would be great if you can tell me, what i'm doing wrong.

Thanks in advance,

Best Monkeyinapocket

Code: Select all

#include <cstring>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"

#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"

#include "lwip/err.h"
#include "lwip/sys.h"

#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT      BIT1

static const char *TAG = "test";
static EventGroupHandle_t s_wifi_event_group;
static wifi_config_t wifi_config;

static void wifi_event_handler(void* arg, esp_event_base_t event_base,
                               int32_t event_id, void* event_data)
{
    if (event_id == WIFI_EVENT_AP_STACONNECTED) {
        wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;

    } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
        wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
    }
}

void wifi_init_softap(void)
{
    esp_netif_create_default_wifi_ap();

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &wifi_event_handler,
                                                        NULL,
                                                        NULL));

    const char* ssid = "ESPTest";
    const char* pw = "testtest";
    std::strcpy(reinterpret_cast<char *>(wifi_config.ap.ssid), ssid);
    std::strcpy(reinterpret_cast<char *>(wifi_config.ap.password), pw);
    wifi_config.ap.ssid_len = static_cast<uint8_t>(strlen(ssid));
    wifi_config.ap.channel = 1;
    wifi_config.ap.max_connection = 1;
    wifi_config.ap.authmode = WIFI_AUTH_WPA_WPA2_PSK;

    if (strlen(pw) == 0) {
        wifi_config.ap.authmode = WIFI_AUTH_OPEN;
    }

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA));
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());
}

static int s_retry_num = 0;
static int maxRetry = 5;
static void sta_event_handler(void* arg, esp_event_base_t event_base,
                          int32_t event_id, void* event_data)
{
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        esp_wifi_connect();
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        if (s_retry_num < maxRetry) {
            esp_wifi_connect();
            s_retry_num++;
            ESP_LOGI(TAG, "retry to connect to the AP");
        } else {
            xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
        }
        ESP_LOGI(TAG,"connect to the AP fail");
    } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
        ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
        ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
        s_retry_num = 0;
        xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
    }
}

void wifi_init_sta(void)
{
    s_wifi_event_group = xEventGroupCreate();
    esp_netif_create_default_wifi_sta();

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    esp_event_handler_instance_t instance_any_id;
    esp_event_handler_instance_t instance_got_ip;
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &sta_event_handler,
                                                        NULL,
                                                        &instance_any_id));
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                        IP_EVENT_STA_GOT_IP,
                                                        &sta_event_handler,
                                                        NULL,
                                                        &instance_got_ip));

    const char* ssid = "TestSSID";
    const char* pw = "testtest";
    std::strcpy(reinterpret_cast<char *>(wifi_config.sta.ssid), ssid);
    std::strcpy(reinterpret_cast<char *>(wifi_config.sta.password), pw);
    wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK;
    wifi_config.sta.channel = 2;
    wifi_config.sta.pmf_cfg.capable = true;
    wifi_config.sta.pmf_cfg.required = false;

    ESP_LOGI(TAG, "Test -> %s %s.", wifi_config.sta.ssid, wifi_config.sta.password);

    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
    //ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG, "wifi_init_sta finished.");

    /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
     * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
    EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
                                           WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
                                           pdFALSE,
                                           pdFALSE,
                                           portMAX_DELAY);

    /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
     * happened. */
    if (bits & WIFI_CONNECTED_BIT) {
        ESP_LOGI(TAG, "connected to ap");
    } else if (bits & WIFI_FAIL_BIT) {
        ESP_LOGI(TAG, "Failed to connect");
    } else {
        ESP_LOGE(TAG, "UNEXPECTED EVENT");
    }

    /* The event will not be processed after unregister */
    ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
    ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
    vEventGroupDelete(s_wifi_event_group);
}

extern "C" void app_main(void)
{
    //Initialize NVS
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

   wifi_init_softap();

   vTaskDelay(10000);

   wifi_init_sta();
}

Hello,

We have tried to compile your example but somehow it is giving few errors. Would you please let me know in which IDF you have compiled it successfully?

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Wed Nov 10, 2021 7:01 am
by Vader_Mester
Hello,

We have tried to compile your example but somehow it is giving few errors. Would you please let me know in which IDF you have compiled it successfully?
Hi, What kind of errors, can you be more specific?

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Wed Nov 10, 2021 7:24 am
by Ritesh
Hello,

We have tried to compile your example but somehow it is giving few errors. Would you please let me know in which IDF you have compiled it successfully?
Hi, What kind of errors, can you be more specific?
WIFI_EVENT macro is not able to find and also few other compilation errors are getting.

Can you please let me know in which ESP32 IDF version you have successfully compiled and executed on ESP32 Board?

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Wed Nov 10, 2021 10:00 am
by Vader_Mester
Hello,

We have tried to compile your example but somehow it is giving few errors. Would you please let me know in which IDF you have compiled it successfully?
Hi, What kind of errors, can you be more specific?
WIFI_EVENT macro is not able to find and also few other compilation errors are getting.

Can you please let me know in which ESP32 IDF version you have successfully compiled and executed on ESP32 Board?

Try to include "esp_netif.h", that should solve the issue. Also please list all errors, that would help us find the issue.
Also, please use IDF V4.0 or above.

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Wed Nov 10, 2021 11:17 am
by Ritesh


Hi, What kind of errors, can you be more specific?
WIFI_EVENT macro is not able to find and also few other compilation errors are getting.

Can you please let me know in which ESP32 IDF version you have successfully compiled and executed on ESP32 Board?

Try to include "esp_netif.h", that should solve the issue. Also please list all errors, that would help us find the issue.
Also, please use IDF V4.0 or above.
Hello,

I have already tried with that as well but didn;t get any solution for the same

Please find attached image for reference of errors which we are facing. Also we are using ESP32 IDF 3.2 version

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Wed Nov 10, 2021 11:40 am
by Vader_Mester

Hello,

I have already tried with that as well but didn;t get any solution for the same

Please find attached image for reference of errors which we are facing. Also we are using ESP32 IDF 3.2 version
This IDF version is way too old for this to work properly. This example will only work with IDF4.0 or above.

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Fri Nov 12, 2021 4:07 am
by Ritesh

Hello,

I have already tried with that as well but didn;t get any solution for the same

Please find attached image for reference of errors which we are facing. Also we are using ESP32 IDF 3.2 version
This IDF version is way too old for this to work properly. This example will only work with IDF4.0 or above.
Ok. We will check with ESP32 IDF 4.0 version and let you know testing results for the same.

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Fri Nov 12, 2021 7:07 am
by Vader_Mester

Hello,

I have already tried with that as well but didn;t get any solution for the same

Please find attached image for reference of errors which we are facing. Also we are using ESP32 IDF 3.2 version
This IDF version is way too old for this to work properly. This example will only work with IDF4.0 or above.
Ok. We will check with ESP32 IDF 4.0 version and let you know testing results for the same.
OK.
IDF have switched the esp_netif component from the older "tcpip_adapter" functions. They still should work as legacy, but if you use wifi on other project and switch to IDF4.0 or more, you shall update those as well with the new functions.

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Mon Nov 15, 2021 11:27 am
by Ritesh


This IDF version is way too old for this to work properly. This example will only work with IDF4.0 or above.
Ok. We will check with ESP32 IDF 4.0 version and let you know testing results for the same.
OK.
IDF have switched the esp_netif component from the older "tcpip_adapter" functions. They still should work as legacy, but if you use wifi on other project and switch to IDF4.0 or more, you shall update those as well with the new functions.
Ok. noted

Re: ESP IDF: Station + soft-AP (WIFI_MODE_APSTA) There is no working example - why? Where is?

Posted: Wed Jul 06, 2022 1:44 am
by badidrox
prolly dead thread but just in case anyone needs the solution:

here is a repository that contains station mode, AP mode and station + AP mode. just to make life easier:
https://github.com/dahmadjid/esp32-idf- ... wifi_utils