본문 바로가기
Android

Android BLE 통신하기

by kkong93 2025. 11. 28.
BLE 연결은 “파이프 꽂는 것”
Bond는 “안전한 문 열쇠 따는 것”
둘 다 해야 물 흐른다.

 

전체 흐름 요약

connectGatt()
↓
STATE_CONNECTED + GATT_SUCCESS     ← 파이프 꽂힘
↓
if (needBond) createBond()         ← 문 열쇠 만듦
↓ Bonding
↓
BOND_BONDED                        ← 열쇠 획득
↓
discoverServices()                 ← 안에 뭐 있나 탐색
↓
onServicesDiscovered OK            ← 정식 통신 가능
↓
MTU 협상 / Notify Enable
↓
데이터 Read/Write

 

왜 Bond가 필요한 기기가 있을까?

 

  • Device 정보 보호
  • Notification 활성화를 Bond 이후로 제한
  • 암호화 채널 필요

 

주요 단계별 콜백 & 기대 상태

GATT 연결 onConnectionStateChange status=0, CONNECTED 파이프 꽂힘 Bond 필요 여부 판단
Bond BroadcastReceiver BOND_BONDING → BOND_BONDED 열쇠 따기 discoverServices() 호출
서비스 확인 onServicesDiscovered GATT_SUCCESS 서비스 구조 확인 Notify/MTU 설정 시작
데이터 송수신 onCharacteristicChanged/Write GATT_SUCCESS 성공적 통신 로직 진행

 

 

🛑 Bond 이벤트는 GATT 콜백이 아니다

BluetoothDevice.ACTION_BOND_STATE_CHANGED

(Application 레벨에서 등록 추천)

 

Best 코드 흐름

1. GATT 연결

gatt = device.connectGatt(context, false, callback)

2. 연결 성공 시 Bond 여부 확인

if (device.bondState != BluetoothDevice.BOND_BONDED) {
    device.createBond()
} else {
    gatt.discoverServices()
}

3. Bond 완료 시점에서 서비스 탐색

if(prev == BOND_BONDING && now == BOND_BONDED) {
    gatt.discoverServices()
}

4. Service Discovery 성공 후 설정

 

  • MTU
  • Notification/Indication
  • Write Queue 시작

 

💣💣💣주의할 점

Bonding 중 discoverServices() 호출 status 133 확률 99%
Bond 필요 기기를 Bond 없이 write 시도 Write fail/No callback
BroadcastReceiver Activity에서만 등록 Pairing dialog 뜨면서 Activity pause → 이벤트 놓침
connect → 바로 write Characteristic 아직 못 찾음
Service Discovery 실패 후 재시도 무한 루프 자살 버튼

 

 

✅ 전체 시나리오 정리

 

 

 

BLE 연결에서
Connected는 시작일 뿐
Bond가 완료되어야 비로소 “승인된 통신”이 가능하고
Service Discovery 이후에만 데이터를 보낼 수 있다.
이 순서를 지키는 것이 Android BLE 성공 핵심이다.

 

반응형

댓글