ESP32 IDF WI-FI 연결 시나리오
ESP32 WI-FI 전체 동작 시나리오에 대해 작성하려고한다. 해당 시나리오에 대해 정확히 알아야 WI-FI 기능을 포함한 프로그램을 작성하는데 문제가 없다.
아래에 플로우는 ESP32 공식홈페이지에 있는 것을 그대로 긁어왔다. 내용 또한 공식 홈페이지와 크게 다르지 않다. 그리고 나는 SoftAP모드가 아닌 STATION만 사용 할 것이기 때문에 STATION에 관한 부분만 알아보도록 한다.
ESP32 WI-FI 프로그래밍 모델
Wi-Fi Driver는 TCPIP 스택, 어플리케이션 작업, 이벤트 작업 등, 상위 레이어의 코드에 대해 아무것도 모르는 블랙박스로 생각할 수 있다. Wi-Fi 드라이버는 상위 계층에서 API 호출을 수신하거나, API 에스_wifi_init()에 의해 초기화되는 특정 대기열에 이벤트 큐를 게시하는 것 뿐이다.
Event task는Wi-Fi 드라이버 또는 TCPIP 스택과 같은 다른 하위 시스템에서 이벤트를 수신하는 데몬 작업이라 보면된다. 이벤트 태스크는 이벤트 수신시 기본 콜백 함수를 호출한다. 예를 들어, SYSTEM_EVENT_STA_CONNECTED를 받으면 tcpip_adapter_start ()를 호출하여 기본 처리기에서 DHCP 클라이언트를 시작한다.
Application task는 API esp_event_init에 의해 자체 이벤트 콜백 함수를 등록 할 수 있다. 그러면 응용 프로그램 콜백 함수가 기본 콜백 후 호출된다. 또한 응용 프로그램이 이벤트 태스크에서 콜백을 실행하지 않으려면 관련 이벤트를 응용 프로그램 콜백 함수의 응용 프로그램 태스크에 게시해야한다.
위그림의 프로그래밍 모델을 조금 더 쉽게 표현한게 밑에 그림이다.
메인 프로그램에서 이벤트 핸들러가 될 함수를 아래와 같이 정의한다. 즉, 새 이벤트를 알릴 때마다 WIFI Driver가 호출하는 함수이다.
1 2 | static esp_err_t event_handler(void *ctx, system_event_t *event) {...} | cs |
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 | typedef enum { SYSTEM_EVENT_WIFI_READY = 0, /**< ESP32 WiFi ready */ SYSTEM_EVENT_SCAN_DONE, /**< ESP32 finish scanning AP */ SYSTEM_EVENT_STA_START, /**< ESP32 station start */ SYSTEM_EVENT_STA_STOP, /**< ESP32 station stop */ SYSTEM_EVENT_STA_CONNECTED, /**< ESP32 station connected to AP */ SYSTEM_EVENT_STA_DISCONNECTED, /**< ESP32 station disconnected from AP */ SYSTEM_EVENT_STA_AUTHMODE_CHANGE, /**< the auth mode of AP connected by ESP32 station changed */ SYSTEM_EVENT_STA_GOT_IP, /**< ESP32 station got IP from connected AP */ SYSTEM_EVENT_STA_WPS_ER_SUCCESS, /**< ESP32 station wps succeeds in enrollee mode */ SYSTEM_EVENT_STA_WPS_ER_FAILED, /**< ESP32 station wps fails in enrollee mode */ SYSTEM_EVENT_STA_WPS_ER_TIMEOUT, /**< ESP32 station wps timeout in enrollee mode */ SYSTEM_EVENT_STA_WPS_ER_PIN, /**< ESP32 station wps pin code in enrollee mode */ SYSTEM_EVENT_AP_START, /**< ESP32 soft-AP start */ SYSTEM_EVENT_AP_STOP, /**< ESP32 soft-AP stop */ SYSTEM_EVENT_AP_STACONNECTED, /**< a station connected to ESP32 soft-AP */ SYSTEM_EVENT_AP_STADISCONNECTED, /**< a station disconnected from ESP32 soft-AP */ SYSTEM_EVENT_AP_PROBEREQRECVED, /**< Receive probe request packet in soft-AP interface */ SYSTEM_EVENT_AP_STA_GOT_IP6, /**< ESP32 station or ap interface v6IP addr is preferred */ SYSTEM_EVENT_ETH_START, /**< ESP32 ethernet start */ SYSTEM_EVENT_ETH_STOP, /**< ESP32 ethernet stop */ SYSTEM_EVENT_ETH_CONNECTED, /**< ESP32 ethernet phy link up */ SYSTEM_EVENT_ETH_DISCONNECTED, /**< ESP32 ethernet phy link down */ SYSTEM_EVENT_ETH_GOT_IP, /**< ESP32 ethernet got IP from connected AP */ SYSTEM_EVENT_MAX } system_event_id_t; | cs |
최초 메인프로그램에서 WIFI Driver에 대한 config를 진행하면 WIFI Driver에서 "SYSTEM_EVENT_STA_START" 라는 성공 메세지를 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | static esp_err_t event_handler(void *ctx, system_event_t *event) { switch(event->event_id) { case SYSTEM_EVENT_STA_START: esp_wifi_connect(); break; case SYSTEM_EVENT_STA_GOT_IP: xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); break; case SYSTEM_EVENT_STA_DISCONNECTED: xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); break; | cs |
"SYSTEM_EVENT_STA_START" 이후 esp_wifi_connect() API 함수를 호출하여 WIFI Driver가 지정한 네트워크에 연결하도록 요청한다. 이 후 정상적으로 연결이 완료되면 WIFI Driver에서 "SYSTEM_EVENT_STA_GOT_IP"를 전달하게되고, CONNECTED_BIT 설정한다. 반대로 연결이 해제되거나 제대로 연결이 안되었을 경우에는 CONNECTED_BIT를 클리어해준다.
1 | xEventGroupWaitBits ( wifi_event_group , CONNECTED_BIT , false , true , portMAX_DELAY ) ; | cs |
설치과정이 진행되는 동안에는 정상적으로 설치가 될 때까지 xEventGroupWaitBits 함수를 통해 portMAX_DELAY에 설정된 시간동안 대기 할 수도 있다. 시간은 무제한 설정 가능하다.이 후 정상적으로 연결된 네트워크의 상태값을 알고 싶을 경우에는 아래와 같이 확인 할 수 있다.
1 2 3 4 5 | tcpip_adapter_ip_info_t ip_info; ESP_ERROR_CHECK(tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ip_info)); printf("IP Address: %s\n", ip4addr_ntoa(&ip_info.ip)); printf("Subnet mask: %s\n", ip4addr_ntoa(&ip_info.netmask)); printf("Gateway: %s\n", ip4addr_ntoa(&ip_info.gw)); | cs |
끝
'스터디 > ESP32' 카테고리의 다른 글
ESP32 Windows 개발환경 -AWS IoT core (2) (0) | 2019.01.23 |
---|---|
ESP32 Windows 개발환경 -AWS IoT core (1) (0) | 2018.12.26 |