BLE 비콘과 BLE 비콘 스캐너는 ESP32의 저렴하고 저전력이라는 장점을 활용하여 완전히 새로운 가능성을 열어주는 놀라운 기술입니다! 비콘과 ESP32 장치를 Arduino IDE와 결합하면 이러한 가능성은 더욱 흥미로워집니다. 자, 그럼 ESP32 BLE 비콘 스캐너 기술에 대해 자세히 알아보겠습니다!

먼저 이 글에 필요한 몇 가지 핵심 개념을 정의해 보겠습니다.
BLE는 Bluetooth Low Energy의 약자입니다. 이름에서 알 수 있듯이 BLE는 기존 블루투스 기술의 전력 소모를 줄인 버전 입니다 . 블루투스 기술은 개인 영역 네트워크(PAN)에서 단거리 무선 통신에 사용되는 기술입니다.
스마트워치를 스마트폰에 연결하거나 스마트폰으로 호텔 객실에 디지털 키를 사용하여 출입할 때 BLE 기술을 가장 익숙하게 느끼실 겁니다. BLE 기술은 이제 우리 일상생활 곳곳에 거의 보편화되었습니다!
하지만 BLE에는 다른 용도도 있습니다. 예를 들어 BLE 장치를 비콘으로 사용하는 것이죠. 그렇다면 비콘이란 무엇일까요?
가장 기본적인 형태로, 비콘은 주변의 다른 기기들에게 자신의 위치를 무선으로 알려주는 하드웨어 장치입니다. 비콘을 전자 등대라고 생각하시면 됩니다! 주변의 다른 전자 기기들에게 자신의 위치를 알려주는 역할을 하죠!
이 글에서는 BLE 비콘에 초점을 맞추겠습니다. BLE 비콘 은 주변의 다른 기기들에게 자신의 식별 정보를 무선으로 전송하는 하드웨어 장치입니다. BLE 비콘은 기기 고유 식별자(UUID)와 기타 식별 정보를 함께 전송하는 경우가 많습니다.
아마 모르셨을 수도 있지만, 여러분의 스마트폰은 BLE 비콘 , 즉 세상을 향한 전자 등대입니다!
현재 사용되는 BLE 비콘에는 크게 두 가지 유형이 있습니다. iBeacon(주로 iPhone 계열 기기에서 사용)과 Eddystone Beacon(주로 Android 계열 기기에서 사용)입니다. iBeacon 에 대한 자세한 내용은 여기에서 다룹니다.
이 글은 BLE 비콘 스캔에 대한 전반적인 내용을 다룹니다. 아래 예시 스케치의 프로세스 흐름은 다음과 같습니다…
- 비콘 스캐너를 생성하세요
- 비콘 스캐너를 실행하세요
- 비콘 스캔 결과를 주기적으로 시리얼 모니터에 표시합니다.
이 글을 끝까지 읽으시면 BLE 비콘 스캐너를 성공적으로 만들고 ESP32 장치 주변의 장치를 스캔할 수 있게 될 것입니다. 자, 시작해 볼까요!
ESP32 BLE 비콘 스캐너 테스트 코드
다음은 ESP32를 사용하여 BLE 비콘 스캐너를 만들고 사용하는 방법에 대한 전체 예제 스케치입니다.
아래 섹션에서는 이 코드를 단계별로 함께 살펴보겠습니다. 하지만 최종 결과물을 바로 확인하고 싶다면, 이 스케치를 ESP32에 업로드하여 바로 실행해 볼 수도 있습니다!
// BLE Beacon Scanner Example Sketch
// Programming Electronics Academy
#include <BLEDevice.h> // sets up BLE device constructs
#include <BLEUtils.h> // various BLE utilities for processing BLE data
#include <BLEScan.h> // contains BLE scanning functions
#include <BLEAdvertisedDevice.h> // contains BLE device characteristic data
int scanTime = 30; //In seconds
BLEScan* pBLEScan;
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks
{
void onResult(BLEAdvertisedDevice advertisedDevice)
{
String strName;
strName = advertisedDevice.getName().c_str();
if ( strName.length() > 0 )
{
Serial.printf("Name: %s n", advertisedDevice.getName().c_str());
Serial.printf("Advertised Device: %s n", advertisedDevice.toString().c_str());
}
}
};
void setup() {
Serial.begin(115200);
Serial.println("Scanning...");
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
pBLEScan->setInterval(100);
pBLEScan->setWindow(99); // less or equal setInterval value
}
void loop() {
// put your main code here, to run repeatedly:
BLEScanResults * foundDevices = pBLEScan->start(scanTime, false);
Serial.print("Devices found: ");
Serial.println(foundDevices->getCount());
Serial.println("Scan done!");
pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory
delay(5000);
}
코드 분석
아두이노 개발 환경의 가장 큰 장점 중 하나는 사용할 수 있는 훌륭한 오픈 소스 라이브러리가 매우 많다는 것입니다!
따라서 프로그램 시작 부분에서 BLE 비콘을 스캔하는 데 필요한 BLE 라이브러리를 포함하여 이러한 라이브러리들을 활용해 보겠습니다.
BLEDevice(또는 BLEUtils, BLEScan, BLEAdvertisedDevice)에 대한 참조를 볼 때마다 해당 라이브러리가 코드 전체에서 언제 어디서 사용되는지 알 수 있다는 점을 기억하세요.
그리고 이는 아두이노 플랫폼이 얼마나 훌륭한지 다시 한번 상기시켜주는 것입니다. 바로 다른 개발자들이 공유한 라이브러리를 활용할 수 있다는 점이죠!
#include <BLEDevice.h> // sets up BLE device constructs
#include <BLEUtils.h> // various BLE utilities for processing BLE data
#include <BLEScan.h> // contains BLE scanning functions
#include <BLEAdvertisedDevice.h> // contains BLE device characteristic data
이제 BLE 스캔을 수행할 객체를 생성할 수 있습니다. 그리고 해당 BLE 스캔 객체에 대한 콜백 함수를 정의하겠습니다.
콜백 함수는 다른 함수에서 특정 이벤트가 발생했을 때 실행되는 함수입니다. 아래에 정의된 콜백 함수는 앞서 정의된 BLE 스캐닝 객체에 매개변수로 전달됩니다.
이 매개변수는 BLE 스캔 객체가 BLE 스캔이 완료될 때마다 스케치에서 호출할 함수를 알려줍니다. 이 콜백 함수의 주요 역할은 BLE 비콘 스캔 중에 발견되어 장치 이름을 브로드캐스팅하는 BLE 장치(흔히 광고 장치라고 함)의 이름을 표시하는 것입니다.
중요 참고 사항: 많은 BLE 장치는 일반적으로 자신의 이름을 브로드캐스트하지 않거나, 다른 BLE 장치와 페어링된 후에만 이름을 브로드캐스트하는 경우가 있습니다.
int scanTime = 30; //In seconds
BLEScan* pBLEScan;
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks
{
void onResult(BLEAdvertisedDevice advertisedDevice)
{
String strName;
strName = advertisedDevice.getName().c_str();
if ( strName.length() > 0 )
{
Serial.printf("Name: %s n", advertisedDevice.getName().c_str());
Serial.printf("Advertised Device: %s n", advertisedDevice.toString().c_str());
}
}
};
아두이노 setup() 함수
라이브러리를 포함시키고 콜백 함수를 정의했으면 이제 setup() 함수로 넘어갈 수 있습니다. 이미 알고 계시겠지만, 아두이노 환경에서 ESP32가 시작될 때 가장 먼저 실행되는 것이 setup() 함수입니다.
setup() 함수에서 가장 먼저 해야 할 일은 115200의 전송 속도를 사용하여 시리얼 모니터와의 시리얼 통신을 초기화하는 것입니다.
Serial.begin(115200);
이제 새 BLE 스캔 장치를 생성하고 스캔이 완료될 때 호출될 BLE 콜백 함수를 MyAdvertisedDeviceCallbacks로 설정하십시오.
BLE 스캔 유형은 기본적으로 패시브로 설정되어 있습니다. 더 빠르고 정확한 결과를 얻기 위해 액티브로 변경하겠습니다. 스캔 간격은 100밀리초, 스캔 윈도우는 99밀리초로 설정했습니다. 스캔 윈도우 값은 스캔 간격 값보다 작거나 같아야 합니다.
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
pBLEScan->setInterval(100);
pBLEScan->setWindow(99); // less or equal setInterval value
아두이노의 loop() 함수
아두이노 메인 루프에서 BLE 비콘 스캔 함수를 실행할 때, `scanTime` 변수를 30초로 설정하여 BLE 비콘을 검색하는 데 필요한 시간을 지정합니다.
이 scanTime 변수는 임의로 설정할 수 있으며, 특정 애플리케이션의 요구 사항에 따라 더 길거나 짧은 값으로 설정할 수 있습니다. 예를 들어, 특정 BLE 장치가 3~4초마다 신호를 보내는 경우, 해당 BLE 장치를 찾기 위해 더 짧은 scanTime 값을 설정할 수 있습니다. 이 예시에서는 가능한 한 많은 주변 장치를 찾기 위해 더 긴 scanTime 간격을 설정했습니다.
이 예시에서 스캔이 완료되거나 30초 타이머가 만료되면 MyAdvertisedDeviceCallbacks() 콜백 함수는 스캔 중에 발견된 BLE 비콘의 이름을 시리얼 모니터에 표시합니다.
5초의 지연 시간(delay()) 후, 프로그램은 ESP32 장치 범위 내에 있는 BLE 비콘의 업데이트된 목록과 이름을 5초마다 표시하는 과정을 반복합니다.
// put your main code here, to run repeatedly:
BLEScanResults * foundDevices = pBLEScan->start(scanTime, false);
Serial.print("Devices found: ");
Serial.println(foundDevices->getCount());
Serial.println("Scan done!");
pBLEScan->clearResults(); // delete results fromBLEScan buffer to release memory
delay(5000);
아두이노 BLE 비콘 스캐너 스케치 테스트
ESP32를 컴퓨터에 연결한 후, 전체 스케치를 장치에 업로드하세요. 스케치 업로드가 완료되면 ESP32의 리셋(RST) 버튼을 누르세요. 그러면 시리얼 모니터에 다음 내용이 표시될 것입니다.

