이 튜토리얼에서는 ESP32에서 BLE를 통해 Wi-Fi 프로비저닝을 설정하는 방법을 알아봅니다. Wi-Fi 프로비저닝 서비스를 사용하면 Bluetooth Low Energy를 통해 Wi-Fi 자격 증명을 구성할 수 있습니다. 이는 인터넷 연결을 위해 Wi-Fi 자격 증명이 필요한 IoT 프로젝트에 매우 유용한 옵션이며, 개발 중에 Arduino 스케치에 자격 증명을 직접 입력할 필요가 없습니다.
ESP32에서 BLE(Bluetooth Low Energy)를 이용한 Wi-Fi 프로비저닝 방법을 아두이노 IDE 환경에서 구현하는 방법을 알아봅니다.

목차:
- Wi-Fi 프로비저닝
- BLE를 통한 프로비저닝
- Wi-Fi 프로비저닝 앱
- BLE를 통한 ESP32 WiFi 프로비저닝 - 코드
- 코드 업로드 방법 안내
- 코드 테스트
- Wi-Fi 프로젝트에 Wi-Fi 프로비저닝을 적용하는 방법
Wi-Fi 프로비저닝
Wi-Fi 프로비저닝은 새로운 Wi-Fi 장치(스테이션)를 Wi-Fi 네트워크(액세스 포인트)에 연결하는 과정입니다. 이 경우 ESP32를 Wi-Fi 네트워크에 연결하려고 합니다. 프로비저닝 과정에는 연결하려는 네트워크 이름(SSID)과 비밀번호를 ESP32에 저장하는 작업이 포함됩니다.
ESP32는 SoftAP(액세스 포인트) 또는 Bluetooth Low Energy를 통한 Wi-Fi 프로비저닝을 지원합니다. 이 튜토리얼에서는 Bluetooth를 통한 Wi-Fi 프로비저닝에 대해 다룹니다.
BLE를 통한 프로비저닝
ESP32를 BLE를 통해 프로비저닝하려면 BLE를 지원하는 다른 장치(일반적으로 스마트폰)를 사용하여 ESP32에 BLE로 연결하고 Wi-Fi 자격 증명을 전송해야 합니다. 안드로이드 또는 iOS 앱이나 웹 기반 블루투스 앱을 사용할 수 있습니다.
Espressif는 ESP32 보드와 같은 자사 기기의 Wi-Fi 프로비저닝을 지원하는 Android 및 iOS 앱을 개발했습니다. 또는 직접 BLE 앱을 개발할 수도 있습니다.
프로비저닝 프로세스가 완료되면 ESP32는 제공된 네트워크 자격 증명을 사용하여 원하는 Wi-Fi 네트워크에 연결할 수 있습니다.

ESP32 BLE 기반 Wi-Fi 프로비저닝
작동 방식에 대한 간략한 요약은 다음과 같습니다.
- 기존 네트워크에 연결하려는 새로운 장치가 있습니다. 저희의 경우 ESP32입니다.
- BLE를 통해 ESP32에 연결합니다. Wi-Fi 프로비저닝 앱에서 ESP32가 연결할 네트워크의 SSID와 비밀번호를 입력하고 전송합니다.
- 마지막으로 ESP32는 제공된 자격 증명을 사용하여 네트워크에 연결합니다. 이때부터 ESP32는 필요한 모든 Wi-Fi 관련 작업을 수행할 수 있습니다.
Wi-Fi 프로비저닝 앱
BLE를 통해 ESP32에 연결하고 자격 증명을 전송하기 위해 Espressif에서 개발한 Wi-Fi 프로비저닝 앱을 사용하겠습니다(또는 직접 BLE 앱을 만들 수도 있습니다).
Wi-Fi 프로비저닝 앱 설치하기
진행하기 전에 스마트폰에 Wi-Fi 프로비저닝 앱이 설치되어 있는지 확인하십시오.
안드로이드 기기용 Wi-Fi 프로비저닝 앱 – ( 앱 소스 코드 )
iOS 기기용 Wi-Fi 프로비저닝 앱 – ( 앱 소스 코드 )

