본문 바로가기
사물인터넷(Internet of things, IoT)/라즈베리파이(Raspberry Pi)

라즈베리파이에서 BLE Advertising channel을 설정해보자

by 연구자 공학코드 2020. 10. 11.

공지사항

  1. 제가 운영하는 네이버 카페 개발자 커뮤니티 코어큐브(https://cafe.naver.com/ewsncube)에 가입하시면 컴퓨터 관련 학습 자료와 질의응답을 제공받으실 수 있습니다.

728x90
반응형

본 글은 2017년 6월 23일 22시 34분에 썼던 글이며 블로그 자료 이전으로 날짜와 일부 내용이 갱신되었습니다.

Bluetooth Low Energy의 Advertising Channel

블루투스표준의 Advertising 채널에 관한 지침

위의 사진과 같이 BLE(Bluetooth Low Energy)는 37번, 38번, 39번 채널에다가 Advertising을 할 수 있다. 하지만 기본설정으로는 3개의 채널을 번갈아가면서 Advertising하는 동작을 수행하기에 실험때문에 라즈베리파이의 블루투스의 Advertising 채널(channel)을 고정해야할 필요가 있어서 조사해보았다.

애플(Apple)의 BLE Advertising Channel

애플의 블루투스 개발 지침

※ 참고: 현재 구글의 안드로이드나 애플의 iOS는 3개의 채널을 번갈아가면서 Advertising하는 동작만을 수행할 수 있다.

블루투스 표준에서 BLE Advertising 관련 명령어

블루투스 4.2 표준 명령어 확인

먼저 블루투스 4.2 표준을 확인해보니 Advertising을 설정하는 명령어에 채널을 설정할 수 있는 파라미터가 있었다. 즉, 표준을 준수한 블루투스 모듈라면 Advertising 채널을 설정할 수 있는 것을 확인할 수 있었다.

라즈베리파이의 Bluez 구현 정보 확인

라즈베리파이의 경우 블루투스프로토콜스택으로 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: 예약

 

 

728x90
반응형

댓글