티스토리 뷰

카테고리 없음

ESP32-스테이션 모드

바람사탕 2024. 3. 9. 23:36
반응형

스테이션 모드(Station Mode)는 ESP32가 Wi-Fi 네트워크에 연결되어 외부 네트워크 또는 인터넷에 액세스할 수 있는 모드입니다. 이 모드에서 ESP32는 Wi-Fi 클라이언트 역할을 하며, 주로 무선 라우터나 다른 액세스 포인트에 연결하여 로컬 네트워크에 참여하고 외부 네트워크와 통신합니다.

스테이션 모드에서 ESP32는 다음과 같은 주요 기능을 수행합니다:

1. Wi-Fi 네트워크에 연결: ESP32는 사전에 설정된 SSID와 암호를 사용하여 Wi-Fi 네트워크에 연결합니다. 이를 통해 ESP32는 해당 네트워크에 가입하고, 다른 디바이스들과 통신할 수 있습니다.

2. 인터넷 액세스: 스테이션 모드에서 ESP32는 외부 인터넷에 액세스할 수 있습니다. 이를 통해 웹 서버에 HTTP 요청을 보내거나, MQTT 브로커에 연결하여 데이터를 전송하는 등의 작업을 수행할 수 있습니다.

3. 데이터 통신: ESP32는 스테이션 모드에서 다른 Wi-Fi 클라이언트나 서버와 데이터를 주고받을 수 있습니다. 이를 통해 IoT 기기로부터 데이터를 수집하거나, 제어 명령을 수신하는 등의 작업을 수행할 수 있습니다.

4. 신호 품질 모니터링: ESP32는 스테이션 모드에서 주변 Wi-Fi 네트워크의 신호 강도를 모니터링할 수 있습니다. 이를 통해 현재 연결된 네트워크의 신호 품질을 확인하거나, 더 나은 신호 품질을 가진 다른 네트워크로 전환하는 등의 작업을 수행할 수 있습니다.

스테이션 모드에서 ESP32는 Wi-Fi 연결을 관리하고 데이터를 전송하기 위해 다양한 Wi-Fi API 및 라이브러리를 사용합니다. 이를 통해 사용자는 ESP32를 무선 네트워크에 연결하고, 다양한 IoT 및 네트워크 응용 프로그램을 구현할 수 있습니다.

 

 

esp_wifi_connect

`esp_wifi_connect` 함수는 ESP32의 Wi-Fi 스테이션 모드에서 지정된 AP(액세스 포인트)에 연결하기 위해 사용됩니다. 이 함수는 다음과 같은 형식을 가지고 있습니다:

esp_err_t esp_wifi_connect()



이 함수는 현재 설정된 Wi-Fi 설정을 사용하여 AP에 연결을 시도합니다. AP에 연결되면 `ESP_OK`가 반환되고, 연결에 실패하면 적절한 오류 코드가 반환됩니다.

예를 들어, 다음은 Wi-Fi에 연결하는 간단한 예제입니다:

#include "esp_wifi.h"

void wifi_init_sta() {
    // Wi-Fi 초기화
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&cfg);

    // Wi-Fi 스테이션 모드 설정
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = "YourWiFiSSID",
            .password = "YourWiFiPassword"
        },
    };
    esp_wifi_set_mode(WIFI_MODE_STA);
    esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);

    // Wi-Fi 연결
    esp_wifi_connect();
}


위의 예제에서 "YourWiFiSSID" 및 "YourWiFiPassword"를 실제 SSID와 암호로 대체해야 합니다. 이 코드는 ESP32를 스테이션 모드로 설정하고 지정된 SSID와 암호를 사용하여 Wi-Fi에 연결을 시도합니다.

 

 

 

 

WIFI_MODE_STA

 

`WIFI_MODE_STA`는 ESP32의 Wi-Fi 모드 중 하나로, ESP32를 스테이션(Station) 모드로 설정하는 데 사용됩니다. 스테이션 모드에서 ESP32는 Wi-Fi 네트워크에 연결되어 다른 액세스 포인트(AP)와 통신할 수 있습니다. 이 모드에서 ESP32는 클라이언트로 동작하여 외부 네트워크 또는 인터넷에 액세스할 수 있습니다.

스테이션 모드에서 ESP32는 주로 무선 라우터 또는 다른 액세스 포인트에 연결되어 로컬 네트워크에 연결하고, 인터넷에 액세스하는 데 사용됩니다.

예를 들어, 다음은 ESP32를 스테이션 모드로 설정하는 코드의 일부분입니다:

