ESP32로 WiFi 네트워크에 연결하는 방법
내장 WiFi.h 라이브러리를 사용하면 ESP32 보드의 WiFi 기능을 쉽게 사용할 수 있습니다.
ESP32에는 2가지 WiFi 모드가 있습니다.
- STATION(WIFI_STA): Station 모드(STA)는 ESP32 모듈을 WiFi 액세스 포인트에 연결하는 데 사용됩니다. ESP32는 라우터에 연결된 컴퓨터처럼 작동합니다. 라우터가 인터넷에 연결되어 있으면 ESP32가 인터넷에 액세스할 수 있습니다. ESP32는 클라이언트로 작동할 수 있습니다. 즉, 네트워크에 연결된 다른 장치에 요청을 하거나 서버로 작동할 수 있습니다. 즉, 네트워크에 연결된 다른 장치가 ESP32에 요청을 보냅니다. 두 경우 모두 ESP32는 인터넷에 액세스할 수 있습니다.
- AP(액세스 포인트)(WIFI_AP): 액세스 포인트 모드에서 ESP32는 WiFi 네트워크처럼 작동합니다(라우터와 약간 비슷함): 다른 장치가 연결할 수 있습니다. 이 모드에서 ESP32는 다른 네트워크에 연결되지 않으므로 인터넷에 연결되지 않습니다. 이 모드는 ESP32가 전체 WiFi 라우터(소프트 AP)를 시뮬레이션해야 하기 때문에 계산 및 에너지 집약적입니다(ESP32 보드가 가열됨). 대기 시간과 대역폭은 기존 라우터보다 덜 효율적입니다.
참고: ESP32는 기본적으로 STATION 모드입니다.
모드 선택:
- 일반적으로 STATION 모드를 사용합니다. API에서 정보를 검색하고 센서가 있는 홈 자동화 서버를 갖기 위해 인터넷에 액세스할 수 있습니다.
- AP 모드는 일반적으로 WiFi 네트워크의 자격 증명(SSID 및 비밀번호)을 입력하는 데 일시적으로 사용됩니다. 홈 네트워크와 별도의 네트워크를 갖고 인터넷에 연결되지 않도록 사용할 수도 있습니다.
Wi-Fi 액세스 포인트에 연결
AP에 연결하는 코드는 다음과 같습니다.
#include <WiFi.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
void setup(){
Serial.begin(115200);
delay(1000);
WiFi.mode(WIFI_STA); //Optional
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(100);
}
Serial.println("\nConnected to the WiFi network");
Serial.print("Local ESP32 IP: ");
Serial.println(WiFi.localIP());
}
void loop(){}
중요
"yourNetworkName"을 WiFi 네트워크 이름으로 변경하고 "yourNetworkPassword"를 네트워크 비밀번호로 변경해야 합니다.
터미널 출력
Connecting
................
Connected to the WiFi network
Local ESP32 IP: 192.168.43.129
팁: 코드를 테스트할 WiFi 액세스 포인트를 갖는 쉬운 방법은 스마트폰에서 WiFi 연결을 공유하는 것입니다.
코드는 다음과 같이 작동합니다.
- WiFi.h 라이브러리를 포함해야 합니다.
- 그런 다음 네트워크 이름과 비밀번호를 입력합니다.
- WiFi.mode(WIFI_STA) 함수를 사용하여 ESP32를 STATION 모드로 전환합니다.
- ESP32는 WiFi.begin(ssid, password) 함수를 사용하여 Wi-Fi 네트워크에 연결을 시도합니다.
- 연결은 즉각적으로 이루어지지 않습니다! 따라서 연결 상태를 정기적으로 확인해야 합니다. ESP32가 네트워크에 연결되지 않은 한 while 루프 내부에서 차단된 상태로 유지됩니다. 상태를 지속적으로 확인하는 것을 방지하기 위해 약간의 지연을 추가합니다.
- 연결이 설정되면 이 네트워크에서 ESP32의 로컬 IP 주소가 표시됩니다.
오픈 네트워크(비밀번호 없음)인 경우 코드가 더 간단해집니다. 코드 예제는 아래와 같습니다.
#include <WiFi.h>
const char* ssid = "yourNetworkName";
void setup(){
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid);
Serial.println("\nConnecting");
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(100);
}
Serial.println("\nConnected to the WiFi network");
Serial.print("Local ESP32 IP: ");
Serial.println(WiFi.localIP());
}
void loop(){}
참고: 코드에 로그인과 비밀번호를 일반 텍스트로 저장하는 것은 나쁜 관행입니다. 따로 헤더 파일을 만들어 보관하세요. 직접 입력하는 경우는 튜토리얼이 간소화됩니다.
WiFi 네트워크 정보 가져오기
네트워크에 연결되면 네트워크에 대한 정보를 얻을 수 있습니다.
- WiFi.RSSI() 함수를 사용한 WiFi 신호 강도(RSSI)
- WiFi.BSSIDstr() 또는 WiFi.macAddress()를 사용한 WiFi 네트워크의 MAC 주소
- WiFi.localIP()를 사용한 WiFi 네트워크의 DHCP 서버에서 할당한 ESP32의 로컬 IP 주소
- WiFi.gatewayIP()를 사용한 WiFi 네트워크(게이트웨이)의 로컬 IP 주소(일반적으로 192.168.0.1)
- WiFi.subnetMask()를 사용한 서브넷 마스크(일반적으로 255.255.255.0)
아래 코드는 이 모든 정보를 표시합니다.
#include <WiFi.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
void get_network_info(){
if(WiFi.status() == WL_CONNECTED) {
Serial.print("[*] Network information for ");
Serial.println(ssid);
Serial.println("[+] BSSID : " + WiFi.BSSIDstr());
Serial.print("[+] Gateway IP : ");
Serial.println(WiFi.gatewayIP());
Serial.print("[+] Subnet Mask : ");
Serial.println(WiFi.subnetMask());
Serial.println((String)"[+] RSSI : " + WiFi.RSSI() + " dB");
Serial.print("[+] ESP32 IP : ");
Serial.println(WiFi.localIP());
}
}
void setup(){
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(100);
}
Serial.println("\nConnected to the WiFi network");
get_network_info();
}
void loop(){}
터미널 출력
Connecting
..............
Connected to the WiFi network
[*] Network information for HUAWEI_**
[+] BSSID : F0:43:47:32:1F:4D
[+] Gateway IP : 192.168.43.1
[+] Subnet Mask : 255.255.255.0
[+] RSSI : -25 dB
[+] ESP32 IP : 192.168.43.129
Wi-Fi 연결 문제 디버깅 - 연결 상태 모니터링
WiFi.status() 함수를 사용하여 WiFi 연결 상태를 알 수 있습니다. 이 함수는 연결의 현재 상태에 따라 정수를 반환합니다.
가능한 상태는 다음과 같습니다.
- WL_IDLE_STATUS: 네트워크에 연결하기 전의 기본 상태입니다.
- WL_SCAN_COMPLETED: WiFi 네트워크 스캔이 완료되었습니다.
- WL_NO_SSID_AVAIL: ESP32에서 WiFi 네트워크 이름을 찾을 수 없습니다. 네트워크가 ESP32에서 너무 멀리 떨어져 있거나 네트워크 이름(SSID)이 올바르지 않습니다.
- WL_CONNECT_FAILED : ESP32가 지정된 WiFi 네트워크에 연결할 수 없습니다.
- WL_CONNECTION_LOST : 네트워크에 대한 WiFi 연결이 끊어졌습니다. 이 오류가 반복적으로 발생하면 ESP32의 전원 문제일 수 있습니다.
- WL_CONNECTED : ESP32가 WiFi 네트워크에 연결되었습니다.
- WL_DISCONNECTED : ESP32가 WiFi 네트워크에서 연결이 끊어졌습니다.
WiFi 연결 상태를 표시하는 코드
#include <WiFi.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
String get_wifi_status(int status){
switch(status){
case WL_IDLE_STATUS:
return "WL_IDLE_STATUS";
case WL_SCAN_COMPLETED:
return "WL_SCAN_COMPLETED";
case WL_NO_SSID_AVAIL:
return "WL_NO_SSID_AVAIL";
case WL_CONNECT_FAILED:
return "WL_CONNECT_FAILED";
case WL_CONNECTION_LOST:
return "WL_CONNECTION_LOST";
case WL_CONNECTED:
return "WL_CONNECTED";
case WL_DISCONNECTED:
return "WL_DISCONNECTED";
}
}
void setup(){
Serial.begin(115200);
delay(1000);
int status = WL_IDLE_STATUS;
Serial.println("\nConnecting");
Serial.println(get_wifi_status(status));
WiFi.begin(ssid, password);
while(status != WL_CONNECTED){
delay(500);
status = WiFi.status();
Serial.println(get_wifi_status(status));
}
Serial.println("\nConnected to the WiFi network");
Serial.print("Local ESP32 IP: ");
Serial.println(WiFi.localIP());
}
void loop(){}
가능한 시나리오의 예
성공적인 연결
Connecting
WL_IDLE_STATUS
WL_DISCONNECTED
WL_DISCONNECTED
WL_CONNECTED
Connected to the WiFi network
Local ESP32 IP: 192.168.43.129
SSID를 찾을 수 없음
Connecting
WL_IDLE_STATUS
WL_DISCONNECTED
WL_DISCONNECTED
WL_NO_SSID_AVAIL
WL_NO_SSID_AVAIL
WL_NO_SSID_AVAIL
WL_NO_SSID_WORK
잘못된 비밀번호
Connecting
WL_IDLE_STATUS
WL_DISCONNECTED
WL_DISCONNECTED
WL_NO_SSID_AVAIL
WL_NO_SSID_AVAIL
WL_NO_SSID_AVAIL
WL_NO_SSID_WORK
ESP32를 다시 시작함
때때로 ESP32는 알 수 없거나 이상한 이유로 일시적으로 WiFi에 연결하지 못할 수 있습니다. 가장 좋은 해결책은 n초 후에도 ESP32가 여전히 WiFi에 연결되지 않으면 ESP32를 다시 시작한다는 것입니다. 타임아웃을 추가하고 ESP.restart() 함수를 사용하여 코드에서 ESP32를 다시 시작합니다.
다음은 ESP32가 여전히 WiFi에 연결되지 않으면 10초 후에 ESP32를 다시 시작하는 예입니다.
#include <WiFi.h>
#define CONNECTION_TIMEOUT 10
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
void setup(){
Serial.begin(115200);
delay(1000);
WiFi.mode(WIFI_STA); //Optional
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
int timeout_counter = 0;
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(200);
timeout_counter++;
if(timeout_counter >= CONNECTION_TIMEOUT*5){
ESP.restart();
}
}
Serial.println("\nConnected to the WiFi network");
Serial.print("Local ESP32 IP: ");
Serial.println(WiFi.localIP());
}
void loop(){}
ESP32는 부팅 중에 ``SW_CPU_RESET`` 플래그가 있는 코드에서 연결 실패가 발생한 경우 10초 후에 재설정됩니다. 터미널에 표시하는 메시지입니다.
onnecting
.......................................................
ets Jun 8 2016 00:22:57
rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1044
load:0x40078000,len:8896
load:0x40080400,len:5816
entry 0x400806ac
Connecting
.......
Connected to the WiFi network
Local ESP32 IP: 192.168.43.129
WiFi 채널 변경
ESP32가 기간(또는 시간대)에 따라 WiFi에 연결하는 데 어려움이 있는 경우 액세스 포인트에서 선택한 Wi-Fi 채널과 관련이 있을 수 있습니다. 사실, Wi-Fi 주파수가 2.4GHz이더라도 AP는 채널이라고 하는 2.4GHz 주변의 여러 하위 대역을 사용하여 트래픽을 줄입니다. 이를 통해 서로 간섭하지 않고 건물 내의 매우 가까운 공간에 여러 개의 다른 Wi-Fi 라우터를 둘 수 있습니다.
프랑스의 경우 사용 가능한 채널이 14개입니다. 사용 가능한 채널은 국가에 따라 다릅니다. 일반적으로 채널은 주변 AP에서 사용하는 다른 채널에 따라 라우터에서 자동으로 선택합니다(자동). 단, 실제로 라우터는 항상 마지막 채널인 12, 13, 14에 고정되어 있습니다.
한 가지 해결책은 라우터에서 사용하는 채널 번호를 예를 들어 1, 6 또는 11로 변경하는 것입니다. 이 변경은 일반적으로 IP 192.168.0.1에서 라우터의 관리자 인터페이스를 통해 수행됩니다.
Wi-Fi로 연결된 IoT 객체를 많이 사용하는 경우 두 번째 Wi-Fi 라우터를 사용하여 가정용과 IoT 용도를 분리하는 것이 좋습니다. IoT 센서 라우터에 채널 1 또는 6을 선택하고 다른 라우터에 11~14 사이의 채널을 선택하면 더 이상 Wi-Fi 연결 문제가 발생하지 않습니다.
ESP32의 고급 WiFi 네트워크
정적 IP 주소 할당
ESP32의 로컬 IP 주소는 라우터의 DHCP 서버에서 자동으로 할당되었습니다. 수동으로 입력할 필요가 없으므로 컴퓨터에서 IP 주소를 자동으로 갖는 것이 편리합니다. 단점(또는 경우에 따라 장점)은 IP 주소가 동적이라는 것입니다. 즉, 변경될 수 있습니다. 예를 들어 ESP32가 재시작되거나(또는 DHCP 임대가 만료됨) 웹 서버가 ESP32에서 실행되는 동안 IP 주소가 변경되면 귀찮을 수 있습니다. 매번 ESP32의 IP를 찾아야 합니다. 네트워크에서 ESP32의 IP 주소를 설정하여 이 문제를 해결할 수 있습니다. 이를 위해 WiFi.config(ip, dns, gateway, subnet) 함수를 사용합니다.
입력해야 하는 매개변수는 다음과 같습니다.
- IP: 할당하려는 IP 주소입니다.
- DNS: URL을 IP에 연결하는 서비스입니다. 기본적으로 라우터의 DNS 서버를 사용하므로 라우터와 동일한 주소(일반적으로 192.168.0.1)를 나타냅니다.
- GATEWAY: 라우터의 IP 주소(일반적으로 192.168.0.1)
- SUBNET: 서브넷 마스크(일반적으로 255.255.255.0)
참고: 라우터의 IP 주소를 알아야 합니다. 가장 쉬운 방법은 직렬 모니터에 WiFi 네트워크 정보를 표시하는 코드를 사용하는 것입니다.
이 예에서 휴대전화의 WiFi 연결 공유를 사용하는 경우 라우터 IP 주소는 192.168.43.1입니다. ESP32에 대해 다음과 같은 정적 IP 192.168.43.42를 선택했습니다.
ESP32의 IP 주소를 설정하는 코드
#include <WiFi.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
IPAddress ip(192, 168, 43, 42);
IPAddress dns(192, 168, 43, 1);
IPAddress gateway(192, 168, 43, 1);
IPAddress subnet(255, 255, 255, 0);
void setup(){
Serial.begin(115200);
delay(1000);
WiFi.config(ip, gateway, subnet, dns);
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(100);
}
Serial.println("\nConnected to the WiFi network");
Serial.print("[+] ESP32 IP : ");
Serial.println(WiFi.localIP());
}
void loop(){}
경고:
네트워크의 다른 장치가 이미 사용하고 있는 IP 주소를 사용하지 않도록 하는 것이 중요합니다. 라우터 설정에서 직접 MAC 주소에 연결된 고정 IP 주소를 할당할 수도 있습니다.
정보 목적으로, 그런 다음 IP 192.168.43.42로 컴퓨터를 ping하여 새 주소가 고려되었는지 확인할 수 있습니다.
Windows 명령 프롬프트에서 ping 결과, Windows 터미널(cmd.exe)에서 ESP32 ping
참고: ping: 전송 실패. 일반적인 실패라는 오류가 있는 경우 ping 사용을 비활성화하는 소프트웨어나 방화벽이 있을 수 있습니다. 이는 VPN 클라이언트의 경우일 수 있습니다.
MAC 주소 변경
일부 애플리케이션에서는 ESP32의 MAC 주소를 변경하는 것이 흥미로울 수 있습니다. esp_wifi_set_mac() 함수를 사용하여 몇 줄의 코드로 MAC 주소를 변경할 수 있습니다.
참고:
MAC 주소 변경은 일시적이며 원래 MAC 주소를 대체하지 않습니다. 원래 MAC 주소를 찾으려면 새 프로그램을 업로드해야 합니다.
#include <WiFi.h>
#include <esp_wifi.h>
uint8_t new_mac[] = {0x60, 0x8B, 0x0E, 0x01, 0x5A, 0x32};
void setup(){
Serial.begin(115200);
WiFi.mode(WIFI_STA);//Needed to change MAC adress
Serial.print("[+] Current MAC Address: ");
Serial.println(WiFi.macAddress());
esp_wifi_set_mac(ESP_IF_WIFI_STA, new_mac);
Serial.print("[+] New MAC Address: ");
Serial.println(WiFi.macAddress());
}
void loop(){}
직렬 터미널:
[+] Current MAC Address: 24:6F:28:BB:2E:E8
[+] New MAC Address: 60:8B:0E:01:5A:32
수정된 MAC 주소로 Wi-Fi 네트워크에 연결하는 코드
#include <WiFi.h>
#include <esp_wifi.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
uint8_t new_mac[] = {0x6C, 0x8D, 0xC1, 0x01, 0x5A, 0x32};
void setup(){
Serial.begin(115200);
WiFi.mode(WIFI_STA);//Needed to change MAC adress
esp_wifi_set_mac(ESP_IF_WIFI_STA, new_mac);
delay(1000);
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(100);
}
Serial.println("\nConnected to the WiFi network");
Serial.print("Local ESP32 IP: ");
Serial.println(WiFi.localIP());
}
void loop(){}
와이어샤크 캡처를 보면 주소가 변경되었음을 알 수 있습니다(여기서는 Apple MAC 주소로 변경됨):
에너지 절약
반드시 WiFi를 사용해야 하는 프로젝트에서 ESP32를 사용하는 경우, 연결에 실패할 경우 전력 소모를 최소화하기 위해 ESP32를 딥 슬립 모드로 설정하는 것이 좋습니다. 이는 각 시도 사이에 10초 동안 슬립하는 ESP32 코드와 유사합니다.
ESP32를 2번의 시도 사이에 Deep Sleep 상태로 전환할 수 있는 코드
#include <WiFi.h>
#include <esp_wifi.h>
//Time in seconds
#define CONNECTION_TIMEOUT 5
#define DEEP_SLEEP_DURATION 10
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
void setup(){
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
int timeout_counter = 0;
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(100);
timeout_counter++;
if(timeout_counter >= CONNECTION_TIMEOUT*10){
Serial.println("\nCan't establish WiFi connexion");
//Setup timer
esp_sleep_enable_timer_wakeup(DEEP_SLEEP_DURATION * 1000000);
//Start deep sleep
esp_deep_sleep_start();
}
}
Serial.println("\nConnected to the WiFi network");
Serial.print("Local ESP32 IP: ");
Serial.println(WiFi.localIP());
}
void loop(){}
WiFi 이벤트를 사용하여 최적화된 코드 만들기
지금까지 WiFi 함수를 폴링했습니다. ESP32는 ESP32 WiFi 드라이버에서 이벤트를 수신할 때까지 차단된 상태로 유지됩니다. 순차적 프로그래밍을 수행했습니다. 다음은 예입니다.
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(100);
}
ESP32가 WiFi 네트워크에 성공적으로 연결되었는지 정기적으로 확인합니다. 기다리는 동안 아무것도 하지 않고(2번의 폴 사이에 계산을 할 수 있음) 루프에 갇힙니다.
이를 수행하는 더 효율적인 방법은 이벤트 기반 프로그래밍을 사용하는 것입니다. 실제로 WiFi 상태가 변경되면 이벤트가 생성됩니다. 장점은 수신된 이벤트에 따라 코드를 자동으로 실행할 수 있다는 것입니다. 이는 GPIO 핀에서 사용하는 인터럽트와 매우 유사합니다. 핀 상태가 변경되면 인터럽트가 생성되어 우선순위가 높은 코드의 일부가 실행됩니다. 여기서 WiFi 상태의 변화는 코드의 일부를 실행하는 이벤트를 생성합니다.
이벤트를 관리하기 위한 기본 코드는 다음과 같습니다.
#include <WiFi.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
void my_function(WiFiEvent_t wifi_event, WiFiEventInfo_t wifi_info){
//Code
}
void setup(){
Serial.begin(115200);
delay(1000);
WiFi.mode(WIFI_STA); //Optional
WiFi.onEvent(my_function, WIFI_EVENT_ID);
WiFi.begin(ssid, password);
}
void loop(){}
WiFi.onEvent(my_function, WIFI_EVENT_ID) 함수를 사용하여 이벤트 WIFI_EVENT_ID가 감지될 때 실행할 함수를 지정합니다. WIFI_EVENT_ID는 이벤트의 이름이나 번호로 대체해야 합니다(아래 표 참조). my_function() 함수는 사용되지 않더라도 매개변수 WiFiEvent_t wifi_event , WiFiEventInfo_t wifi_info를 가져야 합니다.
경고:
설치한 Arduino 코드의 ESP32 포트 버전에 따라 이벤트 이름이 다릅니다.
Version 2.0x
Number | Event Name | Description |
0 | ARDUINO_EVENT_WIFI_READY | ESP32 WiFi ready |
1 | ARDUINO_EVENT_WIFI_SCAN_DONE | ESP32 finish scanning AP |
2 | ARDUINO_EVENT_WIFI_STA_START | ESP32 station start |
3 | ARDUINO_EVENT_WIFI_STA_STOP | ESP32 station stop |
4 | ARDUINO_EVENT_WIFI_STA_CONNECTED | ESP32 station connected to AP |
5 | ARDUINO_EVENT_WIFI_STA_DISCONNECTED | ESP32 station disconnected from AP |
6 | ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE | the auth mode of AP connected by ESP32 station changed |
7 | ARDUINO_EVENT_WIFI_STA_GOT_IP | ESP32 station got IP from connected AP |
8 | ARDUINO_EVENT_WIFI_STA_LOST_IP | ESP32 station lost IP and the IP is reset to 0 |
9 | ARDUINO_EVENT_WPS_ER_SUCCESS | ESP32 station wps succeeds in enrollee mode |
10 | ARDUINO_EVENT_WPS_ER_FAILED | ESP32 station wps fails in enrollee mode |
11 | ARDUINO_EVENT_WPS_ER_TIMEOUT | ESP32 station wps timeout in enrollee mode |
12 | ARDUINO_EVENT_WPS_ER_PIN | ESP32 station wps pin code in enrollee mode |
13 | ARDUINO_EVENT_WIFI_AP_START | ESP32 soft-AP start |
14 | ARDUINO_EVENT_WIFI_AP_STOP | ESP32 soft-AP stop |
15 | ARDUINO_EVENT_WIFI_AP_STACONNECTED | a station connected to ESP32 soft-AP |
16 | ARDUINO_EVENT_WIFI_AP_STADISCONNECTED | a station disconnected from ESP32 soft-AP |
17 | ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED | ESP32 soft-AP assign an IP to a connected station |
18 | ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED | Receive probe request packet in soft-AP interface |
19 | ARDUINO_EVENT_WIFI_AP_GOT_IP6 | ESP32 ap interface v6IP addr is preferred |
19 | ARDUINO_EVENT_WIFI_STA_GOT_IP6 | ESP32 station interface v6IP addr is preferred |
20 | ARDUINO_EVENT_ETH_START | ESP32 ethernet start |
21 | ARDUINO_EVENT_ETH_STOP | ESP32 ethernet stop |
22 | ARDUINO_EVENT_ETH_CONNECTED | ESP32 ethernet phy link up |
23 | ARDUINO_EVENT_ETH_DISCONNECTED | ESP32 ethernet phy link down |
24 | ARDUINO_EVENT_ETH_GOT_IP | ESP32 ethernet got IP from connected AP |
19 | ARDUINO_EVENT_ETH_GOT_IP6 | ESP32 ethernet interface v6IP addr is preferred |
25 | ARDUINO_EVENT_MAX |
Old Version 1.x
Number | Event Name | Description |
0 | SYSTEM_EVENT_WIFI_READY | ESP32 WiFi ready |
1 | SYSTEM_EVENT_SCAN_DONE | ESP32 finish scanning AP |
2 | SYSTEM_EVENT_STA_START | ESP32 station start |
3 | SYSTEM_EVENT_STA_STOP | ESP32 station stop |
4 | SYSTEM_EVENT_STA_CONNECTED | ESP32 station connected to AP |
5 | SYSTEM_EVENT_STA_DISCONNECTED | ESP32 station disconnected from AP |
6 | SYSTEM_EVENT_STA_AUTHMODE_CHANGE | the auth mode of AP connected by ESP32 station changed |
7 | SYSTEM_EVENT_STA_GOT_IP | ESP32 station got IP from connected AP |
8 | SYSTEM_EVENT_STA_LOST_IP | ESP32 station lost IP and the IP is reset to 0 |
9 | SYSTEM_EVENT_STA_WPS_ER_SUCCESS | ESP32 station wps succeeds in enrollee mode |
10 | SYSTEM_EVENT_STA_WPS_ER_FAILED | ESP32 station wps fails in enrollee mode |
11 | SYSTEM_EVENT_STA_WPS_ER_TIMEOUT | ESP32 station wps timeout in enrollee mode |
12 | SYSTEM_EVENT_STA_WPS_ER_PIN | ESP32 station wps pin code in enrollee mode |
13 | SYSTEM_EVENT_AP_START | ESP32 soft-AP start |
14 | SYSTEM_EVENT_AP_STOP | ESP32 soft-AP stop |
15 | SYSTEM_EVENT_AP_STACONNECTED | a station connected to ESP32 soft-AP |
16 | SYSTEM_EVENT_AP_STADISCONNECTED | a station disconnected from ESP32 soft-AP |
17 | SYSTEM_EVENT_AP_STAIPASSIGNED | ESP32 soft-AP assign an IP to a connected station |
18 | SYSTEM_EVENT_AP_PROBEREQRECVED | Receive probe request packet in soft-AP interface |
19 | SYSTEM_EVENT_GOT_IP6 | ESP32 station or ap or ethernet interface v6IP addr is preferred |
20 | SYSTEM_EVENT_ETH_START | ESP32 ethernet start |
21 | SYSTEM_EVENT_ETH_STOP | ESP32 ethernet stop |
22 | SYSTEM_EVENT_ETH_CONNECTED | ESP32 ethernet phy link up |
23 | SYSTEM_EVENT_ETH_DISCONNECTED | ESP32 ethernet phy link down |
24 | SYSTEM_EVENT_ETH_GOT_IP | ESP32 ethernet got IP from connected AP |
25 | SYSTEM_EVENT_MAX |
다음 코드는 처음에 라우터에 연결하는 코드와 동일한 작업을 수행하지만 이번에는 네트워크에 연결될 때 이벤트를 사용합니다.
WiFi 이벤트로 라우터에 연결할 수 있는 코드
#include <WiFi.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
void connected_to_ap(WiFiEvent_t wifi_event, WiFiEventInfo_t wifi_info) {
Serial.println("\nConnected to the WiFi network");
}
void got_ip_from_ap(WiFiEvent_t wifi_event, WiFiEventInfo_t wifi_info) {
Serial.print("Local ESP32 IP: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.mode(WIFI_STA); //Optional
WiFi.onEvent(connected_to_ap, ARDUINO_EVENT_WIFI_STA_CONNECTED);
WiFi.onEvent(got_ip_from_ap, ARDUINO_EVENT_WIFI_STA_GOT_IP);
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
}
void loop() {}
콘솔 출력:
Connecting
.............
Connected to the WiFi network
Local ESP32 IP: 192.168.43.167
wifi.removeEvent(WIFI_EVENT_ID)를 사용하여 프로그램 실행 중에 이벤트에 연결된 함수 실행을 제거할 수 있습니다.
이벤트의 실용적인 사용 사례는 연결이 끊어진 경우 ESP32를 자동으로 다시 연결할 수 있는 가능성입니다.
#include <WiFi.h>
const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";
void connected_to_ap(WiFiEvent_t wifi_event, WiFiEventInfo_t wifi_info) {
Serial.println("[+] Connected to the WiFi network");
}
void disconnected_from_ap(WiFiEvent_t wifi_event, WiFiEventInfo_t wifi_info) {
Serial.println("[-] Disconnected from the WiFi AP");
WiFi.begin(ssid, password);
}
void got_ip_from_ap(WiFiEvent_t wifi_event, WiFiEventInfo_t wifi_info) {
Serial.print("[+] Local ESP32 IP: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.mode(WIFI_STA); //Optional
WiFi.onEvent(connected_to_ap, ARDUINO_EVENT_WIFI_STA_CONNECTED);
WiFi.onEvent(got_ip_from_ap, ARDUINO_EVENT_WIFI_STA_GOT_IP);
WiFi.onEvent(disconnected_from_ap, ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
WiFi.begin(ssid, password);
Serial.println("\nConnecting");
}
void loop() {}
콘솔 출력:
Connecting
[-] Disconnected from the WiFi AP
[+] Connected to the WiFi network
[+] Local ESP32 IP: 192.168.43.167
[-] Disconnected from the WiFi AP
[-] Disconnected from the WiFi AP
[-] Disconnected from the WiFi AP
[-] Disconnected from the WiFi AP
[+] Connected to the WiFi network
Local ESP32 IP: 192.168.43.167
애플리케이션 예: Wi-Fi 스캔
다음은 주변의 WiFi 네트워크를 스캔할 수 있는 구체적인 애플리케이션입니다.
#include "WiFi.h"
String get_encryption_type(wifi_auth_mode_t encryptionType) {
switch (encryptionType) {
case (WIFI_AUTH_OPEN):
return "Open";
case (WIFI_AUTH_WEP):
return "WEP";
case (WIFI_AUTH_WPA_PSK):
return "WPA_PSK";
case (WIFI_AUTH_WPA2_PSK):
return "WPA2_PSK";
case (WIFI_AUTH_WPA_WPA2_PSK):
return "WPA_WPA2_PSK";
case (WIFI_AUTH_WPA2_ENTERPRISE):
return "WPA2_ENTERPRISE";
}
}
void setup(){
Serial.begin(115200);
WiFi.mode(WIFI_STA);
}
void loop() {
Serial.println("uPesy WiFi Scan Demo");
Serial.println("[*] Scanning WiFi network");
// WiFi.scanNetworks will return the number of networks found
int n = WiFi.scanNetworks();
Serial.println("[*] Scan done");
if (n == 0) {
Serial.println("[-] No WiFi networks found");
} else {
Serial.println((String)"[+] " + n + " WiFi networks found\n");
for (int i = 0; i < n; ++i) {
// Print SSID, RSSI and WiFi Encryption for each network found
Serial.print(i + 1);
Serial.print(": ");
Serial.print(WiFi.SSID(i));
Serial.print(" (");
Serial.print(WiFi.RSSI(i));
Serial.print(" dB) [");
Serial.print(get_encryption_type(WiFi.encryptionType(i)));
Serial.println("]");
delay(10);
}
}
Serial.println("");
// Wait a bit before scanning again
delay(5000);
}
위 예제 튜토리얼 참고 문서는 이 링크를 따라가시면 만날 수 있습니다. 또한 다른 예제도 참고하세요.
'ESP32' 카테고리의 다른 글
ESP32 빠르게 시작하기: 초보자를 위한 ESP32 개발 가이드 (4) | 2025.03.27 |
---|---|
ESP32: Wi-Fi 관리자 만들기, AsyncWebServer 라이브러리 (0) | 2025.03.23 |
ESP 32 코어 보드 ESP32-C6-DevKit C (0) | 2025.03.22 |
ESP32 package_esp32_index.json 파일 다운로드 너무 오래 걸리면 (0) | 2025.03.20 |
ESP32 종합 가이드 (12) | 2025.03.18 |
ESP8266 미니 날씨 시계 WIFI 디지털 시계 (1) | 2025.03.13 |
MQTT란 무엇이며 어떻게 작동하는가 (0) | 2025.03.12 |
ESP32 및 Python을 사용한 손동작 인식 (2) | 2025.03.05 |
더욱 좋은 정보를 제공하겠습니다.~ ^^