YD_S 개발로그
article thumbnail
Published 2023. 3. 21. 15:26
BLE(Bluetooth Low Energy) 연동 Flutter

BLE를 선택한 이유

프로젝트를 진행 중 Bluetooth Classic을 사용해 SPP를 이용해 데이터를 주고 받는 방식으로 설계하였다가 Android는 SPP를 지원하지만 iOS 에는 지원하지 않는다는 크나 큰 issuse가 있었다.

다행히 프로젝트 초기 단계라 BLE의 GATT를 이용하는 것으로 변경하였다.

 

해당 포스트에선 Bluetooth의 개념 소개가 아닌 Flutter와 BLE 연동법에 관한 것만 다룹니다.

BLE 패키지 선택

BLE 관련 패키지를 찾던 중 flutter_blue_plus와 flutter_reactive_ble를 찾았다.

flutter_blue_plus는 flutter_blue의 지원이 종료된 후 plus를 붙여 해당 패키지에서 계속 지원되고있다.

 

flutter_reactive_ble가 사용하기엔 더 편리했지만 Descriptors 를 지원하지 않고 notify를 on/off 할 수 없었다.

 

결론적으로 flutter_blue_plus로 선택

 

https://pub.dev/packages/flutter_blue_plus

 

flutter_blue_plus | Flutter Package

Flutter plugin for connecting and communicationg with Bluetooth Low Energy devices, on Android and iOS

pub.dev

 

권한 설정

Android

  • SDK 30 이하에는 BLE를 사용하기위해 위치 권한이 필수적으로 필요하다.
  • SDK 31 이상부턴 위치 권한이 필수가 아니기 때문에 위치 권한이 필요한 기능을 사용할 경우 android:maxSdkVersion="30"을 제거해준다.
  • BLUETOOTH_SCAN을 사용하여 위치를 확인하는 경우 다음 항목을 포함하도록 AndroidManfiest.xml 파일을 수정한다. 
  • app 수즌의 build.gradle 파일에서 minSdkVersion 값을 지정해준다.

 

iOS

  • iOS 13 이상의 경우 NSBluetoothAlwaysUsageDescription 권한 추가
  • iOS 12 이하의 경우NSBluetoothPeripheralUsageDescription 권한 추가

info.plist 권한 설정

패키지 사용법

  • 싱글톤으로 되어있어 매번 객체를 생성하지 않고 instance로 접근한다.

BLE Scan

  • Scan한 BLE List를 Stream으로 받는다. 
  • StreamBuilder를 활용해서 BLE 스캔 결과를 나타내준다.
  • StartScan 함수의 withServices, withDevices, macAddesses 를 지정하면 특정 BLE만을 스캔할 수 있다.
  • StartScan 함수의 allowDuplicatestrue로 지정할 경우 이미 스캔된 BLE도 최신화 시켜준다. (RSSi : 블루투스 신호 강도)
  • StartScan 함수의 scanMode를 설정할 수 있다. (ScanMode 표 참고)

 

※ ScanMode

ScanMode 설명
BLANCE 균형 전원 모드에서 Bluetooth LE 스캔을 수행합니다. 
스캔 결과는 스캔 주파수와 전력 소비 사이에 적절한 균형을 제공하는 속도로 반환됩니다.
LOW_LATENCY 가장 높은 듀티 사이클을 사용하여 스캔합니다. 
애플리케이션이 포그라운드에서 실행 중일 때만 이 모드를 사용하는 것이 좋습니다.
LOW_POWER 저전력 모드에서 Bluetooth LE 스캔을 수행합니다. 
전력을 가장 적게 소모하는 기본 스캔 모드입니다. 
이 모드는 스캐닝 응용 프로그램이 전경에 있지 않은 경우에 적용됩니다.
OPPORTUNISTIC 특별한 블루투스 LE 스캔 모드. 이 스캔 모드를 사용하는 애플리케이션은 BLE 스캔 자체를 시작하지 않고 수동적으로 다른 스캔 결과를 수신합니다.

 

BLE  Dis/Connect

 

BLE 상태 확인

  • BLE 상태가 변경될 때마다 값을 받는다.

※ BLE Status

Sstatus 설명
unkown BLE 패키지 초기화 전
unauthorized Bluetooth 권한 미승인
unavailable Bluetooth 미지원 기기
turningOn 블루투스 연결
turningOff 블루투스 연결 해제
on 기기 블루투스 활성화
off 기기 블루투스 비활성화

 

BLE 기기와 데이터 통신하기

  • service는 데이터를 논리적인 단위로 나누는 역할을 하며, 연결하려는 기기와 약속된 값을 지정해야한다. (공식적으로 지정되어 있는 service UUID (16 bit), 그 외 커스텀한 service UUID (128 bit)이 있다.)
  • characteristic는 service에 지정된 데이터 단위이다. service처럼 공식적으로 지정된 UUID(16 bit)와 커스텀한 UUID(128 bit)를 사용한다.
  • flutter_blue_plus에선 Service UUID(4 byte) 형식이 지원되지 않는다. 

★ 16 bit UUID의 값은 00000XXX-0000-1000-8000-00805F9B34FB 형태로 고정되어 있으며 XXX의 값에 따라 UUID가 변경된다. (예. 00000014-0000-1000-8000-00805F9B34FB : Network Device를 뜻한다.)

  BLE UUID(16 bit) 명단에서 고정 UUID를 확인할 수 있다.

 

 

특정 Service만 조회하기

 

 

BLE 알림 수신 (Notifications)

  • 주기적으로 변경되는 값을 읽는 경우 사용 (특정 service가 지원해야 사용 가능)

 

BLE MTU 설정 

  • 데이터 처리량을 조절하기 위해 MTU 값을 변경할 수 있다.
  • 요청한 MTU size가 반드시 적용된다는 보장이 없다.
  • iOS는 연결된 두 기기의 MTU 최대 값이 자동으로 지정된다. (iOS의 최대 값은 185다.)

 

BLE 우선순위 지정

  • Android만 지원
  • priority : highPerformance 설정 시 배터리 사용량이 증가하지만 GATT 작업 속도가 빨라진다.
  • 모든 장치에 고성능을 설정하면 우선 순위를 높이는 효과가 낮아지므로 여러 장치와 통신할 때 우선 순위를 설정할 때 주의해야한다.

 

'Flutter' 카테고리의 다른 글

Material3 Design 적용하기  (0) 2023.04.26
정규식(Regex)을 쉽게 다뤄보자  (0) 2023.03.29
chat_gpt_sdk (ChatGPT 연동)  (1) 2023.03.15
Kakao_flutter_sdk issues 등록기  (0) 2023.02.15
Build Options 정리  (3) 2023.02.09
profile

YD_S 개발로그

@YD_S

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!