[Flutter] 플러터 블루투스 연결 구현 #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를 알고 있어야한다.
'Study > Flutter' 카테고리의 다른 글
[Flutter] 플러터 블루투스 연결 구현 #3 아두이노 코드 분석 (0) | 2023.03.03 |
---|---|
[Flutter] 플러터 블루투스 연결 구현 #2 플러터에서 사용할 블루투스 라이브러리 정리 (0) | 2023.03.02 |
[Flutter] 플로팅버튼 스피드다이얼로 만들기. (0) | 2023.02.22 |
[Flutter] GestureDetector Widget (0) | 2023.02.03 |
[Flutter] 플로팅 버튼 중단부에 위치시키기 BottomApp, Floationg Action (0) | 2023.02.02 |
댓글