esp_wifi_set_mode(WIFI_MODE_STA);

 

이 코드는 ESP32를 스테이션 모드로 설정합니다. 이후에는 해당 모드에서 Wi-Fi 네트워크에 연결할 수 있습니다.

 

 

 

 

 

ESP32코드 셋팅

/* Set the SSID and Password via project configuration, or can set directly here */
#define DEFAULT_SSID "MyWi-Fi_1F"
#define DEFAULT_PWD "password1234"



/* Initialize Wi-Fi as sta and set scan method */
static void fast_scan(void)
{
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());


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, &event_handler, NULL, NULL));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL));


// Initialize default station as network interface instance (esp-netif)
esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
assert(sta_netif);


// Initialize and start WiFi
wifi_config_t wifi_config = {
.sta = {
.ssid = DEFAULT_SSID,
.password = DEFAULT_PWD,
.scan_method = DEFAULT_SCAN_METHOD,
.sort_method = DEFAULT_SORT_METHOD,
.threshold.rssi = DEFAULT_RSSI,
.threshold.authmode = DEFAULT_AUTHMODE,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
}

void app_main(void)
{
// Initialize NVS
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK( ret );


fast_scan();
}

 

 

 

esp_wifi_scan_start

'esp_wifi_scan_start' 함수는 ESP32에서 Wi-Fi 스캔을 시작하는 데 사용됩니다. 이 함수를 호출하면 ESP32는 주변의 Wi-Fi 네트워크를 스캔하여 감지할 수 있습니다. 이 함수는 다음과 같은 형식을 가지고 있습니다.

esp_err_t esp_wifi_scan_start(const wifi_scan_config_t *scan_config, bool block)


- scan_config: Wi-Fi 스캔을 구성하는 데 사용되는 구성 객체에 대한 포인터입니다. 이 매개변수를 NULL로 설정하면 기본 스캔 설정을 사용합니다.
- block: true로 설정하면 스캔이 완료될 때까지 함수가 차단됩니다. false로 설정하면 비차단 모드로 스캔이 시작되며, 스캔이 완료되면 이벤트를 통해 알려줍니다.

이 함수를 사용하여 Wi-Fi 스캔을 시작하면 ESP32가 주변의 Wi-Fi 네트워크를 스캔하고 스캔 결과를 수집합니다. 이후에는 esp_wifi_scan_get_ap_records 함수를 사용하여 스캔 결과를 가져와서 처리할 수 있습니다.

예를 들어, 다음은 ESP32에서 Wi-Fi 스캔을 시작하는 간단한 예제입니다:

#include "esp_wifi.h"

void wifi_scan_example() {
    // Wi-Fi 초기화
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&cfg);

    // Wi-Fi 스캔 구성 설정
    wifi_scan_config_t scan_config = {
        .ssid = NULL, // 모든 SSID를 스캔합니다
        .bssid = NULL, // 특정 BSSID에 대해 스캔하지 않습니다
        .channel = 0, // 모든 채널에서 스캔합니다
        .show_hidden = true // 숨겨진 SSID를 표시합니다
    };

    // Wi-Fi 스캔 시작
    esp_wifi_scan_start(&scan_config, true);
}


이 코드에서는 먼저 Wi-Fi를 초기화하고, wifi_scan_config_t 구조체를 사용하여 Wi-Fi 스캔 구성을 설정합니다. 그런 다음 esp_wifi_scan_start 함수를 호출하여 Wi-Fi 스캔을 시작합니다. 스캔이 완료되면 ESP32는 스캔된 네트워크에 대한 정보를 수집합니다.

 

 

esp_err_t esp_wifi_scan_get_ap_num(uint16_t *number) 

'esp_wifi_scan_get_ap_num' 함수는 Wi-Fi 스캔 결과에서 감지된 액세스 포인트(AP)의 수를 반환하는 ESP-IDF의 Wi-Fi API 함수입니다. 이 함수는 다음과 같은 형식을 가지고 있습니다.

- number: 스캔된 AP의 수를 저장하기 위한 포인터입니다. 이 포인터는 스캔 결과에 따라 감지된 AP의 총 수로 설정됩니다.

이 함수는 Wi-Fi 스캔을 통해 감지된 AP의 수를 반환합니다. 이후에는 스캔된 AP의 수를 확인하고, 해당 수에 맞게 메모리를 동적으로 할당하여 각 AP의 정보를 저장하거나 처리할 수 있습니다.

예를 들어, 다음은 'esp_wifi_scan_get_ap_num' 함수를 사용하여 스캔된 AP의 수를 확인하고 출력하는 간단한 예제입니다:

