본문 바로가기
기타 IT 지식

[ Bluetooth ] 블루투스 연결 과정 | HCI(Host Controller Interface)에 대하여

by 코뮤(commu) 2021. 12. 21.
728x90
반응형

 

 

현재 bluez 코드를 읽어가면서 코드를 작성하고 있는데,

C와 파이썬을 여기저기 넘나들고 있다.

 

최근에는 거의 한국어로 된 자료를 보지 못했다.

BLE 프로그래밍은 대부분 자료들이 영어로 작성되어 있고, 애초에 그 양도 적은 것 같다.

삽질하는게 참 오랜만이라 신난다.

 

블루투스의 하드웨어적 접근이 아닌 소프트웨어 프로토콜 스택에 관해서만 알아보도록 하자.

 

 

 

 

블루투스 연결과정

 

블루투스 기기가 서로 연결되는 과정은 아래와 같다.

 

1. Inquiry

 

스캔이라고 생각하면 편하다. 두 블루투스 기기가 서로를 인지하지 못한 상태에서 어떠한 한개의 기기가

inquiry 요청을 보내면, 그 요청을 받은 다른 기기는 inquiry 응답을 보내게 되는데 그 응답 안에 블루투스 맥과 이름등과 같은 여러가지 정보가 담겨져 있다.

 

 

2. Paging

 

실제 두 기기가 연결된 상태인 Connection 상태가 되기 위해서 진행한다.

실제 연결이 되는 단계라고 생각하면 된다.

 

 

실제 파이썬에서 bluez 의 코드를 보면, hci 가 굉장히 많이 반복됨을 알 수 있다.

 

 

HCI (Host Controller Interface)

 

여기저기 서칭하다보니까 알게된 사실인데,

이 HCI가 블루투스 프로토콜 소프트웨어 파트에서는 상당히 비중있는 개념이라고 한다. 

 

이것만 완벽하게 이해해도 블루투스를 대부분 이해하고 있다고 해석해도 된다고 할 정도니

잘 알아두는 것이 좋겠다.

 

이 HCI는 하드웨어 모듈과 서로 주고받는 명령 구조를 정의하고 있다.

블루투스 모듈과 주고받는 패킷의 형식과 절차를 정의하고 있다는 말이다.

 

블루투스 패킷은 커맨드 패킷, 이벤트 패킷, 데이터패킷으로 나뉜다.

 

..라고 알고 있었는데, 비교적 최신 자료에서는 두개가 더 늘었다.

데이터 패킷이 비동기 데이터 패킷과 동기 데이터 패킷으로 분리되었고,

커맨드 패킷을 확장시킨 확장 커맨드 패킷이 하나 더 추가된 것 같다.

 

Command packet

 

커맨드 패킷은 내(PC)가 블루투스 모듈에게 어떠한 동작을 하라는 것을 시키려고 보낸다.

그러면 블루투스 모듈은 명령의 결과를 이벤트 패킷으로 나에게 보낸다.

데이터 패킷은 위에서 설명한 connection 이후 데이터 전송을 할 때 사용된다.

 

블루투스 패킷 중 command packet 은 아래 그림과 같이 생겼다.

 

이미지 출처 : https://software-dl.ti.com/simplelink/esd/simplelink_cc13x2_sdk/1.60.00.29_new/exports/docs/ble5stack/vendor_specific_guide/BLE_Vendor_Specific_HCI_Guide/hci_interface.html

 

가장 처음에 보이는 것은 OpCode 이다.

0에서 16비트. 총 2바이트 길이인데, 이는 커맨드마다 존재하는 고유한 값이라고 생각하면 된다.

OpCode는 6비트의 OpCode Group Field 와 10비트의 OpCode Command Field로 구성된다.

 

나는 이 OpCode Group Field 와 OpCode Command Field 를 보면서,

어,, 어디서 많이 본 것 같은데?? 뭐지? 라는 생각밖에 안했다.

 

포스팅하면서 찾아보니까 이게 바로 bluez 코드에도 있는 OGF_ ~~, OCF_~~ 였던 것이다!

 

OpCode Group Field (OGF)

명령의 그룹별로 부여된다.

 

OpCode Command Field (OCF)

각각의 그룹내에 존재하는 명령별로 부여된다.

 

 

OpCode 이후 1바이트는 인자 길이와 각각의 커맨드 별 인자가 들어온다.

 

이제 대강 커맨드 패킷은 감이 올 것이다.

 

그런데 여기서 주의할 점이 있다.

 

블루투스 패킷은 리틀엔디안(Little endian) 방식이라 하위 바이트가 먼저 전송된다.

 

 

커맨드 패킷 그룹은 크게 6개로 나뉘고, 약 100개의 커맨드가 존재한다고 하는데

옛날 자료들로 이러한 정보를 얻었기 때문에, 더 추가되지 않았을까 생각한다.

 

 

참고로 여러가지 커맨드 패킷 opcode의 ogf와 ocf 가 궁금하다면

 

https://software-dl.ti.com/simplelink/esd/simplelink_cc13x2_sdk/1.60.00.29_new/exports/docs/ble5stack/vendor_specific_guide/BLE_Vendor_Specific_HCI_Guide/hci_interface.html

 

HCI Interface — Vendor Specific Guide 5.00.00 documentation

HCI Overview The HCI is a standardized Bluetooth interface for sending commands, receiving events, and for sending and receiving data. It is typically realized as a serial interface, using either RS232 or USB communication devices. As the name implies, the

software-dl.ti.com

 

위 링크를 가서 확인해보면 될 것 같다.

 

 

Event packet

 

이벤트 패킷의 구조는 아래 그림과 같다.

 

 

이미지 출처 : https://software-dl.ti.com/simplelink/esd/simplelink_cc13x2_sdk/1.60.00.29_new/exports/docs/ble5stack/vendor_specific_guide/BLE_Vendor_Specific_HCI_Guide/hci_interface.html

 

 

 

이벤트 코드를 제외하고는 딱히 중요하게 볼건 아닌 것 같다.

이벤트 코드의 종류도 커맨드 패킷 쪽에서 걸어놓은 링크에 표현이 다 되어있다.

 

 

 

실제 코드에서 패킷을 받아 읽어보면 코드 뿐만 아니라 indicator 값도 따라온다.

 

Event Packet 의 indicator 값은 0x04 이고, Command Packet 은 0x01이다.

 

 

그런데, 아무리 찾아도 event packet 의 filter 에 관해서는 나오질 않는다.

이건 bluez.py 를 만든사람이 filter 라는 개념을 새로 넣어서 개발한 것인지

아니면 이게 블루투스 통신에서 쓰이는 개념인지 잘 모르겠다.

 

이에 관한 제보나 정보 링크는 언제나 환영합니다.

 

 

728x90
반응형