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 권한 추가
패키지 사용법
- 싱글톤으로 되어있어 매번 객체를 생성하지 않고 instance로 접근한다.
BLE Scan
- Scan한 BLE List를 Stream으로 받는다.
- StreamBuilder를 활용해서 BLE 스캔 결과를 나타내준다.
- StartScan 함수의 withServices, withDevices, macAddesses 를 지정하면 특정 BLE만을 스캔할 수 있다.
- StartScan 함수의 allowDuplicates를 true로 지정할 경우 이미 스캔된 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 |