ESP32-WROVERでHTTPS Serverを立ち上げ APモード編
前回までで作ってきたHTTP ServerにおいてWiFi接続はSTAモード(子機)でしたがこれにAPモード(親機)を追加してみます。
ESP-IDFのsamplesの中にESP-IDF/samples/wifi/getting_started/softAP/main/softap_example_main.cというのがありますのでそれを参考にしてみます。
“softap_example_main.c”を見ると”wifi_init_softap()”関数がありそれを呼び出す事で実現しているようです。そこで#define CONFIG_SOFTAP_SELをdefine/undefineでSTAモードとAPモードを区別してみます。
CONFIG_SOFTAP_SELはこの後に出てくるsdkconfigで定義されます。
APモードならwifi_init_softap()を呼び出します。またSTAモードならESP32-WROVERがWiFiに接続したときstart_webserver()を呼び出しますが、APモードのときはwifi_init_softap()を呼び出した直後にstart_webserver()を呼び出します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
void app_main(void) { #ifndef CONFIG_SOFTAP_SEL static httpd_handle_t server = NULL; #endif ESP_ERROR_CHECK(nvs_flash_init()); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); #ifdef CONFIG SOFTAP_SEL ESP_LOGI(TAG, "ESP_WIFI_MODE_AP"); wifi_init_softap(); start_webserver(); #else #ifdef CONFIG_EXAMPLE_CONNECT_WIFI ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &connect_handler, &server)); ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &disconnect_handler, &server)); #endif // CONFIG_EXAMPLE_CONNECT_WIFI #ifdef CONFIG_EXAMPLE_CONNECT_ETHERNET ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_ETH_GOT_IP, &connect_handler, &server)); ESP_ERROR_CHECK(esp_event_handler_register(ETH_EVENT, ETHERNET_EVENT_DISCONNECTED, &disconnect_handler, &server)); #endif // CONFIG_EXAMPLE_CONNECT_ETHERNET ESP_ERROR_CHECK(example_connect()); #endif initialise_mdns(); } |
当然ながらAPモードのときのみwifi_init_softap()を実装します。
esp_event_handler_register()関数は子機が親機(本機)にconnect/disconnectしたときにメッセージが表示されますがさほど必要ないのでとりあえずコメントアウトしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#ifdef CONFIG_SOFTAP_SEL 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_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), .channel = EXAMPLE_ESP_WIFI_CHANNEL, .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 channel:%d", EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS, EXAMPLE_ESP_WIFI_CHANNEL); } #endif |
stop_webserver()、disconnet_handler()、connect_handler()はAPモードでは使いませんので#ifndef SOFTAP_SELとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#ifndef CONFIG_SOFTAP_SEL static void stop_webserver(httpd_handle_t server) { // Stop the httpd server httpd_ssl_stop(server); } static void disconnect_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { httpd_handle_t* server = (httpd_handle_t*) arg; if (*server) { stop_webserver(*server); *server = NULL; } } static void connect_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { httpd_handle_t* server = (httpd_handle_t*) arg; if (*server == NULL) { *server = start_webserver(); } } #endif |
最後にAPモード時に使うパラメーターEXAMPLE_ESP_WIFI_SSID、EXAMPLE_ESP_WIFI_PASS、EXAMPLE_ESP_WIFI_CHANNEL、EXAMPLE_MAX_STA_CONNを定義します。
1 2 3 4 |
#define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD #define EXAMPLE_ESP_WIFI_CHANNEL CONFIG_ESP_WIFI_CHANNEL #define EXAMPLE_MAX_STA_CONN CONFIG_ESP_MAX_STA_CONN |
ここでのCONFIG_xxxは「ESP32-WROVERでHTTPS Serverを立ち上げ mDNS追加編」で説明したようにsdkconfig.hに定義されています。sdkconfig.hはsdkconfig(Eclipse)/menuconfig(コマンドプロンプト)で設定された値が反映されます。
sdkconfig(Eclipse)/menuconfig(コマンドプロンプト)の設定パラメーターはどこから作られるかというとESP-IDF/components下のKconfigおよび各プロジェクトのKconfig.projbuildです。
“ESP-IDF/examples/wifi/getting_stated/softAP/main下のKconfig.projbuildの中身を現プロジェクトのmain/Kconfig.projbuildeに挿入します。
「ESP32-WROVERでHTTPS Serverを立ち上げ mDNS追加編」から作ったプロジェクトならmenu名が共にExample ConfigurationなのでSoftAP Configurationに変更します。
元々のExample ConfigurationもmDNSの設定なのでmDNS Configurationに変更します。
先に出てきたCONFIG_SOFTAP_SELはここに追加します(“CONFIG_”を付けない名前にするようです)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
menu "SoftAP Configuration" config SOFTAP_SEL bool "softAP sel" default y config ESP_WIFI_SSID string "WiFi SSID" default "myssid" help SSID (network name) for the example to connect to. config ESP_WIFI_PASSWORD string "WiFi Password" default "mypassword" help WiFi password (WPA or WPA2) for the example to use. config ESP_WIFI_CHANNEL int "WiFi Channel" range 1 13 default 1 help WiFi channel (network channel) for the example to use. config ESP_MAX_STA_CONN int "Maximal STA connections" default 4 help Max number of the STA connects to AP. endmenu |
ここでいったんbuildしてからsdkconfigを開くとSoftAP Configurationが追加されています。
特に設定を変えないならこのままflashします。
この状態で”myssid”というアクセスポイントが見えるはずなので接続します。パスワードは設定を変えていなければ”mypassword”です。
myssidにつながればSTAモード同様に通信できます。
さきほどのsdkconfig→SoftAP Configuration→softAP selのチェックを外してからbuild/flashとすると今度はSTAモードとして動作します。
ESP-IDFプロジェクトはGitHubにあります。