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 성공 핵심이다.
반응형
'Android' 카테고리의 다른 글
| 2025.11 Android gradle 빌드 최신 버전 (0) | 2025.11.05 |
|---|---|
| Android Compose TextField 천 단위 콤마로 표현하기 (0) | 2024.10.24 |
| Android ANR / Canvas / 메모리 초과 해결방법 (0) | 2024.08.28 |
| Android Coroutine example 코루틴 권장사항 (0) | 2024.07.04 |
| Compose Box Basic Style (0) | 2024.06.03 |
댓글