반응형
임베디드 & IoT · IoT 프로토콜#04 of 08
// IoT Protocol — Bluetooth Low Energy
BLE
수십억 스마트폰과 직접 연결되는 초저전력 근거리 무선. GATT 기반 데이터 모델부터 BLE 6.0까지
IoT 프로토콜약 15분중급2.4GHz · GATT · 스마트폰 직접 연동
Section 01
BLE란? — Classic BT와 결정적 차이
BLE(Bluetooth Low Energy)는 Bluetooth 4.0(2010)부터 도입된 초저전력 근거리 무선 프로토콜입니다. Classic BT가 연속 오디오 스트리밍에 최적화된 반면, BLE는 소량의 데이터를 간헐적으로 전송하는 IoT 센서·웨어러블을 위해 재설계되었습니다.
📊
시장 현황 (2024): BLE 연간 출하량 약 50억 개. 스마트폰 100% BLE 지원. AirPods, Apple Watch, Tile 트래커, 혈당 모니터 — 모두 BLE 기반.
| 항목 | BLE | Classic Bluetooth |
|---|---|---|
| 최적 용도 | 센서 데이터, 짧은 명령 | 오디오 스트리밍, 파일 전송 |
| 피크 전류 | 15 mA (TX) | 30 mA (TX) |
| 연결 시간 | 3 ms 미만 | 100 ms 이상 |
| 광고 평균 전류 | ~0.5 μAh/이벤트 | 항상 연결 유지 |
Section 02
BLE 프로토콜 스택 구조
Application사용자 앱 코드, 비즈니스 로직
GATTService · Characteristic · Descriptor
GAP광고, 스캔, 연결 설정, 보안 모드
ATT속성 기반 클라이언트/서버 프로토콜
L2CAP논리 링크 제어, 멀티플렉싱
Link Layer연결 관리, AES-128, 광고, 주파수 호핑
Physical Layer2.4GHz · 40채널 · 1M/2M/Coded PHY
Section 03
GATT — 서비스와 특성으로 데이터 모델링
Profile
최상위 사양
여러 서비스의 집합
Service
기능 그룹
16-bit(표준)/128-bit UUID
Characteristic
데이터 값
Read · Write · Notify · Indicate
Descriptor
메타데이터
CCCD: Notify/Indicate 활성화
표준 UUID 예: 0x180D Heart Rate · 0x180F Battery · 0x1809 Health Thermometer
💡
Notify vs Indicate: Notify는 서버가 값 변경 시 자동 전송(ACK 없음). Indicate는 동일하지만 클라이언트 Confirmation을 기다립니다. 센서 데이터는 Notify, 중요 알림은 Indicate.
Section 04
GAP — 광고 패킷과 연결 관리
| 역할 | 동작 | 예시 |
|---|---|---|
| Peripheral | 광고 패킷 브로드캐스트, 연결 수락 | 온도계, 스마트 태그 |
| Central | 스캔, 연결 시작, GATT 클라이언트 | 스마트폰, 게이트웨이 |
| Broadcaster | 연결 불가 광고만 (Beacon) | iBeacon, Eddystone |
| Observer | 광고만 수신, 연결 안 함 | 패시브 스캐너 |
Section 05
BLE 버전 진화 4.0 → 6.0
4.0
2010
BLE 최초 도입 1Mbps PHY
4.1
2013
듀얼 역할 연결 개선
4.2
2014
LE Secure Privacy
5.0
2016
2Mbps Coded PHY 장거리
5.2
2019
LE Audio LC3 코덱
6.0
2024
Channel Sounding 거리측정
Section 06
전력 최적화 — μA 단위 설계
TX @ 0dBm4.6 mA
RX 수신 대기4.4 mA
연결 (100ms 간격)~15 μA 평균
광고 (1초 간격)~3.5 μAh/이벤트
System ON 슬립~2 μA
System OFF~0.3 μA
Section 07
실전 코드 — ESP32 GATT 서버
Arduino (ESP32) — GATT 서버 온습도 Notify
#include <BLEDevice.h> #include <BLE2902.h> #define SVC_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define TEMP_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8" BLECharacteristic *pTemp; bool connected = false; class CB : public BLEServerCallbacks {{ void onConnect(BLEServer* s) {{ connected=true; BLEDevice::startAdvertising(); }} void onDisconnect(BLEServer* s) {{ connected=false; }} }}; void setup() {{ BLEDevice::init("ESP32-TempSensor"); BLEServer* srv = BLEDevice::createServer(); srv->setCallbacks(new CB()); BLEService* svc = srv->createService(SVC_UUID); pTemp = svc->createCharacteristic(TEMP_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY); pTemp->addDescriptor(new BLE2902()); // CCCD svc->start(); BLEDevice::startAdvertising(); }} void loop() {{ if(connected) {{ float t = readTemp(); uint8_t buf[4]; memcpy(buf,&t,4); pTemp->setValue(buf,4); pTemp->notify(); }} delay(2000); }}
Section 08
무선 프로토콜 비교 및 선택 가이드
| 항목 | BLE | Wi-Fi | Zigbee | LoRaWAN |
|---|---|---|---|---|
| 범위 | 10~400m | 30~100m | 10~100m | 2~20km |
| 전력 | 매우 낮음 | 높음 | 낮음 | 매우 낮음 |
| 스마트폰 직접 | 기본 지원 | 가능 | 허브 필요 | 허브 필요 |
| 메시 | 제한적 | 가능 | 네이티브 | 미지원 |
// Quick Reference
표준Bluetooth 4.0 ~ 6.0 (2010~2024)
주파수2.4GHz · 40채널 · 2MHz 간격
데이터 속도125kbps (Coded) ~ 2Mbps (2M PHY)
데이터 모델GATT (Service → Characteristic)
System OFF 전류~0.3 μA (nRF52840)
주요 라이브러리NimBLE (ESP32) · ArduinoBLE
입문 난이도⭐⭐ 보통
추천 용도웨어러블 · 스마트폰 연동 · 근거리 센서
반응형
댓글