카테고리 없음

BLE Multi connect

flutter 개발하자 2021. 1. 11. 14:41

BLE Multi connect란 말 그대로 안드로이드 어플리케이션 하나에 여러개의 ble들을 연결하는 것을 의미한다. 

BLE 연결 관련된 자료는 이전 글에 게시해놨다.

 

BLE Multi connect의 핵심은 큐를 사용하는 것이라고 할 수 있다. BLE와 데이터를 주고 받으려면, characteristic을 읽거나 쓰고, notification을 등록하는 과정이 필요한데, 이 과정들이 동기로 돌아야한다. 즉, 순서대로 코드가 실행되야하는데, 동기화를 하지않으면, 비동기로 이 코드들이 돌아가기때문에 에러가 발생한다. 아래의 예시 코드를 보면서 생각해보자.

안드로이드에서 BLE의 프로세스를 따지면 아래와 같다.

1. BLE와 안드로이드의 연결(페어링) (callback에서 onConnectionStateChange에서 연결됐다는 값을 보내준다.)

2. onConnectionStateChange에서 discoverServices()로 연결된 ble들의 서비스들을 검색한다.

3. callback의 onServicesDiscovered()에서 발견된 서비스들을 이용해 안드로이드와 ble가 데이터를 교환할 수 있는 세팅을 해줘야한다. 

***********************************************************************************************

안드로이드와 BLE가 데이터를 교환할 수 있도록 해주는 세팅

 BLE의 서비스중 안드로이드에서 사용하고자 하는 UID와 동일한 서비스를 찾고, 그 서비스에서 ReadCharacteristic과        WriteCharacteristic의 uid에 맞는 characteristic들을 찾는다. -> 

 BluetoothGatt.readCharacteristic(ReadCharacteristic)으로 characteristic들을 읽는다 ->

 BluetoothGatt.setCharacteristicNotification(ReadCharacteristic, true)로 Bluetooth GATT 기능을 제공해 BLE 장치와 통    신할 수 있도록 함. ->

 writeDescriptor에서 descriptor를 가져와 BluetoothGatt.writeDescriptor()로 Characteristic의 descriptor에 원하는 값을    쓸 수 있게 설정한다.

***********************************************************************************************

4.위와 같이 세팅이 끝나면 callback의 onCharacteristicRead()에서 첫 번째로 BLE에서 주는 데이터를 받고, 이후에는 onCharacteristicChanged()에서 모든 데이터를 받는다.

 

BLE MultiConnect는 위의 과정 하나 하나를 큐에 담아 처리하는 것이다.

MainThread에서 처리하면 비동기로 처리하기 때문에,  큐 하나당 스레드를 하나씩 만들어 생성된 스레드들이 위 과정을 동기로 돌아가도록 만들면 멀티 컨넥팅이 된다.

 

 

*************

BLE 5.0은 CLIENT_CHARACTERISTIC_CONFIG값이 다르므로 주의하도록 하자.