Bluetooth LE Example 이해하기
안드로이드 BLE 기본 샘플
https://developer.android.com/samples/BluetoothLeGatt/index.html
1. scanning
2. connect to GATT server
3. Attempting to start service discovery
4. BluetoothLeService.java에서 만약
Bluetooth service가 discovered되면 sendBroadcast(ACTION_GATT_SERVICES_DISCOVERED)를 실행한다
DeviceControlActivity.java의BroadcastReceiver에서 이것의
callback 메세지를 받는다. displayGattServices(mBluetoothLeService.getSupportedGattServices())라는
말은 연결된 블루투스 기기의 제공해주는 서비스들의 정보를 받아와서 UI로 보여준다는 뜻이다.
5. 검색된 characteristic
중 하나를 클릭하면
READ, NOTIFY 에 따라 함수를 호출한다
if(( charaProp | characteristic.getProperties().PROPERTY_READ) >0)
BluetoothLeService의 readCharacteristic(characteristic)을
호출한다
if(( charaProp | characteristic.getProperties().PROPERTY_NOTIFY) >0)
BluetoothLeService의 setCharacteristicNotification(characteristic,
true)를 호출한다
6. readCharacteristic에서는 Bluetooth
Adapter 유무를 확인한 뒤
다시한번 BluetoothGatt의 readCharacteristic(characteristic)을
호출한다
onCharacteristicRead가 callback으로 받아준다. 여기에서 ACTION_DATA_AVAILABLE을 action으로하고 characteristic를 담아서broadcastUpdate를 호출한다
7. broadcastUpdate에서 목표로 하는 UUID가
맞는지 확인한다
별다른 설정이 없다면 else로 빠져서 HEX로
자료를 표시해주게 된다
EXTRA_DATA라는 이름으로 HEX를 intent에
담아준다
sendBroadcast로 intent를 전송한다
8. 전송된 intent를
DeviceControlActivity의 broadcastReceiver가
받아준다
action이 어떤 것과 일치하는지 확인한다 ACTION_DATA_AVAILABLE을 action으로 받았기 때문에 dispalyData(intent.getStringEXtra(BluetoothLeService.EXTRA_DATA))를
호출하게 된다. intent에서 EXTRA_DATA에 해당하는
변수를 가져온다는 뜻이다. displayData는 TextView에
설정되어 화면에 나타난다.
9. setCharacteristicNotification에서는 readCharacteristic과 동일하게 Bluetooth 어뎁터가 정상적인지 확인하는 과정을 거치고 BluetoothGatt에 setCharacteristicNotification(characteristic, enabled)로 정보를 설정해준다.
10. 넘어온
characteristic의 UUID가 심박동 체크에 쓰이는 UUID 인 경우
descriptor를 설정하고 writeDescriptor를 호출한다
예제코드에서는 심박동 체크에 대해서만 정보를 송신하기 때문에 이부분을 바꾸어주면 데이터를 전송할 수 있다
11. 아직 이유는 알 수 없지만 APP에서 정보를 읽을 때는 characteristic에서 getValue해서 그것을 HEX로 바꾸어 읽는다. 아마 getValue가 descriptor를 읽어오는 과정으로 보인다
12. 그리고 정보를 보낼 때는 descriptor를 만들어서 그곳에 내용을 설정하고 characteristic에 올려서 전송한다