본 글은 2017년 6월 23일 22시 34분에 썼던 글이며 블로그 자료 이전으로 날짜와 일부 내용이 갱신되었습니다.
Bluetooth Low Energy의 Advertising Channel
위의 사진과 같이 BLE(Bluetooth Low Energy)는 37번, 38번, 39번 채널에다가 Advertising을 할 수 있다. 하지만 기본설정으로는 3개의 채널을 번갈아가면서 Advertising하는 동작을 수행하기에 실험때문에 라즈베리파이의 블루투스의 Advertising 채널(channel)을 고정해야할 필요가 있어서 조사해보았다.
애플(Apple)의 BLE Advertising Channel
※ 참고: 현재 구글의 안드로이드나 애플의 iOS는 3개의 채널을 번갈아가면서 Advertising하는 동작만을 수행할 수 있다.
블루투스 표준에서 BLE Advertising 관련 명령어
먼저 블루투스 4.2 표준을 확인해보니 Advertising을 설정하는 명령어에 채널을 설정할 수 있는 파라미터가 있었다. 즉, 표준을 준수한 블루투스 모듈라면 Advertising 채널을 설정할 수 있는 것을 확인할 수 있었다.
라즈베리파이의 Bluez 구현 정보 확인
라즈베리파이의 경우 블루투스프로토콜스택으로 Bluez를 쓰고 있으므로 Bluez를 확인해본다.
확인결과 Bluez의 hcitool로 Advertising channel을 설정할 수 있었다. hci 관련 소스코드를 열어보면 hci_le_set_advertising_parameters 구조체에서 chan_map라는 이름의 인자에 특정한 Advertising 채널을 설정할 수 있는 것을 확인할 수 있다.
라즈베리파이 BLE Adevertising 명령어
터미널에서 사용하고싶다면 아래와 같이 입력하면 된다.
$ sudo hcitool -i hci0 cmd 0x08 0x0006 Min Max AdvT OwnAdT PeerAdT PeerAd ChMap Policy
- Min(=Advertising_Interval_Min)
- Advertising의 최소 간격을 의미한다
- 0xXXXX 형태로 값이 들어갈 수 있다. 기본값은 0x0800이며 0x0020 - 0x4000 의 범위를 가진다.
- 시간으로 환산하면 값*0.625msec이다.
- MAX(=Advertising_Interval_Max)
- Advertising의 최대 간격을 의미한다.
- 0xXXXX 형태로 값이 들어갈 수 있다. 기본값은 0x0800이며 0x0020 - 0x4000 의 범위를 가진다.
- 시간으로 환산하면 값*0.625msec이다.
- AdvT(=Advertising_Type)
- 0x00(=ADV_IND)
- Connectable undirected advertising
- 0x01(=ADV_DIRECT_IND, High Duty Cycle)
- Connectable high duty cycle directed advertising
- 0x02(=ADV_SCAN_IND):
- Scannable undirected advertising
- 0x03(=ADV_NONCONN_IND)
- Non-Connectable undirected advertising
- 0x04(=ADV_DIRECT_IND, low duty cycle)
- Connectable low duty cycle directed advertising
- 0x05 - 0xFF: 예약 필드
- Connectable은 연결을 수립할 수 있다는 것을 의미한다. 이러한 Advertising 패킷(Packet)을 수신한 스캐너(Scanner)는 연결을 수립하고 싶은 경우 연결 요청을 의미하는 CONNECT_REQ를 보낸다.
- Non-Connectable은 연결을 수립할 수 없다는 것을 의미한다.
- Directed는 패킷안에 상대방 장치의 MAC Address만이 들어있다. 아마 연결을 수립하는 과정 중에 사용하는 패킷이 아닐까 싶다.
- Undirected는 사용자가 원하는 데이터를 추가할 수 있는 것을 의미한다.
- Scannable은 스캔(Scan)이 가능한 것을 의미한다. 아마 페어링이 수행이 가능한 것을 의미하는 것 같다.
- Non-Scannable은 스캔이 불가능한 것을 의미한다.
- OwnAdT(=Own_Address_Type)
- 0x00(=Public Device Address)
- 0x01(=Random Device Address)
- 0x02
- 사설 주소를 사용한다. 사용 가능한 사설 주소가 없다면 공개 주소를 사용한다. 무슨 의미인지 모르겠다.
- 0x03
- 사설 주소를 사용한다. 사용 가능한 사설 주소가 없다면 LE_Set_Random_Address라고 하는 무작위 주소를 사용한다. 무슨 의미인지 모르겠다.
- 0x04-0xFF: 예약 필드
- PeerAdT(=Peer_Address_Type)
- 0x00(=Public Device Address)
- 0x01(=Random Device Address)
- 0x02-0xFF: 예약 필드
- PeerAd(=Peer_Address)
- 피어의 주소 값을 의미한다.
- 값은 0xXXXXXXXXXXXX 형식으로 들어간다.
- ChMap(=Advertising_Channel_Map)
- 00000000b: 예약
- xxxxxxx1b: 37번 채널을 사용한다.
- xxxxxx1xb: 38번 채널을 사용한다.
- xxxxx1xxb: 39번 채널을 사용한다.
- xxxxx111b: 모든 채널을 사용한다.
- Policy(=Advertising_Filter_Policy)
- 0x00: 모든 장치의 스캔 및 연결 요청을 처리
- 0x01: 모든 장치의 연결 요청 처리, 화이트리스트에 있는 장치로부터 온 스캔 요청을 처리
- 0x02: 모든 스캔 요청을 처리, 화이트리스트에 있는 장치로부터 온 연결 요청을 처리
- 0x03: 화이트리스트에 있는 장치로부터 온 스캔 요청과 연결 요청을 처리
- 0x04-0xFF: 예약
'사물인터넷(Internet of things, IoT) > 라즈베리파이(Raspberry Pi)' 카테고리의 다른 글
저장소 변경으로 라즈베리파이의 업데이트 속도를 빠르게 해보자 (0) | 2020.10.13 |
---|---|
라즈베리파이로 블루투스 비컨을 Advertising 해보자 (2) | 2020.10.11 |
댓글