안드로이드 개발/비콘(iBeacon)

iBeacon을 구성하는 데이터 및 필터조건

Aiden96 2025. 5. 13. 09:33

1. 데이터 구성요소 

 

iBeacon 광고 패킷(advertisement)은 아래와 같은 주요 필드로 구성됩니다.

  1. Flags
    • 일반 BLE 장치가 광고 중임을 나타내는 공통 필드
    • ex) LE General Discoverable Mode 등
  2. Manufacturer Specific Data (Apple 사)
    • Company ID: 0x004C (Apple Inc.)
    • Beacon Type: 0x02 (iBeacon 식별자)
    • Data Length: 0x15 (다음에 나오는 UUID·Major·Minor·Power의 총 길이 21바이트)
  3. UUID (16바이트)
    • iBeacon 그룹을 구분하는 고유 ID
    • 예) E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
  4. Major (2바이트)
    • UUID 하위 그룹 식별자
    • 범위: 0 ~ 65,535
  5. Minor (2바이트)
    • Major 하위 서브그룹 식별자
    • 범위: 0 ~ 65,535
  6. Measured Power (Tx Power) (1바이트, 부호 있는 정수)
    • 1미터 거리에서 기대되는 RSSI 값(dBm)
    • 비콘과의 상대적 거리를 추정하는 기준이 됨

 오해하실까봐 왜 RSSIdistance 은 왜 없지? 라고 하실텐데 이 데이터는 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