How to migrate from tcpip_adapter_* to esp_netif_`*

ataweg
Posts: 2
Joined: Sat Jan 20, 2018 1:42 pm

How to migrate from tcpip_adapter_* to esp_netif_`*

Postby ataweg » Tue Nov 19, 2019 8:17 pm

Today I updated to the last version of esp-idf and wanted to build my project. There was a message "tcpip_adapter_init () is deprecated please use esp_netif_init ()". Ok, I did it and my project was built, but there was a crash. So I edited around until my project ran again. I would like to share the necessary steps with you:

replace in your sources "tcpip_adapter_init();" with
"esp_netif_init();
sta_netif = esp_netif_create_default_wifi_sta();
assert( sta_netif );
"
replace "WIFI_IF_STA" with "ESP_IF_WIFI_STA" and "WIFI_IF_AP" with "ESP_IF_WIFI_AP"
replace "TCPIP_ADAPTER_IF_STA" with "sta_netif" and "TCPIP_ADAPTER_IF_AP" with "ap_netif"
replace "tcpip_adapter_" to "esp_netif_"
replace "TCPIP_ADAPTER_" with "ESP_NETIF_"

set in your main wifi source file
/* esp netif object representing the WIFI station */
esp_netif_t *sta_netif = NULL;
esp_netif_t *ap_netif = NULL;

in other files using these variables add
extern esp_netif_t *sta_netif;
extern esp_netif_t *ap_netif;

Maybe it will help you.
Viele Gruesse
Axel

DanCurram
Posts: 15
Joined: Tue Jun 12, 2018 2:13 pm

Re: How to migrate from tcpip_adapter_* to esp_netif_`*

Postby DanCurram » Thu Dec 05, 2019 11:38 am

So looking at using a TCP client socket and following the examples it uses esp_netif.h but the IDE cant find it so esp_netif_init(); also fails

using the version 4 release - so has anyone come across this ?

TIA Danny

ESP-Marius
Posts: 74
Joined: Wed Oct 23, 2019 1:49 am

Re: How to migrate from tcpip_adapter_* to esp_netif_`*

Postby ESP-Marius » Fri Dec 06, 2019 12:51 am

DanCurram wrote:
Thu Dec 05, 2019 11:38 am
So looking at using a TCP client socket and following the examples it uses esp_netif.h but the IDE cant find it so esp_netif_init(); also fails

using the version 4 release - so has anyone come across this ?

TIA Danny
Which examples are you looking at? If you are using release 4.0 then this doesn't have esp_netif (it will be a part of 4.1), so the examples for this version should still use the tcpip_adapter.

meneldor
Posts: 75
Joined: Mon Dec 25, 2017 7:28 am

Re: How to migrate from tcpip_adapter_* to esp_netif_`*

Postby meneldor » Fri Dec 13, 2019 5:02 pm

I just changed to v4.1 and my project is a complete mess now :) I am looking in the compilation errors and replacing 1 by 1 but it's a pain. It's hard to search in the documentation because I don't know what to search for.
It might be good if you write some article about it because this is a big change. Also, the v4 examples are not comprehensive enough. The getting_started one has only two events..

Im stuck for hours on this error:

Code: Select all

../components/WifiManager/WifiManager.cpp:647:13: error: invalid use of incomplete type 'esp_netif_t' {aka 'struct esp_netif_obj'}
    sta_netif->ip_info.ip.addr      = new_ip;
             ^~
In file included from /home/anio/esp/esp-idf/components/esp_netif/include/esp_netif.h:22,
                 from /home/anio/esp/esp-idf/components/esp_event/include/esp_event_legacy.h:22,
                 from /home/anio/esp/esp-idf/components/esp_event/include/esp_event.h:26,
                 from /home/anio/esp/esp-idf/components/esp_wifi/include/esp_wifi.h:64,
                 from ../components/WifiManager/WifiManager.cpp:22:
/home/anio/esp/esp-idf/components/esp_netif/include/esp_netif_types.h:33:8: note: forward declaration of 'esp_netif_t' {aka 'struct esp_netif_obj'}
 struct esp_netif_obj;
        ^~~~~~~~~~~~~
I declared it as:

Code: Select all

static esp_netif_t * sta_netif = NULL;
then initialized it:

Code: Select all

sta_netif = esp_netif_create_default_wifi_sta();

meneldor
Posts: 75
Joined: Mon Dec 25, 2017 7:28 am

Re: How to migrate from tcpip_adapter_* to esp_netif_`*

Postby meneldor » Sat Dec 14, 2019 9:54 pm

Well, i found the problem. I've used the esp_netif_t type in a wrong way. Now i have another problem, i cant link anything from esp_netif. The linker complains against anything netif related:

Code: Select all

/home/anio/.espressif/tools/xtensa-esp32-elf/esp-2019r2-8.2.0/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.2.0/../../../../xtensa-esp32-elf/bin/ld: esp-idf/WifiManager/libWifiManager.a(WifiManager.cpp.obj):(.literal._ZN11WifiManagerC2Ev+0x48): undefined reference to `esp_netif_init()'
This component is used in my custom component which has CMakeLists.txt file where i tested with PRIV_REQUIRES and REQUIRES:

Code: Select all

idf_component_register(SRCS WifiManager.cpp json/json.c
                        REQUIRES hm_config
                        PRIV_REQUIRES esp_wifi esp_netif
                        PRIV_INCLUDE_DIRS ./json
                       INCLUDE_DIRS . )

meneldor
Posts: 75
Joined: Mon Dec 25, 2017 7:28 am

Re: How to migrate from tcpip_adapter_* to esp_netif_`*

