본문 바로가기

[Flutter] 플러터 블루투스 연결 구현 #1 개요 및 용어정리

I'm 영서 2023. 3. 1.
반응형

회사내 프로젝트로 신규 H/W를 만들고 이를 모바일 환경에서 블루투스로 연동해야 하는 프로젝트가 있었다.

진짜 열심히 뒤져봐도 깔끔히 정리된걸 못찾아서 가이드라인겸 해서 작성..

 

아두이노, 블루투스에 대한 구성요소 및 제작법에 대한 어떠한 정보도 없기때문에, 그 시각에서 작성.

 

블루투스 기기는 ESP32 사용, 왜 해당 기기인가? 에 대해서는 모른다. 해당 H/W를 선택하는게 이점이 있기때문에 선택했다고만 확인함.

 

해당 모듈에 대한 소스코드를 받았는데 여기서 부터 시작한다.

 


 

1. 블루투스를 연결하기 위해 필요한것.

   - 블루투스 용어정리

   - 블루투스 라이브러리 

2. 블루투스 연결

    - 아두이노 코드분석

    - 모바일(플러터)에서 확인

3. 데이터 송수신

 


블루투스 용어정리

 

블루투스 용어에 대해 간단히 정리부터 해보자.

BLE라는 단어를 보게되는데, Bluetooth Low Energy 라는건데 블루투스 4.0 이 후 버전은 해당 용어로 대체된다. 

훨씬 적은 전력으로 고수준의 무선통신을 할 수 있다는 점 때문에 이렇게 부른다. 

 

클라이언트 - 어플리케이션

서버 - 블루투스 장치

 

서비스 - 블루투스 장치에서 제공하는 기능을 나타낸다. BLE에서는 캐릭터리스틱을 사용하여 서비스의 속성을 설명한다.   서비스는 일반적으로 하나 이상의 캐릭터리스틱을 포함하며, 각각은 UUID와 함께 정의된다.

 

서비스 UUID - 16비트 또는 128비트이며, 공식적으로 정의된 서비스 UUID와 사용자 정의 UUID를 사용할 수 있다. 

  • Bluetooth SIG 에서 정의한 서비스로. 블루투스 표준 사양에 따라 제공된다. 
  • Generic Access Profile - 블루투스 장치에 대한 접근 권한 및 연결 설정 제공
  • Device Infomation Service - 블루투스 장치의 제조사, 모델, 펌웨어 버전 등과 같은 정보 제공
  • Battery Service - 블루투스 장치의 배터리 수준 정보
  • Heart Rate Service - 심박수 정보

 

ESP32에서 정의된 서비스 UUID

  • Generic Access Profile(GAP) Service: 0x1800
  • Device Information Service(DIS): 0x180A
  • Battery Service: 0x180F
  • Health Thermometer Service: 0x1809
  • Heart Rate Service: 0x180D
  • Alert Notification Service: 0x1811
  • Time Service: 0x1805

사용자 정의 서비스 UUID - 개발자가 직접 정의 

 


캐릭터리스틱

블루투스 LE 장치의 서비스 내부에 있는 속성으로 측정 데이터, 상태정보, 알림 등과 같은 값을 포함하며, UUID,  값, 속성, 퍼미션, 디스크립터를 통해 정의한다. 하나 이상의 값과 가질 수 있으며, 속성과 허가는 응용 프로그램에서 변경될 수 있다. 

캐릭터리스틱 값(Value) - 전송되는 실제 데이터 값으로 Read와 Notify 속성을 통해 읽을수 있다. 바이트배열 형태로 표현된다.

캐릭터리스틱 속성(Properties) - 지금은 잘 모르고 종류가 이렇구나 정도만 알아도 충분하다. 

  •     Read - 블루투스 장치에서 캐릭터리스틱 값을 읽는데 사용. 해당 요청에 대한 응답으로 블루투스 장치는 해당 캐릭터리스틱 값의 현재 상태를 응답으로 반환.
  •     Write - 블루투스 장치에 값을 쓰는데 사용된다. 해당 요청에 대한 응답으로 블루투스 장치는 해당 캐릭터리스틱 값이 변경되었음을 알리거나, 쓰기가 실패했음을 알림.
  •     Notification - 블루투스 장치간에 캐릭터리스틱 값 변경 사항을 실시간으로 알리기 위해 사용됩니다. 해당 연산을 사용하면 클라이언트는  서버에 알림을 요청하고, 서버는 캐릭터리스틱 값이 변경되면 클라이언트에게 알림 메시지를 보냄.
  •     Indication -  Notification과 유사하지만 서버는 클라이언트로부터 인디케이션 확인 응답을 받을 떄까지 캐릭터 리스틱 값을 업데이트 하지 않는다. 이를 통해 클라이언트는 캐릭터리스틱 값 변경을 보장받는다.

퍼미션 - 캐릭터리스틱에 대한 액세스 권한으로 각 속성별로 존재한다.

디스크립터 - 캐릭터리스틱에 대한 추가 정보를 포함한다. 캐릭터리스틱이 사용자에게 설명하는 값을 포함할 수  있다.

 

 

** 중요한점은 캐릭터리스틱을 통해 송수신을 한다는점. 그리고 각 캐릭터리스틱은 반드시 하나 이상의 속성을 가진다는 점이다.  예를들어 Generic Access Profile 서비스에 캐릭터 리스틱 A 가 Read와 Write를 가지고 있다면 클라이언트는 캐릭터리스틱 값을 읽을수도, 쓸수도 있는것이다. 

 

블루투스 구조

 

위 그림처럼 생겼으며 각 캐릭터리스틱은 반드시 UUID를 가지고 있고, Value가 있다. 속성은 여러개일수 있으며, 디스크립터는 여러개가 존재할 수 있으며 이역시 UUID로 식별된다.

 

즉 특정 캐릭터리스틱의 특정 디스크립터를 찾기 위해선

서비스의 UUID와 캐릭터리스틱의 UUID 그리고 디스트립터의 UUID를 모두 알아야 하며

특정 캐릭터리스틱의 값을 가져오려면

서비스 UUID와 캐릭터리스틱의 UUID를 알고 있어야한다.

 

 

반응형

댓글