Wi-Fi 프로비저닝 앱 - espressif
BLE를 통한 ESP32 WiFi 프로비저닝 - 코드
다음 코드는 ESP32를 BLE를 통한 Wi-Fi 프로비저닝에 적합하게 준비합니다. 이는 이를 위해 필요한 최소한의 코드입니다. 이 코드는 액세스 포인트를 통한 Wi-Fi 프로비저닝도 지원하는 공식 예제 코드를 약간 수정하여 작성했습니다.
다음 코드를 아두이노 IDE에 복사하세요.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-wi-fi-provisioning-ble-arduino/
Please read README.md file in this folder, or on the web: https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFiProv/examples/WiFiProv
Note: This sketch takes up a lot of space for the app and may not be able to flash with default setting on some chips.
If you see Error like this: "Sketch too big"
In Arduino IDE go to: Tools > Partition scheme > chose anything that has more than 1.4MB APP
- for example "No OTA (2MB APP/2MB SPIFFS)"
*********/
#include "WiFiProv.h"
#include "WiFi.h"
const char * pop = "abcd1234"; // Proof of possession - otherwise called a PIN - string provided by the device, entered by the user in the phone app
const char * service_name = "PROV_123"; // Name of your device (the Espressif apps expects by default device name starting with "Prov_")
const char * service_key = NULL; // Password used for SofAP method (NULL = no password needed)
bool reset_provisioned = true; // When true the library will automatically delete previously provisioned data.
// WARNING: SysProvEvent is called from a separate FreeRTOS task (thread)!
void SysProvEvent(arduino_event_t *sys_event) {
switch (sys_event->event_id) {
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.print("\nConnected IP address : ");
Serial.println(IPAddress(sys_event->event_info.got_ip.ip_info.ip.addr));
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: Serial.println("\nDisconnected. Connecting to the AP again... "); break;
case ARDUINO_EVENT_PROV_START: Serial.println("\nProvisioning started\nGive Credentials of your access point using smartphone app"); break;
case ARDUINO_EVENT_PROV_CRED_RECV:
{
Serial.println("\nReceived Wi-Fi credentials");
Serial.print("\tSSID : ");
Serial.println((const char *)sys_event->event_info.prov_cred_recv.ssid);
Serial.print("\tPassword : ");
Serial.println((char const *)sys_event->event_info.prov_cred_recv.password);
break;
}
case ARDUINO_EVENT_PROV_CRED_FAIL:
{
Serial.println("\nProvisioning failed!\nPlease reset to factory and retry provisioning\n");
if (sys_event->event_info.prov_fail_reason == NETWORK_PROV_WIFI_STA_AUTH_ERROR) {
Serial.println("\nWi-Fi AP password incorrect");
} else {
Serial.println("\nWi-Fi AP not found....Add API \" nvs_flash_erase() \" before beginProvision()");
}
break;
}
case ARDUINO_EVENT_PROV_CRED_SUCCESS: Serial.println("\nProvisioning Successful"); break;
case ARDUINO_EVENT_PROV_END: Serial.println("\nProvisioning Ends"); break;
default: break;
}
}
void setup() {
Serial.begin(115200);
WiFi.onEvent(SysProvEvent);
Serial.println("Begin Provisioning using BLE");
// Sample uuid that user can pass during provisioning using BLE
uint8_t uuid[16] = {0xb4, 0xdf, 0x5a, 0x1c, 0x3f, 0x6b, 0xf4, 0xbf,
0xea, 0x4a, 0x82, 0x03, 0x04, 0x90, 0x1a, 0x02 };
WiFiProv.beginProvision(
NETWORK_PROV_SCHEME_BLE, NETWORK_PROV_SCHEME_HANDLER_FREE_BLE, NETWORK_PROV_SECURITY_1, pop, service_name, service_key, uuid, reset_provisioned
);
log_d("ble qr");
WiFiProv.printQR(service_name, pop, "ble");
}
void loop() {
}
코드 작동 방식
코드가 어떻게 작동하는지 간단히 살펴보겠습니다(또는 다음 섹션으로 넘어가셔도 됩니다 ).
먼저, 필요한 라이브러리를 포함합니다. Wi-Fi 프로비저닝을 위한 WiFiProv.h와 Wi-Fi 관련 기능을 위한 WiFi.h입니다.
#include "WiFiProv.h"
#include "WiFi.h"
프로비저닝 세부 정보
다음으로, 프로비저닝 서비스에 대한 세부 정보를 저장할 몇 가지 변수를 선언합니다.
pop 변수는 소유권 증명 역할을 하며, 스마트폰을 특정 기기에 연결할 수 있도록 하는 암호와 같습니다. 테스트를 위해 기본값을 사용할 것입니다.
const char * pop = "abcd1234"; //소유 증명 - 일명 PIN - 기기에서 제공되는 문자열로, 사용자가 휴대폰 앱에 입력함
서비스 이름은 당사 BLE 장치의 이름입니다. 본 튜토리얼에서처럼 Espressif 앱을 사용하는 경우 서비스 이름은 반드시 접두사 PROV_로 시작해야 합니다.
const char * service_name = "PROV_123"; // 장치 이름 (Espressif 앱은 기본적으로 "Prov_"로 시작하는 장치 이름을 기대합니다)
서비스 키는 액세스 포인트를 통한 Wi-Fi 프로비저닝(본 가이드에 포함되지 않음) 시 사용됩니다. 필요하지 않으므로 NULL로 설정하십시오.
const char * service_key = NULL; // SofAP 방법에 사용되는 비밀번호 (NULL = 비밀번호 불필요)
reset_provisioned는 라이브러리가 이전에 프로비저닝된 데이터를 삭제해야 하는지 여부를 나타내는 부울 변수입니다.
bool reset_provisioned = true; // 이 조건이 참일 경우 라이브러리는 이전에 프로비저닝된 데이터를 자동으로 삭제합니다.
Wi-Fi 이벤트 콜백 함수
setup() 함수에서 Wi-Fi 이벤트 발생 시 실행될 함수를 설정합니다. 이 경우, 어떤 Wi-Fi 이벤트가 발생하더라도 SysProvEvent() 함수를 호출합니다. 이후 SysProvEvent() 함수에서 감지된 Wi-Fi 이벤트에 따라 수행할 작업을 결정합니다.
WiFi.onEvent(SysProvEvent);
다음 내용도 흥미로울 수 있습니다: ESP32 유용한 Wi-Fi 라이브러리 함수 (Arduino IDE)
WiFi 프로비저닝 시작
Wi-Fi 프로비저닝 프로세스를 시작하는 것은 적절한 인수를 사용하여 WiFiProv.beginProvision()을 호출하는 것만큼 간단합니다.
WiFiProv.beginProvision(WIFI_PROV_SCHEME_BLE, WIFI_PROV_SCHEME_HANDLER_FREE_BTDM, WIFI_PROV_SECURITY_1, pop, service_name, service_key, uuid, reset_provisioned);
QR 코드 인쇄
또한 Wi-Fi 프로비저닝 앱에서 인식할 수 있는 QR 코드에 BLE 프로비저닝 세부 정보를 인쇄합니다.
log_d("ble qr");
WiFiProv.printQR(service_name, pop, "ble");
와이파이 이벤트 감지
다양한 Wi-Fi 이벤트는 SysProvEenvent()로 전달됩니다.
ARDUINO_EVENT_WIFI_STA_GOT_IP
ESP32가 네트워크에 연결되어 IP 주소를 할당받으면 ARDUINO_EVENT_WIFI_STA_GOT_IP 이벤트를 감지합니다. 이때 ESP32의 IP 주소를 출력합니다(필요에 따라 다른 작업을 실행하거나, ESP32가 Wi-Fi에 연결되었음을 나타내는 플래그 변수를 추가하여 loop() 내에서 Wi-Fi 관련 작업을 실행할 수 있습니다).
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.print("\nConnected IP address : ");
Serial.println(IPAddress(sys_event->event_info.got_ip.ip_info.ip.addr));
break;
ARDUINO_EVENT_PROV_START
ARDUINO_EVENT_PROV_START 이벤트는 프로비저닝 프로세스가 시작될 때 발생합니다. 이는 setup() 내에서 WiFiProv.beginProvision() 함수를 호출할 때 발생합니다.
case ARDUINO_EVENT_PROV_START:
Serial.println("\nProvisioning started\nGive Credentials of your access point using smartphone app");
break;
ARDUINO_EVENT_PROV_CRED_RECV
이 이벤트는 보드가 Wi-Fi 프로비저닝을 통해 자격 증명을 수신할 때 발생합니다. 이 경우 수신된 SSID와 비밀번호를 출력합니다. 또는 프로젝트에 유용하다면 자격 증명을 파일에 영구적으로 저장할 수도 있습니다.
case ARDUINO_EVENT_PROV_CRED_RECV: {
Serial.println("\nReceived Wi-Fi credentials");
Serial.print("\tSSID : ");
Serial.println((const char *) sys_event->event_info.prov_cred_recv.ssid);
Serial.print("\tPassword : ");
Serial.println((char const *) sys_event->event_info.prov_cred_recv.password);
break;
}
ARDUINO_EVENT_PROV_CRED_FAIL
이 이벤트는 Wi-Fi 프로비저닝을 통해 제공된 자격 증명으로 네트워크에 연결하는 데 실패할 경우 실행됩니다.
case ARDUINO_EVENT_PROV_CRED_FAIL: {
Serial.println("\nProvisioning failed!\nPlease reset to factory and retry provisioning\n");
if(sys_event->event_info.prov_fail_reason == WIFI_PROV_STA_AUTH_ERROR)
Serial.println("\nWi-Fi AP password incorrect");
else
Serial.println("\nWi-Fi AP not found....Add API \" nvs_flash_erase() \" before beginProvision()");
break;
}
ARDUINO_EVENT_PROV_CRED_SUCCESS
ESP32가 Wi-Fi 프로비저닝을 통해 제공된 자격 증명을 사용하여 네트워크에 성공적으로 연결되면 ARDUINO_EVEN_PROV_CRED_SUCCESS 이벤트가 실행됩니다.
case ARDUINO_EVENT_PROV_CRED_SUCCESS:
Serial.println("\nProvisioning Successful");
break;
ARDUINO_EVENT_PROV_END
마지막으로, 프로비저닝 프로세스가 종료되면 ARDUINO_EVENT_PROV_END 이벤트가 발생합니다.
case ARDUINO_EVENT_PROV_END:
Serial.println("\nProvisioning Ends");
break;
코드 업로드 방법 안내
이 코드는 용량이 커서 일부 칩에서는 기본 설정으로 플래싱이 제대로 되지 않을 수 있습니다.
업로드 과정에서 "스케치 크기가 너무 큽니다"와 같은 오류가 발생하는 경우, Arduino IDE에서 도구 > 파티션 구성표 로 이동하여 1.4MB 이상의 앱 크기를 가진 파티션을 선택하세요. 예를 들어 " 대용량 앱(OTA 없음 3MB/SPIFFS 1MB) "을 선택할 수 있습니다.

