Bluetooth LE Reference
Bluetooth Low Energy 레퍼런스
Bluetooth LE Reference 소개
Bluetooth LE 레퍼런스는 BLE 프로토콜 개발의 핵심 두 레이어를 검색 가능한 형태로 정리한 빠른 참조 자료입니다. GAP(Generic Access Profile) 섹션에서는 Broadcaster, Observer, Peripheral, Central 등 디바이스 역할과 함께 광고 패킷 구성, 스캔 콜백, bt_conn_le_create()를 이용한 연결 수립, 그리고 인터벌·레이턴시·감독 타임아웃 같은 연결 파라미터 조정 방법을 다룹니다. 코드 예제는 가장 널리 사용되는 오픈소스 BLE 스택인 Zephyr RTOS BLE API 기반의 C 코드로 제공됩니다.
GATT(Generic Attribute Profile) 섹션은 Profile → Service → Characteristic → Descriptor로 이어지는 속성 계층 구조 전체를 설명합니다. BT_GATT_SERVICE_DEFINE()을 이용한 정적 서비스 정의, 특성 값 읽기/쓰기, 서버 주도 알림(Notify)과 표시(Indicate) 전송, 그리고 클라이언트가 알림을 구독하기 위해 사용하는 CCCD 디스크립터까지 포함됩니다. Heart Rate(0x180D), Battery(0x180F), Device Information(0x180A) 등 SIG 표준 16비트 UUID와 128비트 커스텀 UUID 정의 방법도 함께 다룹니다.
광고 섹션에서는 빠른 광고와 느린 광고의 인터벌 차이, 스캔 응답 데이터, 제조사 데이터, iBeacon 및 Eddystone 비콘 포맷을 설명합니다. 보안 섹션에서는 패스키 인증을 이용한 페어링, CONFIG_BT_SETTINGS를 통한 영구 본딩, BLE 4.2에서 도입된 ECDH P-256 기반의 LE Secure Connections, 그리고 암호화 없음부터 인증된 LE SC까지 4단계 보안 레벨을 모두 다룹니다. 이 레퍼런스는 임베디드 펌웨어 엔지니어, IoT 개발자, Bluetooth SIG 인증 시험 준비자를 대상으로 합니다.
주요 기능
- GAP 디바이스 역할(Broadcaster/Observer/Peripheral/Central)과 역할별 API 호출 방법
- BT_DATA_BYTES, BT_DATA_FLAGS, bt_le_adv_start()를 사용한 광고 패킷 구성
- BT_GATT_SERVICE_DEFINE()으로 GATT 서비스, 특성, CCCD 정적 정의
- SIG 표준 16비트 UUID(Heart Rate, Battery, Device Info) 및 커스텀 128비트 UUID
- 특성 속성 플래그: BT_GATT_CHRC_READ, WRITE, NOTIFY, INDICATE 구분
- BLE 보안 레벨 1~4, 페어링 콜백, 플래시 저장을 통한 영구 본딩
- CONFIG_BT_SMP_SC_ONLY로 활성화하는 LE Secure Connections (ECDH P-256)
- iBeacon 및 Eddystone 비콘 광고 데이터 포맷과 각 필드 오프셋
자주 묻는 질문
BLE에서 GAP과 GATT의 차이는 무엇인가요?
GAP(Generic Access Profile)은 디바이스 탐색과 연결 수립을 담당합니다. Peripheral/Central 역할을 정의하고, 광고·스캔·연결 파라미터를 제어합니다. GATT(Generic Attribute Profile)은 연결이 성립된 뒤 동작하는 데이터 계층으로, 서비스·특성·디스크립터 구조를 정의하며 클라이언트가 서버의 데이터를 읽고, 쓰고, 구독하는 방식을 규정합니다.
BLE Notify와 Indicate의 차이는 무엇인가요?
두 가지 모두 GATT 서버가 클라이언트의 요청 없이 데이터를 전송하는 방법입니다. 차이는 확인 응답에 있습니다. Notify(BT_GATT_CHRC_NOTIFY)는 데이터를 보내고 확인을 기다리지 않습니다. Indicate(BT_GATT_CHRC_INDICATE)는 클라이언트의 확인 응답을 받아야만 다음 indication을 보낼 수 있습니다. 데이터 누락이 허용되는 고빈도 스트리밍에는 Notify, 반드시 전달이 보장되어야 할 때는 Indicate를 사용합니다.
클라이언트에서 알림(Notification)을 활성화하는 방법은?
클라이언트가 해당 특성의 CCCD 디스크립터에 0x0001(BT_GATT_CCC_NOTIFY)을 써야 합니다. 서버 쪽에서는 BT_GATT_CCC()에 ccc_cfg_changed 콜백을 등록해 클라이언트가 알림을 활성화하거나 비활성화할 때 이를 감지합니다. 이 과정이 완료되어야 bt_gatt_notify()가 실제로 해당 클라이언트에 데이터를 전송합니다.
BLE 페어링과 본딩의 차이는 무엇인가요?
페어링은 암호화 키를 교환해 보안 연결을 수립하는 일회성 과정입니다. 본딩은 페어링 키를 비휘발성 저장소에 저장해 다음 재연결 시 전체 페어링 과정을 생략하고 즉시 암호화를 복원하는 기능입니다. Zephyr에서는 CONFIG_BT_SETTINGS=y와 CONFIG_FLASH=y를 설정하고 settings_load()를 호출하면 본딩 정보가 자동으로 저장·복원됩니다.
BLE 연결 파라미터 제약 조건은 무엇인가요?
연결 인터벌은 1.25ms 단위로 7.5ms~4s 범위 내에서 설정해야 합니다. 레이턴시(Peripheral Latency)는 Peripheral이 연결을 유지하면서 건너뛸 수 있는 이벤트 수를 의미하며 전력을 아낄 수 있습니다. 감독 타임아웃은 반드시 (1 + latency) * interval * 2보다 커야 합니다. 이 세 값이 bt_le_conn_param 구조체를 구성합니다.
LE Secure Connections란 무엇이고 언제 사용해야 하나요?
LE Secure Connections(LESC)는 BLE 4.2에서 도입된 보안 페어링 방식으로, 기존 TK 기반 페어링 대신 ECDH P-256 키 교환을 사용합니다. 수동 도청 및 중간자 공격에 강합니다. Zephyr에서 CONFIG_BT_SMP_SC_ONLY=y로 활성화합니다. FIPS/NIST 준수가 필요한 의료기기나 산업용 IoT 애플리케이션에서 강력히 권장됩니다.
빠른 광고와 느린 광고 인터벌의 차이는?
빠른 광고(20~100ms, BT_GAP_ADV_FAST_INT_MIN_2/_MAX_2)는 Central이 빠르게 연결할 수 있도록 하지만 전력 소비가 높습니다. 느린 광고(1~10.24s)는 초기 빠른 광고 구간이 끝난 후 또는 연결이 기대되지 않는 비콘 용도에 사용됩니다. 대부분의 Peripheral은 약 30초간 빠른 광고를 하다가 느린 광고로 전환합니다.
BLE 광고 패킷의 최대 페이로드는 얼마인가요?
BLE 4.x의 표준 광고 패킷(PDU)은 최대 31바이트의 AD 구조체를 담을 수 있습니다. 추가로 31바이트의 스캔 응답 데이터를 스캔 요청(SCAN_REQ)에 대한 응답으로 보낼 수 있습니다. BLE 5.0은 Extended Advertising을 도입해 단일 ADV_EXT_IND PDU에 최대 255바이트, AUX 체인 패킷을 통해 최대 1650바이트를 전송할 수 있습니다.