BLE를 간단하게 알아보다 Beacon의 세계를 알게 되었다. Beacon의 종류와 데이터 포맷을 알아 보다 Advertise Packet을 자세히 알게 되었다. 다른 블로그에 잘 나와있지 않은 부분들을 직접 Spec을 찾아보면서 알게되었는데, 그 내용을 정리둔다.
BLE Advertising Data에는 기기 이름, 주소, UUID 등이 들어있는데, 실제 Packet에서 그 정보를 찾는 방법에 대해서 정리해 둔다.
Bluetooth Specification
Spec은 Specification의 줄임말인데, 명세서라고 하며, 내용은 시스템이나 기술에 대해 명확한 설명이다. 처음보면 좀 당황스러울 수 있으나 조금만 시간을 투자하면 금방 익숙해지는 아주 잘 짜여진 구조적인 문서이다.
블로그에서 자료를 찾아보는 것도 유용하지만 정확한 정보를 알고 싶다면 공식 사이트에서 Reference를 찾아봐야 하는 것처럼 정확한 기술 정보를 확인하기 위해서는 Spec을 찾아보는 것이 좋다. Spec의 존재 자체가 서로 다른 제조사들이 규격화된 동작을 하도록 기술의 세부 사항까지 생략이나 의역없이명확하게 설명하는 것이기 때문에 오히려 이해하기 편하다.
Bluetooth Spec 은 공식사이트에서 열람이 가능하다. 우선 Core Spec을 확인해보자.
The Bluetooth® Core Specification defines the technology building blocks that developers use to create the interoperable devices that make up the thriving Bluetooth ecosystem. Core Specifications
Advertise Packet의 Data Format
pdf파일 사이즈가 25메가 정도이고, 2822페이지다. 궁금한 것이 있다면 언제든, 무엇이든 찾아보면 된다.ㅋ
Low Energy 부분은 Volume 6에 있다. Advertise Packet 이 어떻게 구성되어 있는지는 Part B Link Layer의 2.1 PACKET FORMAT FOR THE LE UNCODED PHYS에서 볼 수 있는데, 제목에서 알 수 있듯이 물리계층의 포맷이고, 여기까지는 Advertising Channel과 Data Channel 공통 사항이며 Channel에 따라 PDU에 들어가는 내용이 달라진다.
Access Address는 MAC Address가 아니고 Link Layer에서 Advertising 을 위해서 램덤하게 생성한 값이다.
2.3 ADVERTISING CHANNEL PDU에서 PDU 구성이 어떻게 되는지 알 수 있다. 헤더가 2바이트고 Payload에 1-255 Octets 이 있는데, 우리가 관심있는 Advertising Packet 은 2.3.1.1을 보면 알 수 있듯이 AdvA(6바이트)와 AdvData(0-31바이트)로 구성된다!
이제 거의 다 왔다. AdvA에 MAC Address가 들어오고 AdvData에는 Host에서 넣은 데이터가 들어간다! Host에서 데이터를 넣는 것도 규칙이 있다. 어떤 규칙으로 넣는지는만 알면 Raw 데이터를 받아도 정보를 Parsing 할 수 있다.
The AdvData field may contain Advertising Data from the advertiser's Host.
AdvData 까기
앞에서 물리계층의 포맷부터 차근 차근 분해해서 AdvData까지 찾았다. 이제 Raw AdvData를 까서 그안의 의미있는 정보를 확인하는 방법에 대해서 알아보자.
Vomule 3로 올라가서 Part C General Access Profile의 11 ADVERTISING AND SCAN RESPONSE DATA FORMAT에 잘 설명이 되어 있다. 1개의 데이터 구조는 차례대로 Length, AD Type, Ad Data으로 구성된다. Protocol Spec에서는 흔한 구조다. 길이는 그 데이터 구조가 어디까지인지 알려주고, Type과 Data가 마치 Key-Value 처럼 존재한다고 생각하면 된다. 이 데이터 구조가 여러개로 구성될 수 있다.
Type 은 Assinged Number에 정의가 되어 있다.
https://www.bluetooth.com/ko-kr/specifications/assigned-numbers/generic-access-profile
Data 는 Core Specification Supplement에 정의 되어 있다.
아래 해당 문서는 아래 링크에서 받을 수 있다.
Core Specifications
Advertiding Data 예제
예제를 보며 지금까지 확인한 내용을 정리해보자.
Core Specification Supplement에 나와있는 가장 간단한 예제로 설명을 붙여봤다.
AdvData "0201010A095065646F6D65746572" 가 어떤 데이터를 포함하고 있는지 알아보자.
Flag는 같은 문서의 Part A 1.3 Flag에 설명되어 있고, Name은 1.2에 설명되어 있다.
정리
늘 그렇듯이 알고보면 별거 아닌데, 파다보면 오래걸리고 힘들다.
힘들긴 했지만 이제 BLE의 Advertise Packet이 어떻게 구성되어 있는지 확실히 알게되었고, Data로 전달받은 패킷 "0201010A095065646F6D65746572" 가 무엇을 의미하는지 알 수 있게 되었다. Spec에서 내용을 직접 찾아서!!
근데...API가 잘되어있어서, 굳이 이런거 알 필요없다....;;; 이걸 파게된건 사실 iBeacon과 AltBeacon, URIBeacon의 차이를 감안해서 구현을 하려다 보니 알아보게 되었는데, 그건 다음에 기회가 되면 다시...^^;
한장으로 잘 정리한 슬라이드가 있어서 소개한다.
'기술 이야기' 카테고리의 다른 글
Nodejs 프로세스 매니저 PM2 사용법 (0) | 2017.10.16 |
---|---|
도메인 만료 후 같은 웹서버로 도메인만 변경하기 301 Redirection (2) | 2017.09.10 |
AWS 람다로 서버 없이 간단한 REST API 만들기 - 경험담 (0) | 2017.08.24 |
깃 git 활용/사용/응용 팁 (1) | 2017.07.24 |
BLE, Bluetooth Low Energy 비콘 간단 정리 (16) | 2017.07.19 |
오픈그록 OpenGrok 고급진 사용법 (3) | 2016.10.24 |
onbeforeunload 사용팁, 카카오톡 인앱 브라우저에서 문제 임시해결 방법 (0) | 2016.02.01 |
댓글