「FreeRTOS」タグアーカイブ

ESP32-IDFでアプセスポイントを構築する

ESP32-IDFでAPモードで起動する方法を試してみます。

こんにちは北神です。

ESP32はArduino環境とチップメーカ公式のIDFという開発環境があります。
日本ではArduino環境での開発が多くみられますが、ESP32の本場はIDFによる構築ですので、それに合わせて開発を試してみたいと思います。

今回試すのは、アクセスポイント(APモード)にする方法です。

細かく説明するには、FreeRTOSについてや、イベントについて話す必要がありますが、今回はサクッと動作するソースを載せておきます。

開発環境は ESP-IDF v4.3.1 を使用しております。

#include <stdio.h>
#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/sockets.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>


void wifi_init_softap(void);

static const char *TAG = "ESP32_WS_APP";

//==========================//
// wifi_event_handler
//==========================// 
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);
    }
}

#define SSID    "ESP32_TEST"
#define PASS     "123456789012345"
//==========================// 
//  WiFi SoftAP
//==========================// 
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));
    wifi_config_t wifi_config = {
        .ap = {
            .ssid = SSID,
            .ssid_len = strlen(SSID),
            .channel = 7,
            .password = PASS,
            .max_connection = 2,
            .authmode = WIFI_AUTH_WPA_WPA2_PSK
        },
    };
    if (strlen(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());
}

//==========================// 
//  app_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());

    ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");    
    wifi_init_softap();
}

このソースを
idf.py flash -p COM11 で書き込み、 idf.py monitor -p COM11 で確認すると、以下の様にログが表示されます。


この状態で、スマフォ等でWiFiのSSIDを確認しに行くと、
SSID: ESP32_TEST
Pass: 123456789012345
で、接続しに行く事ができます。

無事に接続ができますと、IPを振り分けられます。
ログでは以下の様に表示されます。

これで、クライアントに「192.168.4.2」を配布できました。

ESP32-IDFはFreeRTOSで開発する為、一般的なシングルスレッドなマイコンの動作ではなく、決まった時間でタスクが切り替わる事を意識しながら開発する必要があります。

FreeRTOSは非常に便利な機能が多く、できなかった事が楽にできる様になりますのでおすすめです。

ではでは。