Postby meneldor » Sun Dec 15, 2019 6:20 pm

Any help please? I am stuck at this all day. The esp_netif component seems to be compiled but can't be linked. I tried all combinations to include headers and REQUIRE components.

meneldor
Posts: 75
Joined: Mon Dec 25, 2017 7:28 am

Re: How to migrate from tcpip_adapter_* to esp_netif_`*

Postby meneldor » Mon Dec 16, 2019 6:27 pm

Well, i dont know whats been changed in the master in the last sever hours but it fixed it.
Additionally i had to put the include in extern "C":

Code: Select all

extern "C" {
       #include "esp_wifi.h"
}
Please fix it in the repo

User avatar
penright
Posts: 2
Joined: Thu Jan 20, 2022 2:09 pm

Re: How to migrate from tcpip_adapter_* to esp_netif_`*

Postby penright » Thu Jan 20, 2022 3:12 pm

Just started to look at the espidf framework.
I am on windows VSCode.
Platformio.ini

Code: Select all

[env:esp32doit-devkit-v1]
platform = espressif32
board = wemosbat
framework = espidf
upload_port = com9
monitor_speed=115200
monitor_port = com9
I was using their example at https://docs.platformio.org/en/latest/t ... lysis.html
I will include my current code, but the bottom line when I used tcpip_adapter_init() it works and if I use esp_netif_init it can not get an IP. The log shows a connect but my device after timeout says it can not obtain IP.
This may not be a bug but my limited understanding of the framework and wifi library.
I saw the depreciation message, so as part of my learning I was going to fix it. :-) I assumed it was just a matter of switching names for functions. If I understand that these two functions only handle the hardware layer, I would think the upper layers (DHCP) would have been the same, correct?

Here is a log of sucssufull (tcpip_adapter_init()) connect and DHCP assigned IP.

Code: Select all

I (18529) wifi:new:<1,0>, old:<1,1>, ap:<1,1>, sta:<255,255>, prof:1
I (18529) wifi:station: a0:cc:2b:1c:4f:8e join, AID=1, bgn, 20
␛[0;32mI (18589) wifi softAP: station a0:cc:2b:1c:4f:8e join, AID=1␛[0m
W (18769) wifi:<ba-add>idx:4 (ifx:1, a0:cc:2b:1c:4f:8e), tid:6, ssn:0, winSize:64
␛[0;32mI (19179) esp_netif_lwip: DHCP server assigned IP to a station, IP is: 192.168.4.2␛[0m
I (386639) wifi:station: a0:cc:2b:1c:4f:8e leave, AID = 1, bss_flags is 658547, bss:0x3ffba33c
I (386639) wifi:new:<1,0>, old:<1,0>, ap:<1,1>, sta:<255,255>, prof:1
W (386639) wifi:<ba-del>idx
␛[0;32mI (386639) wifi softAP: station a0:cc:2b:1c:4f:8e leave, AID=1␛[0m
Hre is a log of unsucssufull (esp_netif_init()) connect and DHCP assigned IP.

Code: Select all

I (19329) wifi:new:<1,0>, old:<1,1>, ap:<1,1>, sta:<255,255>, prof:1
I (19339) wifi:station: a0:cc:2b:1c:4f:8e join, AID=1, bgn, 20
␛[0;32mI (19419) wifi softAP: station a0:cc:2b:1c:4f:8e join, AID=1␛[0m
W (19569) wifi:<ba-add>idx:4 (ifx:1, a0:cc:2b:1c:4f:8e), tid:6, ssn:0, winSize:64
I (55739) wifi:station: a0:cc:2b:1c:4f:8e leave, AID = 1, bss_flags is 658547, bss:0x3ffba33c
The only difference is unremarked the tcpip_adaper vs esp_netif

Here is the code:

Code: Select all

/* WiFi softAP Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.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 EXAMPLE_ESP_WIFI_SSID      "PaulTest"
#define EXAMPLE_ESP_WIFI_PASS      "abcd1234"
#define EXAMPLE_MAX_STA_CONN       (3)

static const char *TAG = "wifi softAP";

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;
        ESP_LOGI(TAG, "station "MACSTR" join, AID=%d",
                 MAC2STR(event->mac), event->aid);
    } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
        wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
        ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d",
                 MAC2STR(event->mac), event->aid);
    }
}

void wifi_init_softap()
{
    //tcpip_adapter_init();
    esp_netif_init(); 

    ESP_ERROR_CHECK(esp_event_loop_create_default());

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

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

    wifi_config_t wifi_config = {
        .ap = {
            .ssid = EXAMPLE_ESP_WIFI_SSID,
            .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),
            .password = EXAMPLE_ESP_WIFI_PASS,
            .max_connection = EXAMPLE_MAX_STA_CONN,
            .authmode = WIFI_AUTH_WPA_WPA2_PSK
        },
    };
    if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) {
        wifi_config.ap.authmode = WIFI_AUTH_OPEN;
    }

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));
    ESP_ERROR_CHECK(esp_wifi_start());

    ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s",
             EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
}

void app_main()
{
    //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_LOGI(TAG, "ESP_WIFI_MODE_AP");
    wifi_init_softap();
}

Who is online

Users browsing this forum: No registered users and 319 guests