ESP32에서 다른 파티션 구성표 선택하기
도구 메뉴 에 파티션 구성표 옵션이 없으면 ESP32 Wrover 모듈과 같은 다른 ESP32 보드 모델을 선택해야 합니다.
코드 테스트
ESP32에 코드를 업로드한 후, 115200bps의 전송 속도로 시리얼 모니터를 엽니다. ESP32의 RST 버튼을 눌러 코드 실행을 시작하세요.
참고: PSRAM 오류가 발생할 수 있습니다. 이 오류는 무시하셔도 됩니다.
시리얼 모니터에도 비슷한 내용이 표시될 겁니다.
Begin Provisioning using BLE
Provisioning started
Give Credentials of your access point using smartphone app

ESP32에서 BLE 시리얼 모니터를 통해 Wi-Fi 프로비저닝을 시작합니다.
이제 스마트폰에서 Espressif WiFi Provisioning 앱을 열고 "장치 프로비저닝"을 클릭하세요 . QR 코드를 스캔하는 옵션이 있지만, 저는 작동하지 않았습니다.
"QR 코드가 없습니다 "를 클릭하세요.
이 프로그램은 범위 내의 모든 블루투스 장치를 " PROV_ " 접두사와 함께 나열합니다. 저희 코드는 ESP32를 " PROV_123 "이라는 BLE 장치로 설정했습니다. 해당 장치를 클릭해 보세요.

