[Flutter] Bluetooth(플러터 블루투스) flutter_reactive_ble 사용방법
Flutter

[Flutter] Bluetooth(플러터 블루투스) flutter_reactive_ble 사용방법

728x90

지난번 플러터 블루투스에 관한 라이브러리를 사용하는 방법에 대해 포스팅을 했지만,
이번에는 다른 라이브러리를 사용하는 방법을 포스팅 하려고 합니다. 

 

지난 1년동안 잘 써왔지만 이번에 프로젝트를 널세이프티 버전으로 올리게 되면서 

flutter_ble 를 사용하면서 생겼던 불편함에 대해 일단 서술하려고 합니다. 

 

기본적으로 제일 큰 불편함은 GattServer 클리어가 없다는 점이었습니다. 그로인해 작은 이슈들이 계속 생기게 되었고, 

다른 라이브러리가 없나 살펴보던 중
https://pub.dev/packages/flutter_reactive_ble

해당 라이브러리를 발견하여 이 라이브러리에 대해 포스팅 해보도록 하겠습니다. 

기본적으로 flutter_ble를 사용하면서 이용했던 기능들은 대부분 다 사용이 가능했습니다. 

 

일단 최신 버전은 5.0.2 이며 Null safety 입니다. 

 

이 라이브러리가 지원하는 기능들은 다음과 같습니다. 

 

  • BLE device discovery (Ble 장치 검색 기능)
  • Observe host device BLE status (Ble 상태 관찰)
  • Establishing a BLE connection (Ble 연결 설정) 
  • Maintaining connection status of multiple BLE devices (여러 장치 연결 유지)
  • Discover services(will be implicit) (서비스 검색)
  • Read / write a characteristic (특성을 읽고 쓰기)
  • Subscribe to a characteristic (특성 구독)
  • Clear GATT cache <- 클리어가 있어 이 라이브러리를 선택하였습니다.
  • Negotiate MTU size (MTU 크기 협상)

 

 

사용방법은 다음과 같습니다. 

 

1. 초기화
final flutterReactiveBle = FlutterReactiveBle();

 

2. 기기 검색
flutterReactiveBle.scanForDevices(withServices: [serviceId], scanMode: ScanMode.lowLatency).listen((device) {

      //code for handling results

    }, onError: () {

      //code for handling error

    });

 

3. BLE 상태 리스너

상태의 종류들은  ready, poweredOff, unauthorized 등이 있습니다.

 

4. Read characteristic 

final characteristic = QualifiedCharacteristic(serviceId: serviceUuid, characteristicId: characteristicUuid, deviceId: foundDeviceId);
final response = await flutterReactiveBle.readCharacteristic(characteristic);

BLE 디바이스의 Service UUID , characteristicId를 사용해서 응답값을 읽어오는 부분입니다.

 

5. Write with response

final characteristic = QualifiedCharacteristic(serviceId: serviceUuid, characteristicId: characteristicUuid, deviceId: foundDeviceId); 
await flutterReactiveBle.writeCharacteristicWithResponse(characteristic, value: [0x00]);

쓰기 부분입니다. 되돌아오는 응답이 있을경우 사용합니다. 

 

6. Write without response 

final characteristic = QualifiedCharacteristic(serviceId: serviceUuid, characteristicId: characteristicUuid, deviceId: foundDeviceId);
flutterReactiveBle.writeCharacteristicWithoutResponse(characteristic, value: [0x00]);

쓰기 부분입니다. 되돌아오는 응답이 없을경우 사용합니다. 

 

7. MTU

final mtu = await flutterReactiveBle.requestMtu(deviceId: foundDeviceId, mtu: 250);

MTU가 이제 모바일 디바이스에서 -> BLE디바이스로 write할 경우에 우리는 데이터를 List<int> 형식으로 보내게 되는데 

각 모바일 디바이스 ex)BLE5.0 같은 경우에 512bytes 까지 가능합니다. 

 

음 쉽게 한 패킷당 데이터를 보낼 수 있는 크기를 협상하는겁니다.

 

물론 BLE 디바이스가 한번에 받을 수 있는 크기도 알아야겠지요 

 

보통 128 256 512 -> 보내지만 mtu 요청을 할 시에는 3byte를 추가해서 요청하시면 됩니다. 

ex) 보내고 싶은 패킷 데이터 크기 256bytes -> mtu 협상 259bytes

 

일단 공식문서에 쓰여있는 기본적인 기능들은 위와 같지만

실제로 사용할때 방법을 소개해 드리도록 하겠습니다.

 

선언 초기화부는 동일하게 사용하셔도 무방합니다. 

 

1. 검색 

이런식으로 StreamSubscription을 사용하시면 scan start와 scan stop을 구현하실 수 있습니다. 

또한 스캔의 결과물을 도출할 때 조건을 걸어서 사용하실 수 있고, 그 결과는 .listen안의 device에 나타나게 됩니다. 

 

2. 검색 중지

StreamSubscription을 사용하여 바로 cancel시키면 중지 또한 가능 합니다. 

 

3. GattCacheClear

저는 이런식으로 사용하여 제가 원하는 디바이스를 찾거나, 화면이 dispose 되는 경우에 적용시켜 캐시를 청소해 줬습니다. 편하신대로 사용하시면 될거 같습니다.

 

글이 너무 길어지는거 같아 2편으로 작성하겠습니다. 

2편에서는 검색후 연결, discoverservice, discoveredcharacteristic 등 나머지 기능들을 소개해 드리도록 하겠습니다. 

 

감사합니다. 

 

728x90