BLE 연결 후 바로 해제했을 때 싱크가 맞지 않는 문제

이성민·2024년 11월 27일
0

안드로이드

목록 보기
10/19

문제 발생

BLE 연결 중 해당 기기와 연결을 끊고 다시 Scan 할 때 기존의 기기와 싱크가 맞지 않아 연결이 되는 문제가 발생했다.

원인 파악

BLE 연결 과정

해당 문제 원인을 파악하기 위해서는 연결 과정을 파악 할 필요가 있다고 판단하였다. 따라서 이 전 과정인 ble device scan은 생략하도록 하겠다.

advertising 하고있는 기기에 device.connectGatt() 를 통해서 연결을 보내면 BluetoothGattCallback을 통해 연결 상태값을 받을 수 있다.
호출되는 콜백 메소드 순서는 다음과 같다

1) onConnectionStateChange
2) onServicesDiscovered
3) onCharacteristicRead

연결 상태값이 변경되면 맨 먼저 onConnectionStateChange 가 호출되는데, 이때 gatt.discoverService() 를 호출하여 연결된 디바이스 서비스 정보를 알 수 있도록 조치한다.

그 후 onServicesDiscovered로 발견된 서비스가 넘어올 때, 지정된 uuid 값을 통해 read가 가능한 characteristic을 찾아서 정보를 받을 수 있도록 설정한다.

여기까지 설정이 잘 되었다면 onCharacteristicRead 로 연결된 디바이스에서 보내는 characteristic가 넘어오게 된다.

문제 원인

connectGatt() 가 호출된 직후 advertising 기기와 연결이 되는 사이 새로 scan 을 하기위해 gatt.disconnect() 와 gatt.close() 를 호출 했지만 해당 기기에서는 gatt 연결을 끊는다는 신호를 받지 못해 onConnectionStateChange 로 연결이 되었다는 상태값을 보내준 듯 하다. 따라서 연결을 보낸 기기에서는 gatt 값이 null 이지만 연결을 받는 기기에서는 해당 gatt로 연결을 시도하려는 과정에서 문제가 생긴 것이었다.

문제 해결

따라서 onConnectionStateChange 가 넘어왔을 때, 저장된 gatt 값을 체크하여 값이 null 일 경우 gatt.disconnect() 와 gatt.close() 를 한번 더 실행해 주는 방식으로 이를 해결 할 수 있었다.

profile
Android Developer 이성민입니다

0개의 댓글