ESP32 BLE 비콘 스캐너 - 시리얼 모니터
출력에서 볼 수 있듯이 이 ESP32 장치의 범위 내에서 29개의 BLE 장치가 발견되었지만, 장치 이름을 브로드캐스팅하는 BLE 장치는 3개뿐입니다.
작업 결과를 확인하는 빠르고 쉬운 방법 중 하나는 ESP32가 수행한 BLE 비콘 스캔 결과와 스마트폰이 감지한 주변 기기 목록을 비교하는 것입니다. 아래는 ESP32 BLE 비콘 스캐너 옆에 놓인 스마트폰의 블루투스 기기 설정 페이지 스크린샷입니다. 두 결과가 동일한 것을 확인할 수 있습니다!

ESP32 BLE 비콘 스캐너 - 스마트폰 설정
이게 전부입니다! ESP32 장치와 Arduino IDE를 사용하면 이렇게 간단하게 BLE 비콘을 스캔할 수 있습니다!
여기서 다음 목적지는 어디인가요?
ESP32 장치를 사용하여 BLE 비콘 스캐너를 만들면 ESP32 프로젝트에 완전히 새로운 가능성을 열어줄 수 있습니다. 이 기능은 특히 장치나 인력을 추적하거나 ESP32를 위치 파악 용도로 사용할 때 유용합니다.
연습 삼아 코드를 수정하여 특정 BLE 비콘 이름을 찾고, 해당 BLE 비콘이 발견되면 스캔 프로세스를 중지해 보세요.
'ESP32' 카테고리의 다른 글
| ESP32 기반 컬러 LCD 인터넷 시계 (1) | 2026.03.04 |
|---|---|
| ESP32를 이용한 장애물 회피 로봇 (0) | 2026.03.04 |
| ESP32 BLE 서버 만들기 가이드와 코드 첨부 (0) | 2026.03.03 |
| ESP32 BLE 클라이언트 만들기 (0) | 2026.03.03 |
| ESP32-C3 기반 스마트 시계 (0) | 2026.02.27 |
| zclaw - ESP32에서 888KB로 구동되는 개인용 AI 비서 (0) | 2026.02.25 |
| zclaw 888KiB ESP32 기반 AI 에이전트 (0) | 2026.02.25 |
| ESP32 보드에서 구동되는 초경량 오픈소스 'zclaw' 공개 (1) | 2026.02.25 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