ESP32는 뛰어난 무선 통신 기능을 제공하는 IoT 개발 플랫폼으로, Wi-Fi와 Bluetooth 모듈을 내장하고 있습니다. 오늘은 ESP32의 Wi-Fi 기능 중 Wi-Fi STA(Station) 모드와 AP(Access Point) 모드 설정 방법을 예제와 함께 살펴보겠습니다. 이를 통해 ESP32를 활용하여 Wi-Fi에 연결하고, AP 모드를 통해 다른 장치들이 네트워크에 연결할 수 있도록 만드는 방법을 알아보겠습니다.
Wi-Fi STA 모드 설정 및 연결
Wi-Fi STA 모드는 ESP32가 Wi-Fi 네트워크에 연결되는 클라이언트 역할을 합니다. 이를 통해 ESP32는 기존 Wi-Fi 네트워크에 접속하여 인터넷이나 로컬 네트워크의 다른 장치와 통신할 수 있습니다.
Wi-Fi STA 모드 설정하기
다음은 Wi-Fi STA 모드를 설정하고 Wi-Fi 네트워크에 연결하는 예제 코드입니다.
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "esp_log.h"
#define WIFI_SSID "your_wifi_ssid"
#define WIFI_PASS "your_wifi_password"
static const char *TAG = "wifi_sta";
void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
ESP_LOGI(TAG, "Retrying to connect to the AP");
esp_wifi_connect();
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "Got IP: %s", ip4addr_ntoa(&event->ip_info.ip));
}
}
void wifi_init_sta(void) {
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
esp_event_handler_instance_t instance_any_id;
esp_event_handler_instance_t instance_got_ip;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL,
&instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&wifi_event_handler,
NULL,
&instance_got_ip));
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
}
void app_main(void) {
wifi_init_sta();
}
코드 설명
- 초기화 작업:
nvs_flash_init()
,esp_netif_init()
,esp_event_loop_create_default()
등의 함수를 호출하여 NVS(비휘발성 저장소)와 네트워크 인터페이스, 이벤트 루프를 초기화합니다. - Wi-Fi 기본 설정:
wifi_init_config_t
를 사용하여 Wi-Fi 드라이버를 초기화하고,wifi_init_sta()
함수를 통해 STA 모드를 활성화합니다. - 이벤트 핸들러 등록: Wi-Fi 연결 및 IP 주소 획득에 대한 이벤트를 처리하기 위해 핸들러를 등록합니다.
- Wi-Fi 연결: 설정된 SSID와 비밀번호를 이용해 Wi-Fi 네트워크에 연결을 시도합니다. 연결 성공 시 IP 주소가 출력됩니다.
Wi-Fi AP 모드 설정하기
Wi-Fi AP 모드는 ESP32가 액세스 포인트 역할을 하며, 다른 장치들이 ESP32에 연결할 수 있도록 합니다. AP 모드를 사용하면 ESP32를 통해 로컬 네트워크를 구성할 수 있습니다.
Wi-Fi AP 모드 설정 예제
다음은 Wi-Fi AP 모드를 설정하는 예제 코드입니다.
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "esp_log.h"
#define AP_SSID "esp32_ap"
#define AP_PASS "12345678"
#define MAX_STA_CONN 4
static const char *TAG = "wifi_ap";
void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_START) {
ESP_LOGI(TAG, "Wi-Fi AP started");
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STACONNECTED) {
wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;
ESP_LOGI(TAG, "Station "MACSTR" connected", MAC2STR(event->mac));
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) {
wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;
ESP_LOGI(TAG, "Station "MACSTR" disconnected", MAC2STR(event->mac));
}
}
void wifi_init_ap(void) {
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_ap();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
esp_event_handler_instance_t instance_any_id;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL,
&instance_any_id));
wifi_config_t wifi_config = {
.ap = {
.ssid = AP_SSID,
.ssid_len = strlen(AP_SSID),
.password = AP_PASS,
.max_connection = MAX_STA_CONN,
.authmode = WIFI_AUTH_WPA_WPA2_PSK,
},
};
if (strlen(AP_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());
}
void app_main(void) {
wifi_init_ap();
}
코드 설명
- AP 모드 초기화:
wifi_init_ap()
함수는 NVS 초기화, 이벤트 루프 생성, 네트워크 인터페이스 설정을 수행하고 AP 모드를 활성화합니다. - 이벤트 핸들러: AP 시작, 클라이언트 연결, 클라이언트 해제에 대한 이벤트를 처리합니다.
- Wi-Fi AP 설정: SSID, 비밀번호, 최대 연결 수 등을 설정하고 AP 모드를 시작합니다. 비밀번호가 설정되지 않은 경우 인증 모드를
WIFI_AUTH_OPEN
으로 설정합니다.
STA 모드와 AP 모드의 차이점
- STA 모드: ESP32가 Wi-Fi 네트워크에 클라이언트로 연결되어 인터넷이나 다른 장치와 통신합니다.
- AP 모드: ESP32가 액세스 포인트가 되어 다른 장치들이 ESP32에 연결할 수 있는 네트워크를 제공합니다.
두 모드는 동시에 사용될 수 있으며, 이를 Dual Mode라고 합니다. Dual Mode를 활용하면 ESP32가 네트워크에 연결된 상태에서 다른 장치들을 연결할 수 있습니다.
결론
오늘은 ESP32 IDF를 활용하여 Wi-Fi 기능을 설정하는 방법에 대해 살펴보았습니다. Wi-Fi STA 모드로 ESP32를 기존 네트워크에 연결하는 방법과 Wi-Fi AP 모드를 통해 ESP32가 액세스 포인트 역할을 하는 방법을 설명하였습니다. 이를 활용하여 다양한 IoT 프로젝트에서 ESP32의 강력한 Wi-Fi 기능을 사용해 보세요.
'ESP32 IDF' 카테고리의 다른 글
ESP32 IDF BLE 서버 (0) | 2024.11.05 |
---|---|
ESP32 IDF 웹 서버(Web Server) (0) | 2024.11.04 |
ESP32 IDF GPIO 핀 구성 및 활용 가이드 (0) | 2024.11.02 |
ESP32 IDF 프로젝트 생성 및 구조 이해 (0) | 2024.11.01 |
ESP32 IDF 개발 환경 설정하기 (0) | 2024.10.31 |