마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

코틀린 BLE 재연결 관련 질문입니다.

0 추천

현재 코틀린으로 BLE 통신을 개발중인데요.
동작 순서는

스캐닝을 통해 주변기기를 가져와서
RecyclerView에 기기 목록을 리스팅하고
리스팅된 아이템을 클릭하면 연결을 한 뒤에

특정 버튼을 누르면 정해진 Characteristic을 통해서
Descriptor를 가져오고 Descriptor에 writeDescriptor를 이용해서
센싱된 데이터를 송신하도록 기기에 명령을 쓰도록 해놨습니다.

그런데 중간에 자꾸 블루투스 연결이 끊기는데요
BluetoothGattCallback의 onConnectionStateChange함수에서
newState가 BluetoothProfile.STATE_DISCONNECTED인 경우에 다시 지속적으로 센싱 데이터를 읽어오고 싶은데
연결할때의 방식의 코드를 다시 실행하게끔 작성하니
동작을 하지 않습니다.
혹시 연결이 끊기는 경우에 이어서 다시 센싱데이터를 읽어올 수 있는 방법을 알려주실수 있을까요?

 

// 특정 UUID의 서비스를 발견한 경우에 실행되는 부분입니다.
gatt!!.setCharacteristicNotification(
service.getCharacteristic(HSDeviceObject.HSDEVICE_DEPTH_CHARACTERISTIC_UUID),
true
)

var descriptor = service.getCharacteristic(HSDeviceObject.HSDEVICE_DEPTH_CHARACTERISTIC_UUID)
.getDescriptor(HSDeviceObject.HSDEVICE_DEPTH_CHARACTER_DESCRIPTOR_UUID)
descriptor.value = BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE

start_measure_btn.setOnClickListener {
if(setupViewController.getState() == State.CONNECTED) {
gatt!!.writeDescriptor(descriptor)
setupViewController.setState(State.MEASURING)
}
}

// 이 함수는 BluetoothGattCallback 오버라이딩된 함수입니다.
override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {
super.onConnectionStateChange(gatt, status, newState)

if(newState == BluetoothProfile.STATE_CONNECTED) {
gatt?.discoverServices()
}
else if(newState == BluetoothProfile.STATE_DISCONNECTING) {

}
else if(newState == BluetoothProfile.STATE_DISCONNECTED) {
// 블루투스 연결이 끊긴 경우에 처리할 수 있는 부분

}
}

 

아 애초에 처음 연결해서 센싱데이터를 받아서 로그가 찍힐때

이게 30초정도 뒤에는 끊기는 것 같습니다.

정확하지는 않습니다만 연결할때마다

30초 정도 있다가 끊기는 것 같은데 이 부분은 어떻게 처리할 수 있을까요 ?

브레인토스트 (880 포인트) 님이 2018년 6월 11일 질문
브레인토스트님이 2018년 6월 11일 수정

1개의 답변

0 추천
 
채택된 답변

자체 해결했습니다.
BLE 모듈의 전력 공급량에 비해 요청 주기가 빠른것이 문제였습니다.
원래는 특별한 문제가 없으면 요청한 writeDescriptor함수를 사용한 순간부터 종료하기 전까지는 bluetoothGattCallback에 newState로 STATE_DISCONNECTED가 요청되는 경우가 없어야 하는데 전력량 문제로 안드로이드의 기본 설정인 timeout 30초 이후에 자동으로 호출되게끔 되는 것이였습니다.
그래서 BLE 모듈에서 setCharacteristicNotification을 설정하는 코드 바로 위에 gatt!!.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_LOW_POWER)
를 사용해서 저전력 주기로 설정을 변경하니 끊기지 않네요.

링크는 이곳을 참고했습니다.
https://www.silabs.com/.../forum.../ble113_android_lmpr-xQmy

브레인토스트 (880 포인트) 님이 2018년 6월 12일 답변
...