Programming/OS, Program, Framework Tip

라즈베리파이 - BLE 비콘화하기

awesometic 2017. 5. 23. 11:54
반응형

 BLE 비콘을 이용한 IoT 관련 제품/서비스가 한창 많아지는 추세입니다. 저 또한 진행해봤구요. 남겨둔 문서 중 라즈베리파이를 BLE 비콘화하기 위한 삽질을 발견해 포스팅합니다.

 라즈베리파이2와 라즈베리파이3 모두 해봤기 때문에 잘 작동할 겁니다.

 관련 서비스를 공부하는 분들에게 도움이 됐으면 좋겠습니다.




0. 준비

 라즈베리파이2는 무선랜과 블루투스 모듈이 포함되어 있지 않습니다. 따라서 USB 무선랜카드와 USB 블루투스 BLE 지원 동글을 구매하셔야 합니다.

 라즈베리파이3는 모두 포함되어 있습니다. 그대로 진행하시면 됩니다.

 그리고 적절한 OS(데비안 기반인 라즈비안 추천)가 설치되어 있다는 전제 하에 진행하겠습니다.


1. bluez 패키지 설치

 먼저 bluez 패키지를 설치해 줍니다. 이미 설치되어 있을 수도 있습니다.

sudo apt-get update && sudo apt-get install bluez


1.1 블루투스 모듈 확인

 bluez의 툴 중 하나인 hcitools로 블루투스 모듈이 정상적으로 감지되는 지 확인해봅니다.

sudo hciconfig


2. 비콘화

 먼저 iBeacon 데이터에 관해 간단히 아시면 좋을 것 같습니다.

 간략하게, iBeacon 데이터는 다음과 같은 모양으로 여러 16진수 값의 모임입니다. 

D (uint8_t) - 언제나 0x02
Data Length (uint8_t) - 페이로드의 데이터 길이(byte). 0x15로 설정
128-bit UUID (uint8_t[16]) - 128비트 UUID로, 당신의 회사/가게 등등을 다른 회사/가게로부터 구별해줄 식별자
Major (uint16_t) - Major 값. 각각의 가게를 구별하는 등
Minor (uint16_t) - Minor 값. 각 가게 안의 각각의 노드를 구별하는 등
TX Power (uint8_t) - RSSI 값을 기반으로 거리를 측정할 때 쓰일 값

 여기에 앞에 이게 iBeacon이라고 꼭 붙어야 할 정해진 값(Manufacture Specific Data)을 넣어주면 다음과 같이 됩니다.

0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 (UUID)(Major)(Minor) C8 00

 진행해봅시다. 먼저 블루투스 모듈을 활성화해줍니다.

sudo hciconfig hci0 up 

 그리고 방송을 켜주며, 원활한 BLE 방송을 위해 주변 블루투스 장비를 스캔하지 않도록 합니다.

sudo hciconfig hci0 leadv 3 
sudo hciconfig hci0 noscan 

 마지막으로 방송할 iBeacon 데이터를 설정해줍니다.

sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 (UUID)(Major)(Minor) C8 00

 (UUID)(Major)(Minor)에는 원하는 값을 길이에 맞춰서 쓰세요. UUID는 16진수 32글자, Major와 Minor는 16진수 4글자 씩입니다. 


옵션. 방송 주기 바꾸기

 기본 방송 속도가 너무 느리게 느껴질 수 있습니다. 기본값이 1280ms라는데요.

 설정할 수 있는 최소값인 100ms로 바꾸려면 다음과 같이 하시면 됩니다.

sudo hcitool -i hci0 cmd 0x08 0x0006 A0 00 A0 00 03 00 00 00 00 00 00 00 00 07 00
sudo hcitool -i hci0 cmd 0x08 0x000a 01

 0x08 0x0006 이 LE 방송 매개변수고, 뒤의 A0 00 은 데이터 방송 간 최소 간격, 또 뒤의 A0 00 은 최대 간격입니다. 각 간격 값에 0.625ms를 곱하면 되는데, 예제와 같은 A0 00 이라면 0xA000 * 0.625ms 로 100ms가 됩니다.

 그리고 뒤의 03은 이 방송이 비연결성(Non-connectable) 방송이란 걸 의미합니다. 연결성(Connectable)이라면 100ms보다 더 빠르게 방송할 수 있다네요.

 다음으로 입력하는 0x08 0x000a 은 방송을 시작하는 명령어인데, 위에서 쓴 leadv 3 을 이용할 경우 방송 간격을 기본값인 1280ms로 해버리기 때문에 이렇게 써야 한다고 합니다.




 참고 사이트:
a. https://cdn-learn.adafruit.com/downloads/pdf/pibeacon-ibeacon-with-a-raspberry-pi.pdf
b. https://stackoverflow.com/questions/21124993/is-there-a-way-to-increase-ble-advertisement-frequency-in-bluez


반응형