#include "esp_wifi.h"

void wifi_scan_example() {
    // Wi-Fi 초기화
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&cfg);

    // Wi-Fi 스캔 시작
    esp_wifi_scan_start(NULL, true);

    // 스캔된 AP의 수 확인
    uint16_t ap_num;
    esp_wifi_scan_get_ap_num(&ap_num);
    
    printf("Detected APs: %d\n", ap_num);
}


이 코드에서는 먼저 Wi-Fi를 초기화하고, 'esp_wifi_scan_start' 함수를 사용하여 Wi-Fi 스캔을 시작합니다. 그런 다음 'esp_wifi_scan_get_ap_num' 함수를 사용하여 스캔된 AP의 수를 확인하고 출력합니다.

 

 

xTaskCreate

xTaskCreate 함수는 FreeRTOS에서 새로운 Task를 생성하는 함수입니다. 이 함수를 사용하여 Task를 만들고 Task가 실행할 함수와 다양한 매개변수를 설정할 수 있습니다. 
이 함수는 다음과 같은 형식을 가지고 있습니다

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                        const char * const pcName,
                        const configSTACK_DEPTH_TYPE usStackDepth,
                        void * const pvParameters,
                        UBaseType_t uxPriority,
                        TaskHandle_t * const pxCreatedTask );


- pxTaskCode: Task가 실행할 함수의 포인터입니다. 이 함수는 Task가 수행하는 작업을 정의합니다.
- pcName: Task의 이름입니다. 디버깅 및 추적을 위해 사용됩니다.
- usStackDepth: Task의 스택 깊이입니다. Task가 실행되는 동안 필요한 로컬 변수 및 함수 호출에 필요한 메모리 공간을 확보하는 데 사용됩니다.
- pvParameters: Task에 전달할 매개변수입니다. Task가 실행될 때 함수에 전달됩니다.
- uxPriority: Task의 우선 순위입니다. 높은 값은 더 높은 우선 순위를 나타냅니다.
- pxCreatedTask: Task의 핸들을 저장할 포인터입니다. 이 매개변수를 사용하면 Task의 핸들을 나중에 참조할 수 있습니다.

예를 들어, 다음은 간단한 Task를 생성하는 코드입니다

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void task_function(void *pvParameters) {
    // Task가 수행할 작업을 여기에 작성합니다.
}

void app_main() {
    // Task를 생성합니다.
    xTaskCreate(&task_function, "Task", 2048, NULL, 5, NULL);

    // 여기에 다른 작업을 추가할 수 있습니다.


    // FreeRTOS 스케줄러를 시작합니다.
    vTaskStartScheduler();
    // vTaskStartScheduler() 함수가 리턴되는 경우는 없습니다.
}

위의 예제에서는 `task_function`이라는 함수를 Task로 설정하여 Task를 생성하고 있습니다. 생성된 Task는 "Task"라는 이름을 가지고 있으며, 2048 바이트의 스택 공간을 할당받고, 우선 순위는 5로 설정되어 있습니다. Task에 전달되는 매개변수는 `NULL`이며, Task의 핸들은 사용하지 않고 있습니다.

 

 

vTaskDelete

vTaskDelete 함수는 FreeRTOS에서 현재 실행 중인 Task를 삭제하는 함수입니다. 이 함수는 Task가 자체적으로 종료되는 시점에 호출되어야 합니다. Task가 실행을 마치고 삭제되어야 할 때 호출되는 것이 보통입니다.

이 함수는 다음과 같은 형식을 가지고 있습니다.

void vTaskDelete(TaskHandle_t xTaskToDelete);


- xTaskToDelete: 삭제할 Task의 핸들입니다. 보통은 `NULL`을 사용하여 현재 실행 중인 Task를 삭제합니다.

예를 들어, 다음은 현재 Task가 자신을 삭제하는 예제 코드입니다:

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void task_function(void *pvParameters) {
    // Task가 수행할 작업을 여기에 작성합니다.
    
    // 작업을 마치고 Task를 삭제합니다.
    vTaskDelete(NULL);
}

void app_main() {
    // Task를 생성합니다.
    xTaskCreate(&task_function, "task", 2048, NULL, 5, NULL);

    // 여기에 다른 작업을 추가할 수 있습니다.
}


위의 예제에서는 task_function 이라는 Task를 생성하고, 해당 Task 안에서 수행할 작업을 정의하고 있습니다. Task가 작업을 완료하고 삭제해야 할 때 vTaskDelete(NULL)을 호출하여 Task를 삭제합니다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
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
글 보관함