안드로이드 개발/비콘(iBeacon)
iBeacon을 구성하는 데이터 및 필터조건
Aiden96
2025. 5. 13. 09:33
1. 데이터 구성요소
iBeacon 광고 패킷(advertisement)은 아래와 같은 주요 필드로 구성됩니다.
- Flags
- 일반 BLE 장치가 광고 중임을 나타내는 공통 필드
- ex) LE General Discoverable Mode 등
- Manufacturer Specific Data (Apple 사)
- Company ID: 0x004C (Apple Inc.)
- Beacon Type: 0x02 (iBeacon 식별자)
- Data Length: 0x15 (다음에 나오는 UUID·Major·Minor·Power의 총 길이 21바이트)
- UUID (16바이트)
- iBeacon 그룹을 구분하는 고유 ID
- 예) E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
- Major (2바이트)
- UUID 하위 그룹 식별자
- 범위: 0 ~ 65,535
- Minor (2바이트)
- Major 하위 서브그룹 식별자
- 범위: 0 ~ 65,535
- Measured Power (Tx Power) (1바이트, 부호 있는 정수)
- 1미터 거리에서 기대되는 RSSI 값(dBm)
- 비콘과의 상대적 거리를 추정하는 기준이 됨
오해하실까봐 왜 RSSI 와 distance 은 왜 없지? 라고 하실텐데 이 데이터는 iBeacon에서 보내주는 데이터가 아닙니다.
Rssi 는 ScanResult.getRssi()을 호출해 얻는값이고 , distance 는 직접계산해야 합니다.
전체 데이터 구조 예시(16 진수)
02 01 06 ← Flags
1A FF 4C 00 02 15 ← AD Len·Type·Company ID·Beacon Type·Data Length
E2 C5 6D B5 D F F B 48 D2 B0 60 D0 F5 A7 10 96 E0 ← UUID (16B)
00 01 ← Major (0x0001)
00 02 ← Minor (0x0002)
C5 ← Measured Power (-59dBm)
보통 앱에서 iBeacon의 데이터를 비교할때 , 주로 Major 과 Minor 필드를 사용합니다.
Major 은 2바이트(16비트) : 256x256 = 65,281 즉 0~65,281 자리의 숫자를 사용할수있습니다.
Minor 또한 2바이트를 사용할수 있습니다.
2.iBeacon 프로토콜 필터조건
비콘스캐너로 스캔시 수십개의 타사 비콘이 들어온다. 그중에서도 apple이 만든 ibeacon 만 걸러내고 싶다면
아래 조건을 넣으세요.
// Apple 제조사 ID(0x004C) 기반 iBeacon 데이터 추출
val mData = scanRecord.getManufacturerSpecificData(0x004C) ?: return
// iBeacon 포맷 확인: 타입(0x02), 길이(0x15)
if (mData.size < 23 || mData[0].toInt() != 0x02 || mData[1].toInt() != 0x15) return