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 V5.3の表示ですが、設定する内容はESP-IDFのバージョンにより変わることが有ります。
ESP-IDFのバージョンが上がる毎に、設定する項目が増えています。


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


ESP-IDF V4.3からW5500のSPI Moduleが追加されました。
EMAC Ethernet機能を持っていないESP32-S2のための対応です。
ESP32-S2をターゲットとした場合、Internal EMACは選択することができません。


ESP32-H2にはWiFi機能もEMAC Ethernet機能も有りません。
ESP32-H2をターゲットとした場合、SPI Ethernetだけを指定することができます。




example_connect() を使うと、IPv6のアドレスも取得することができます。


これでIPv6アドレスを取得します。
こ ちらにexample_connect() を使わずに、WiFiルーターに接続する公式サンプルが公開されています。
example_connect() を使わずにIPv6アドレスを取得するサンプルコードは公開されていません。




「Get ssid and password from stdin」の項目が有ります。
この項目を有効にすると、標準入力からssidとパスワードを入力できるようになります。


但し、ssidとパスワードを、どのような形式で入力するのか調べても分かりませんでした。
また、入力した文字はエコーされないので、はっきり言って使いにくい(使えない)です。


「Provide wifi connect commands」の項目が有ります。
この項目を有効にすると何が変わるのか調べても分かりませんでした。




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サイズを変更しないと、Stack不足でリセットが掛かることが有ります。


続く...