ESP-IDFを使ってみる

example_connect関数


esp-idf/examples/protocolsフォルダーにはたくさんのサンプルコードが格納されていますが、
多くのサンプルでWiFiまたはイーサネット接続を確立するために、単純なヘルパー関数である example_connect() を使用しています。
接続が確立されIPアドレスが取得されるまでブロックされ、接続が確立されると呼び出し元に戻ります。

この関数を使うと、WiFiまたはイーサネット接続の確立は同じコードで実装することができます。
この関数を使うためにはCMakeLists.txtに以下を指定します。
# This example uses an extra component for common functions such as Wi-Fi and Ethernet connection.
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common)

この指定があると、menuconfig実行時に「Example Connection Configuration」の項目が現れ、
ここでWiFi接続かEthernet接続を選択することができます。


WiFi接続を行うときは、接続先ルータのssidとパスワードを指定します。
以下はESP-IDF V4.4の表示ですが、設定する内容はESP-IDFのバージョンにより変わることが有ります。
ESP-IDF V4.4からWiFiに関する項目が増えました。


Ethetnet接続を行うときは、Ethernet Typeを指定します。
Ethernet TypeにInternal EMACを選んだときは、さらにEthernet PHY Device(要するにモジュールの型番)を指定します。


ESP-IDF V4.3からW5500のSPI Moduleが追加されました。
Ethernet機能を持っていないESP32-S2のための対応です。




example_connect()関数を使ってネットワーク接続を確立する場合のコードはたったこれだけです。
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"
#include "protocol_examples_common.h"

static const char *TAG = "main";

void app_main(void)
{
    ESP_ERROR_CHECK(nvs_flash_init());
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
     * Read "Establishing Wi-Fi or Ethernet Connection" section in
     * examples/protocols/README.md for more information about this function.
     */
    ESP_ERROR_CHECK(example_connect());
}

これだけでWiFi/Ethernetどちらのネットワーク接続も確立してくれるので、これ以降lwIp関数を使ったネットワーク処理を行うこと がでます。

example_connect()関数はタイムアウトを処理せず、さまざまなエラー状態を適切に処理しないので、
サンプルコードでの使用にのみ適しています。
実際のアプリケーションを開発するときは、このヘルパー機能を完全なWiFi / Ethernet接続処理コードに置き換える必要があります。

というようなことがこ ちらに書いてあります。



example_connect()関数はWiFiもEthernetも対応していますが、以下の様に設定するとWiFiとEthernetの両 方でネットワーク接続を確立することができます。


Ethernet付きのWT32-ETH01で試してみました。
I (14056) esp_netif_handlers: example_netif_sta ip: 192.168.10.121, mask: 255.255.255.0, gw: 192.168.10.1
I (14056) example_connect: Got IPv4 event: Interface "example_netif_sta" address: 192.168.10.121
I (14066) example_common: Connected to example_netif_eth
I (14066) example_common: - IPv4 address: 192.168.10.120,
I (14076) example_common: Connected to example_netif_sta
I (14076) example_common: - IPv4 address: 192.168.10.121,

example_netif_ethがEthernet、example_netif_staがWiFiのインタフェースで、2つのIPアドレス が割り振られています。



ESP-IDF V5.3からexample_connect()関数が使うメモリーがずいぶん増えました。
Main TaskのStackサイズを5120に変更しないと、Stack不足でリセットが掛かります。


続く...