블로거는 어그로꾼이 되어야 합니다.
정보 전달을 위해서 같은 이름으로 시리즈물을 연재할 수도 있고 그것이 더 신빙성 있어 보입니다. 그러나 블로거는 사람들의 관심을 먹고 사는 사람입니다. 그리고 그 관심은 웹상에서의 많은 노출을 전제로합니다. 그렇기 때문에 이렇게 제목을 계속 변칙적으로 만드려 하니, 이 부분에 대해서는 양해 부탁드리는 걸로 포스팅을 시작하겠습니다.
Bluetooth, Behind The Scene.
블루투스 기술은 오랜 기간에 걸쳐 발전해오는 동안 많은 사람들의 삶의 질을 끌어올려 주었습니다. 그러나, 이 기술은 어떻게 개발되며, 어떻게 연결할까요? 모든 분야가 그렇듯, 블루투스 역시 사용은 쉽지만 개발이 어려운 분야입니다. 마치 게임을 하는 것과 만드는 것의 간극과 비슷합니다. 블루투스의 작동 방식을 파악하기 위해서는 우선 전반적으로 통신에 대한 깊은 이해가 필요합니다. 블루투스 개발은 대부분 임베디드 환경에서 진행하다 보니 그 어려움은 배가 됩니다. 그렇기 때문에 여기에서는 필요한 것들만 확인하고 코드로 바로 넘어가서 실제로 구현하는 과정을 보여드리고자 합니다.
이번 포스팅에서는 ESP-32에서 블루투스 개발에 매진해오면서 얻은 나름의 연구결과를 풀어볼까 합니다. 현업에 계신 분들 입장에서는 부족함이 많이 느껴질 수 있으나, 개인이나 이제 막 블루투스 기기를 통한 개발을 준비중인 분들에게는 충분히 도움이 될 수 있는 내용이라 생각합니다.
BLE(Bluetooth Low Energy)
블루투스 4.2 부터 적은 에너지로도 통신을 할 수 있도록 생겨난 개념입니다. 다른 문서들을 통해 익히 들어보셨을 Observer, Broadcaster, Central, Peripheral로 기기들의 역할을 정의합니다.(앞에 언급된 4개의 역할들은 신분과도 같습니다.)
GAP, GATT(General Access Profile, General Attribute Profile)
각 장치들의 자신들의 역할을 소개하고, 역할에 맞는 제품들끼리 연결하는데 사용됩니다.
Service, Characteristics
Sevice는 각 장치들의 세분화된 역할을 정의합니다. Characterisrics는 Service가 할 일을 의미합니다.
위의 내용을 간략히 정리해 보면, 사람들 사이의 관계와 어느정도 대응되는 면이 있습니다. 원청, 1차 하청, 제조사...이런 비유가 부적절하다는 생각은 들지만 별달리 떠오르는게 없다 보니 부득이하게 넣었습니다. 여기에서 Broadcaster는 무언가를 주기만 합니다. Observer는 받기만 합니다. Central, Peripheral은 그 관계가 모호합니다만 상호작용이 존재합니다. 각자 신분이 같아도 직업(UUID)가 다를 수 있습니다. 직업이 다르니 하는 일(Characteristics)도 다릅니다.
이렇게 신분과 직업, 할 일로 비유한 것들이 전체 그림 파악하는데 조금이나마 도움이 되었기를 기대하면서, 주변에서 가장 흔하게 볼 수 있는 블루투스 장치들을 통해 이 관계들을 조금 더 알아보겠습니다. 여기에서는 주위에서 흔히 볼 수 있는 블루투스 마우스, 블루투스 헤드셋을 예로 들어보겠습니다.
Relationship between Host and Bluetooth Mouse
블루투스 마우스를 먼저 정리했습니다. 두 신분 관계는 Broadcaster<->Observer가 될 수도 있지만, 블루투스 마우스가 보내는 정보를 아무 장치나 연결해서 받을 수 있다면 난감한 상황이 생깁니다. 따라서 1:N으로 연결하는 Central<->Peripheral 관계가 조금 더 적절할 것입니다.
Host는 Bluetooth 규약에 따라 정의된 UUID를 가지고서, Peripheral로부터 정보를 받아서 처리합니다. 블루투스 마우스는 예상과 같이 센서로부터 받아들인 데이터를 Host로 보냅니다. 여기서 주목할 것은 블루투스 마우스가 두 가지의 서비스를 가지고 있는 점입니다.
공노비가 사노비 로 투잡 뛸 수 있는 것처럼, 하나의 Peripheral에서 다수의 Service가 존재할 수 있습니다. HID Mouse UUID를 가진 Service 에서는 마우스 본연의 커서 움직임과 클릭 등의 정보가 담긴 Characteristic을 가집니다. Battery Service에서는 블루투스 마우스의 배터리 정보를 Host로 보냅니다.
Relationship between Host and Bluetooth Earphones
블루투스 이어폰 역시 Central<->Peripheral 관계로 연결됩니다. 마이크 신호와 미디어 컨트롤 신호를 송신하고, 소리 신호를 수신합니다. 자 그렇다면 여기에서, 블루투스 마우스나 헤드셋이 아니라 다른 어떤 제 3자의 컨트롤을 요구하는 기기는 어떻게 해야 할까요? 이전의 블루투스 2.0처럼 시리얼 통신(SPP)를 사용할까요? 안타깝게도 BLE에서는 시리얼 통신이 기본으로 포함되어 있지 않습니다. 이미 있는지도 모르겠지만 블루투스로 제어 가능한 모션데스크나, 스마트 조명, 에너지 미터의 경우를 확인해보겠습니다.
Relationship between Host and 3rd Party Device
대부분의 장치에서 사용할 수 있도록 이미 우리가 생각해 볼 법 한 장치에 대한 UUID는 대부분 정의되어 있습니다. 범용성을 위해 웬만해서는 기존에 정의된 UUID를 사용하기를 권장합니다. 그러나 모션데스크, 스마트조명, 에너지미터처럼 조금 특수한 목적을 위해 사용되는 경우에는 커스텀 UUID를 정의해서 할 일을 할당할 수도 있습니다.
마치며
이렇게 글을 다 작성하고 보니 신분은 Class, Service는 Method, Characteristics는 Parameter로 비유할 수도 있었을 것 같다는 생각에 아쉬움이 듭니다. 그렇지만 처음 블루투스 개발에 입문하는 사람들이 저처럼 오랜 기간 해메지 않고, 핵심 개념을 확실히 잡아서 깊은 영역까지 블루투스에 대한 이해를 확장해나가는데 도움이 될 수 있다면 그걸로 충분하지 않을까 하는 생각이 듭니다. 다음 포스팅에서는 ESP32를 사용해 host장치와 블루투스를 연결해볼 수 있었으면 합니다. 감사합니다.
긴 글 읽어주셔서 감사합니다. ❤️와 광고 클릭으로 고마움을 간단히 표현할 수 있습니다.
개발환경 | Mac OS 15.0 Monterey Beta 9, Python 3.9, ESP-IDF v4.3, EasyEDA 6.4.24
제품 개발 및 기타 문의 | dokixote@wklabs.io 혹은 오른쪽 아래 채팅을 통해 문의