Wi-Fi 프로비저닝 앱 - 기기 프로비저닝

BLE를 통한 Wi-Fi 제공 - BLE 장치 찾기
다음으로, 소유권 증명을 입력해야 합니다. 이는 코드에 사용된 것과 동일한 것이어야 합니다. 기본값을 사용하므로 abcd1234 가 됩니다 . 입력 후, 해당 범위 내의 모든 Wi-Fi 네트워크 목록이 표시됩니다(네트워크가 목록에 표시되지 않으면 "다른 네트워크에 연결"을 클릭하여 수동으로 입력해야 할 수 있습니다).

Espressif Wi-Fi 프로비저닝 시 소유 증명을 입력하세요

Wi-Fi 프로비저닝 앱 - Wi-Fi 네트워크 목록 표시
마지막으로 Wi-Fi 네트워크 비밀번호를 입력하고 연결을 클릭하세요. 몇 초 후 Wi-Fi 자격 증명이 ESP32로 전송됩니다.

ESP32에서 BLE를 이용한 WiFi 프로비저닝: SSID 및 비밀번호 입력

ESP32 WiFi 프로비저닝 성공
시리얼 모니터에서 ESP32가 Wi-Fi 자격 증명을 수신하고 네트워크에 성공적으로 연결된 것을 확인할 수 있습니다(연결된 네트워크에 IP 주소를 출력했습니다).

