번개애비의 라이프스톼일

ArduinoBLE ibeacon의 uuid 와 major, minor, RSSI 스캔하기 본문

IT

ArduinoBLE ibeacon의 uuid 와 major, minor, RSSI 스캔하기

번개애비 2021. 9. 9. 09:55

 

기본적으로 ArduinoBLE 라이브러리에는 iBeacon을 수집하기 위한 클래스가 존재하지 않아,

별도로 개발하거나 다른 Bluetooth 모듈의 AT 통신을 통해 iBeacon을 수집했어야 했다.

 


환경구성

아이폰 12 mini -----> Arduino nano 33 BLE

아이폰이 iBeacon을 통해 Advertising을 진행하면 아두이노가 신호를 받아와 UUID, Major, Minor, RSSI의 값을 스캔할 수 있는 환경이다. 아이폰과 아두이노간의 신호세기를 측정할 수 있음으로 NearBy나 간략하게나마 접근측정이 가능하여 도어제어등으로 활용할 수 있다.

아이폰에 BeaconSimulator 앱을 설치하여 간편하게 테스트할 수 있다.


 

 

아래 라이브러리를 다운로드받아 IDE에 라이브러리를 ZIP파일 그대로 추가한다.

ArduinoBLE.zip
0.30MB

 

 

아이폰에서 BeaconSimulator앱을 구동한 화면

 

 

아두이노에서 스캔한 시리얼모니터 화면

 

iBeacon 스캔하는 소스코드

#include <ArduinoBLE.h>

void setup() {
  Serial.begin(9600);

  digitalWrite(LEDR, LOW);
  if (!BLE.begin()) {
    Serial.println("ERROR : BLE Can't Start!");
    while (1);
  }
}

void loop() {
  BLE.scan();
  // check if a peripheral has been discovered
  BLEDevice peripheral = BLE.available();

  if (!peripheral) {
    return;
  }
  if (!peripheral.hasManufacturerData()) {
    return;
  }

  String manufacturerData = peripheral.manufacturerData();
  if (manufacturerData.length() < 25 * 2) {
    return;
  }
  if (manufacturerData.substring(0, 8) != "4c000215") {
    return;
  }

  // Discovered an iBeacon
  Serial.println("Discovered an iBeacon");
  Serial.println("-----------------------");

  // UUID
  String id = manufacturerData.substring(8, 16) + "-";
  id += manufacturerData.substring(16, 20) + "-";
  id += manufacturerData.substring(20, 24) + "-";
  id += manufacturerData.substring(24, 28) + "-";
  id += manufacturerData.substring(28, 40);
  Serial.print("UUID: ");
  Serial.println(id);

  // Major ID
  char buf[5];
  manufacturerData.substring(40, 44).toCharArray(buf, 5);
  int major = (int)strtol(buf, NULL, 16);
  Serial.print("Major ID: ");
  Serial.println(major);

  // Minor ID
  manufacturerData.substring(44, 48).toCharArray(buf, 5);
  int minor = (int)strtol(buf, NULL, 16);
  Serial.print("Minor ID: ");
  Serial.println(minor);

  // RSSI
  Serial.print("RSSI: ");
  Serial.println(peripheral.rssi());
  Serial.println();
}

 

 

 

iBeacon Data설명

0~8 : Factory ID - 제조사 고유의 아이디값 8자리 iBeacon은 4c000215을 사용한다.)
8~40 : UUID - 고유식별번호 {8-4-4-4-12}와 같은 32자리

40~44 : Major ID - 16비트 4자리를 10진수전환하여 3자리

44~48 : Minor ID - 16비트 4자리를 10진수전환하여 3자리

iBeacon 데이터예시

Comments