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

Ritesh
Posts: 1383
Joined: Tue Sep 06, 2016 9:37 am
Location: India
Contact:

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

Postby Ritesh » Wed Nov 10, 2021 4:34 am

monkeyinapocket wrote:
Sun Oct 17, 2021 8:47 pm
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?
Regards,
Ritesh Prajapati

User avatar
Vader_Mester
Posts: 300
Joined: Tue Dec 05, 2017 8:28 pm
Location: Hungary
Contact:

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

Postby Vader_Mester » Wed Nov 10, 2021 7:01 am

Ritesh wrote:
Wed Nov 10, 2021 4:34 am
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?

Code: Select all

task_t coffeeTask()
{
	while(atWork){
		if(!xStreamBufferIsEmpty(mug)){
			coffeeDrink(mug);
		} else {
			xTaskCreate(sBrew, "brew", 9000, &mug, 1, NULL);
			xSemaphoreTake(sCoffeeRdy, portMAX_DELAY);
		}
	}
	vTaskDelete(NULL);
}

Ritesh
Posts: 1383
Joined: Tue Sep 06, 2016 9:37 am
Location: India
Contact:

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

Postby Ritesh » Wed Nov 10, 2021 7:24 am

Vader_Mester wrote:
Wed Nov 10, 2021 7:01 am
Ritesh wrote:
Wed Nov 10, 2021 4:34 am
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?
Regards,
Ritesh Prajapati

User avatar
Vader_Mester
Posts: 300
Joined: Tue Dec 05, 2017 8:28 pm
Location: Hungary
Contact:

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

Postby Vader_Mester » Wed Nov 10, 2021 10:00 am

Ritesh wrote:
Wed Nov 10, 2021 7:24 am
Vader_Mester wrote:
Wed Nov 10, 2021 7:01 am
Ritesh wrote:
Wed Nov 10, 2021 4:34 am
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.

Code: Select all

task_t coffeeTask()
{
	while(atWork){
		if(!xStreamBufferIsEmpty(mug)){
			coffeeDrink(mug);
		} else {
			xTaskCreate(sBrew, "brew", 9000, &mug, 1, NULL);
			xSemaphoreTake(sCoffeeRdy, portMAX_DELAY);
		}
	}
	vTaskDelete(NULL);
}

Ritesh
Posts: 1383
Joined: Tue Sep 06, 2016 9:37 am
Location: India
Contact:

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

Postby Ritesh » Wed Nov 10, 2021 11:17 am

Vader_Mester wrote:
Wed Nov 10, 2021 10:00 am
Ritesh wrote:
Wed Nov 10, 2021 7:24 am
Vader_Mester wrote:
Wed Nov 10, 2021 7:01 am


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
Attachments
80853420-60afb400-8c63-11ea-8c86-ef92cd34b187.png
80853420-60afb400-8c63-11ea-8c86-ef92cd34b187.png (397.38 KiB) Viewed 13003 times
Regards,
Ritesh Prajapati

User avatar
Vader_Mester
Posts: 300
Joined: Tue Dec 05, 2017 8:28 pm
Location: Hungary
Contact:

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

Postby Vader_Mester » Wed Nov 10, 2021 11:40 am

Ritesh wrote:
Wed Nov 10, 2021 11:17 am

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.

Code: Select all

task_t coffeeTask()
{
	while(atWork){
		if(!xStreamBufferIsEmpty(mug)){
			coffeeDrink(mug);
		} else {
			xTaskCreate(sBrew, "brew", 9000, &mug, 1, NULL);
			xSemaphoreTake(sCoffeeRdy, portMAX_DELAY);
		}
	}
	vTaskDelete(NULL);
}

Ritesh
Posts: 1383
Joined: Tue Sep 06, 2016 9:37 am
Location: India
Contact:

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

Postby Ritesh » Fri Nov 12, 2021 4:07 am

Vader_Mester wrote:
Wed Nov 10, 2021 11:40 am
Ritesh wrote:
Wed Nov 10, 2021 11:17 am

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.
Regards,
Ritesh Prajapati

User avatar
Vader_Mester
Posts: 300
Joined: Tue Dec 05, 2017 8:28 pm
Location: Hungary
Contact:

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

Postby Vader_Mester » Fri Nov 12, 2021 7:07 am

Ritesh wrote:
Fri Nov 12, 2021 4:07 am
Vader_Mester wrote:
Wed Nov 10, 2021 11:40 am
Ritesh wrote:
Wed Nov 10, 2021 11:17 am

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.

Code: Select all

task_t coffeeTask()
{
	while(atWork){
		if(!xStreamBufferIsEmpty(mug)){
			coffeeDrink(mug);
		} else {
			xTaskCreate(sBrew, "brew", 9000, &mug, 1, NULL);
			xSemaphoreTake(sCoffeeRdy, portMAX_DELAY);
		}
	}
	vTaskDelete(NULL);
}

Ritesh
Posts: 1383
Joined: Tue Sep 06, 2016 9:37 am
Location: India
Contact:

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

Postby Ritesh » Mon Nov 15, 2021 11:27 am

Vader_Mester wrote:
Fri Nov 12, 2021 7:07 am
Ritesh wrote:
Fri Nov 12, 2021 4:07 am
Vader_Mester wrote:
Wed Nov 10, 2021 11:40 am


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
Regards,
Ritesh Prajapati

badidrox
Posts: 2
Joined: Wed Apr 06, 2022 12:04 am

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

Postby badidrox » Wed Jul 06, 2022 1:44 am

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

Who is online

Users browsing this forum: cdollar and 79 guests