ESP32 WiFi 프로비저닝 성공 (시리얼 모니터)
이것으로 끝입니다. ESP32에서 Wi-Fi 프로비저닝이 성공적으로 구현되었습니다.
Wi-Fi 프로젝트에 Wi-Fi 프로비저닝을 적용하는 방법
Wi-Fi를 사용하는 프로젝트에 이 기능을 추가하려면, ESP32가 이미 인터넷에 연결되었는지 여부를 나타내는 전역 변수를 생성하는 것이 좋습니다. 해당 변수는 ARDUINO_EVENT_WIFI_STA_GOT_IP 이벤트가 발생할 때 true로 변경됩니다.
그런 다음 loop() 함수 내에서 해당 변수의 상태를 확인하세요. true라면 Wi-Fi 관련 작업을 실행하고, 그렇지 않다면 보드가 연결을 설정할 때까지 기다리면 됩니다.
이 기능을 활용한 웹 서버 예제를 곧 소개할 예정이니 기대해 주세요.
마무리
이 튜토리얼에서는 ESP32 장치에 BLE를 통한 Wi-Fi 프로비저닝을 추가하는 방법을 보여드렸습니다. WiFiProv 라이브러리와 Espressif 프로비저닝 앱 덕분에 이 기능을 사용하는 것은 간단하고 쉽습니다.
개발 중에 Wi-Fi 자격 증명을 하드코딩할 필요 없이 인터넷에 연결해야 하는 IoT 프로젝트에 훌륭한 옵션입니다. 이는 프로젝트를 훨씬 더 유연하게 만듭니다.
이 주제에 관한 추가 튜토리얼을 곧 제작할 예정이니 계속 지켜봐 주세요. 다음 글도 읽어보시기 바랍니다:
- ESP32: Create a Wi-Fi Manager (AsyncWebServer library)
- ESP32 WiFiMulti: Connect to the Strongest Wi-Fi Network (from a list of networks)
- ESP32 Useful Wi-Fi Library Functions (Arduino IDE)
위 튜토리얼의 원문은 언제나 좋은 기술을 알려주는 다음 웹 사이트를 참고했습니다. 원문으로 가시려면 따라가세요.
참고 사항: 혹시 안되신다면 읽어보세요.
/* 이 폴더의 README.md 파일을 읽거나 다음 웹 링크를 참조하세요: https://github.com/espressif/arduino-esp32/tree/master/libraries/WiFiProv/examples/WiFiProv */ 참고: 이 스케치는 앱 용량을 많이 차지하므로 일부 칩에서는 기본 설정으로 플래싱이 제대로 되지 않을 수 있습니다. 아두이노 IDE에서 "스케치 크기가 너무 큽니다"와 같은 오류가 발생하는 경우, 도구 > 파티션 구성표로 이동하여 앱 용량이 1.4MB 이상인 파티션을 선택하세요 . 예를 들어 "OTA 없음(앱 2MB/스피프 2MB)"을 선택할 수 있습니다
안녕하세요, Espressif 앱을 사용하면서 문제가 하나 있습니다. 바로 동적 IP 주소만 사용하여 프로비저닝을 지원한다는 점입니다. 프로비저닝 과정에서 고정 IP 주소도 설정하고 싶은데 어떻게 해야 할까요? 만약 앱에서 이 기능을 지원하지 않는다면, 제가 직접 프로세스/앱을 개발해야 한다고 하셨는데, 그 방법에 대한 안내가 있을까요? 감사합니다!
현재로서는 해당 애플리케이션에 대한 구체적인 설명서는 없습니다. 하지만 참고하실 수 있는 웹 BLE 앱 튜토리얼이 있습니다. 다음 링크를 확인해 보세요: https://randomnerdtutorials.com/esp32-web-bluetooth/
DHCP 서버를 구성하여 특정 MAC 주소(이 경우 ESP 보드의 MAC 주소)에 항상 동일한 IP 주소를 할당하도록 설정할 수 있습니다.
'ESP32' 카테고리의 다른 글
| ESP32 펌웨어 크기로 OTA 안되는 문제 해결방법 (0) | 2025.12.16 |
|---|---|
| ESP32 OTA 자동 업데이터 (0) | 2025.12.15 |
| ESP32 제품군 설명: 기술적 차이점과 각 제품의 적용 분야 (0) | 2025.12.14 |
| Xiao ESP32 S3를 사용한 지오펜스 기능이 있는 GPS 추적기 Seeed Studio (2) | 2025.12.12 |
| ESP32 MFRC522 RFID 쓰기 읽기 Arduino IDE (0) | 2025.12.10 |
| ESP32 RFID 리더기 UART 데이터 읽기 125KHz, 13.56MHz (0) | 2025.12.10 |
| ESP32 NEO-M8N GPS 모듈 인터페이스 (0) | 2025.12.05 |
| ESP32 유용한 Wi-Fi 라이브러리 함수(Arduino IDE) (1) | 2025.12.04 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