안드로이드 블루투스 관련 앱을 만들어보고 싶어, 해당 내용에 관한 글을 정리했습니다.
Bluetooth Low Energy (BLE)
기기간에 마스터, 슬레이브 관계를 형성하여 통신하는 bluetooth classic과 비슷한 무선 통신을 할 수 있었다. 그러나 전력량이 많았다. 기존의 문제이던 전력 소모량을 줄여, 스마트 기기인 스마트 밴드, 워치, 글래스 등에서 사용됩니다.
Classic Bluetooth의 경량화 버전을 목표로 bluetooth 4.0의 일부로 발표 되었습니다. 블루투스 표준화 그룹인 SIG에 의해서 개발되기 전까지 Nokia의 사내 프로젝트로 시작했습니다.
BLE 를 지원하는 기기는 Advertise mode
(= broadcast ) 와 Connection mode
로 통신을 합니다.
Advertise Mode (= Broadcast Mode )란?
주변의 디바이스 유무에 관계없이 자신의 signal을 일방적으로 계속 보내는 것을 말합니다. signal을 일방적으로 보내기 때문에 보안에 취약합니다. 디바이스에 자신의 존재를 알릴 때 사용하지만 observer에 전송할 작은양의 data를 보낼 때도 사용하기도 합니다.
Advertise 방식은 주로 디바이스가 자신의 존재를 알리거나, 적은 양(31Bytes 이하)의 User 데이터를 보낼 때도 사용됩니다. 한 번에 보내야 하는 데이터 크기가 작다면, 굳이 오버헤드가 큰 connection 과정을 거쳐 데이터를 보내기 보다, 단순히 advertise를 통해 한번에 보내는게 더 효율적이기 때문입니다. 전송크기 제한을 보완하기 위해 Scan Request
, Scan Response
을 이용해서 추가적인 데이터를 주고 받을 수 있습니다.
Advertise 방식은 signal을 일방적으로 뿌리는 것이기 때문에, 보안에 취약합니다.
일대 다 방식.
- advertiser(boardcaster) : Non-Connectable Advertising Packet signal을 주기적으로 보내는 기기 ( ex. 스마트 워치, 밴드 등 )
- observer : advertiser가 보내는 packet을 듣기 위해 주기적으로 scanning 하는 기기 ( ex. 폰 )
- Advertising type 의 신호를 일정주기로 보냅니다.
Connection Mode란?
양방향으로 데이터를 주고 받거나, advertising으로만 데이터를 주고 받기에는 data 양이 많을 경우 Connection Mode로 통신합니다. 일대 일 방식으로 데이터를 교환한다. 디바이스간의 channel hopping 규칙을 정해놓고 통신을 하기 때문에 안전합니다.
Central ( Master )
다른 device와 connection을 맺기 위해 Connection advertise signal을 주기적으로 scan하고, 해당 디바이스에 연결 요청합니다.
연결 후에는 주기적으로 data 교환을 주도 합니다. ( ex. 폰 )
Peripheral ( Slave )
다른 device와 conneciton을 위해 advertise signal을 주기적으로 보낸다. 이를 수신한 Central 디바이스가 Connection request를 보내면 이를 수락하여 Connection 합니다. ( ex. 스마트 밴드 )
Protocol Stack
디바이스들이 bluetooth로 통신하기 위해 Protocol Stack을 가지고 있는데, 통신 규약인 protocol이 쌓여 있는 것을 Protocol Stack 이라 한다. Protocol Stack을 거치면서 packet 이 분석된다.
- Application - App
- Host - GAP ( Generic Access Profile ) , GATT(Generic Attribute Profile)
- Controller - Link Layer, Physical Layer
Physical Layer
Bluetooth Signal과 통신할 수 있는 회로가 구성되어 있다. Analog 신호 <-> Digital 신호
2.4GHz 신호를 40개의 channel로 나누어 통신하는데 그 중 3개는 Advertising Channel, 나머지 37개는 Data Channel이다.
Link Layer
5가지의 state를 가지고 있다. 각 디바이스는 서로 연결되는 과정에서 State 를 변화 시킨다.
- Standby : Signal packet을 보내지도, 받지도 않는 상태
- Advertising : advertising packet을 보내고, 해당 advertising packet에 대한 상대 디바이스의 response를 받을 수 있고, 줄 수 있는 상태
- Scanning : Advertising channel에서 scanning 하고 있는 상태
- Initial : advertiser의 connectable advertising packet을 받은 후 Connection request를 보낸 상태
- Connection : connection 이 후의 상태
Generic Access Profile ( GAP )
서로 다른 제조사가 만든 BLE끼리 호환할 수 있도록 하는 역할.
GAP은 서로 다른 제조사가 만든 BLE 디바이스들간에 서로 호환되어 통신할 수 있도록 주춧돌 역할을 한다. 어떻게 디바이스간에 서로를 인지하고, Data를 Advertising하고, Connection을 맺을지에 대한 프레임워크를 제공한다.
또한 GAP에서는 BLE 통신을 위해 Role, Mode, Procedure, Security, Additional GAP data format 등을 정의한다.
## Role
- Central: Link layer에서 Master 역할에 상응. 다른 디바이스의 Advertising Packet을 듣고, Connection을 시작할 때 시작된다.
- 메인 컴퓨터, 스마트폰, 태블릿PC의 역할
- Peripheral: Link layer에서 Slave 역할에 상응. Advertising Packet을 보내서 Central 역할의 디바이스가 Connection을 시작할 수 있도록 유도.
- 센서기능이 달린 디바이스들의 역할
-
Generic Attribute Profile ( GATT )
BLE data 교환을 관리. 디바이스들이 data를 발견하고, 읽고, 쓰는 것을 가능하게 하는 기초적인 data model과 procedure을 정의한다.
Connection mode일 때 GATT 서비스와 Characteristic을 이용하여 양방향 통신을 한다.
주요 용도에 대한
- iBeacon prefix(9 byte) : 비콘의 설정이나 특성 값이 기록되는 부분입니다. iBeacon 헤더 정보라 생각하시면 됩니다. 우리가 손대지 않고 정해진 값을 사용해도 됩니다.
- UUID (16 byte) : 사실 iBeacon에서 가장 중요한 데이터는 UUID, Major, Minor 값입니다. 이 값을 추출한 뒤, 서버에 보내서 내가 어느 위치에 있는지, 이 비콘이 어떤 역할을 하는지, 그래서 사용자에게 어떤 정보를 보여주는 것이 좋은지 판단하게 됩니다. iBeacon 관련 공식 문서를 보면 주변에서 스캔한 UUID, Major, Minor 로 사용자의 위치를 판단하는 예시들을 언급하는데, iBeacon 장치가 위치기반 서비스의 일부임을 표시하기 위해 미리 정해둔 UUID 를 사용합니다. UUID는 꼭 표준에 지정된 값을 쓸 필요는 없으며, 서비스 개발자가 임의로 지정해서 사용해도 됩니다.
- Major (2 byte), Minor (2 byte) : UUID 와 함께 사용자의 위치(Major, Minor = 지역, 세부 장소)를 판별하는데 주로 사용됩니다. 하지만 사용방법이 고정된 것은 아니며, 개발자가 이 값들을 임의의 목적으로 사용할 수도 있습니다. 예를 들어, 온도와 습도 데이터를 Major, Minor 데이터로 보낼 수도 있습니다. 물론 이 경우 비콘을 스캔 하는 장치도 해당 데이터를 온도, 습도로 인식하도록 만들어야 합니다.
- TX Power(1 byte) : 비콘 장치가 신호를 송출할 때의 power 레벨을 여기에 적어 보내줍니다. 비콘 신호를 수신할 때 신호 세기를 알 수 있기 때문에 TX power 보다 얼마나 감소했는지를 계산하고, 대강의 거리를 짐작할 수 있습니다. 하지만 이렇게 계산된 거리는 대략적인 추정치입니다. 비콘 신호는 주변 상황이나 움직임, 장애물에 의한 변동이 심할 수 있습니다.
References
'개발' 카테고리의 다른 글
주니어 개발자를 위한 조언 (0) | 2022.11.03 |
---|---|
12 가지 유명한 오픈소스 프로젝트 (0) | 2022.11.01 |
자주 실수하는 git (0) | 2022.10.26 |
centos7,8 SSL(HTTPS) 무료인증서 설치 (0) | 2022.10.11 |
intellij경고 java raw type 과 매개변수 타입 (0) | 2022.09.28 |