투케이2K

925. (Android/Java) [개념 정리] BluetoothGattCallback 블루투스 GATT 콜백 리스너 개념 정리 본문

Android

925. (Android/Java) [개념 정리] BluetoothGattCallback 블루투스 GATT 콜백 리스너 개념 정리

투케이2K 2025. 1. 1. 10:47

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[설명 정리]

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java / Kotlin

- 개발 툴 : AndroidStudio

- 기술 구분 : Bluetooth / BluetoothGattCallback

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[설명 정리]
// --------------------------------------------------------------------------------------

1. BluetoothGattCallback 은 API level 18 에서 추가 되었으며, 블루투스 GATT 연결 수행에 관한 콜백 응답을 확인할 때 사용 되는 추상 클래스 입니다.


2. BluetoothGattCallback 주요 메소드 정리 : 

  >> onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, byte[] value) : 원격 특성 알림의 결과로 콜백이 트리거되었습니다.
  >> onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, byte[] value, int status) : 특성 읽기 작업의 결과를 보고하는 콜백입니다.
  >> onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) : 특성 쓰기 작업의 결과를 나타내는 콜백입니다.
  >> onConnectionStateChange(BluetoothGatt gatt, int status, int newState) : GATT 클라이언트가 원격 GATT 서버에 연결되거나 연결 해제되는 시점을 나타내는 콜백입니다.
  >> onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status, byte[] value) : 설명자 읽기 작업의 결과를 보고하는 콜백입니다.
  >> onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) : 설명자 쓰기 작업의 결과를 나타내는 콜백입니다.
  >> onMtuChanged(BluetoothGatt gatt, int mtu, int status) : 주어진 장치 연결에 대한 MTU가 변경되었음을 나타내는 콜백입니다.
  >> onPhyUpdate(BluetoothGatt gatt, int txPhy, int rxPhy, int status) : BluetoothGatt.setPreferredPhyPHY를 변경하는 원격 장치의 결과로 인해 콜백이 트리거됩니다.
  >> onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status) : 원격 장치 연결에 대한 RSSI를 보고하는 콜백입니다.
  >> onReliableWriteCompleted(BluetoothGatt gatt, int status) : 신뢰할 수 있는 쓰기 트랜잭션이 완료되면 호출되는 콜백입니다.
  >> onServiceChanged(BluetoothGatt gatt) : 서비스 변경 이벤트를 나타내는 콜백이 수신되었습니다.
  >> onServicesDiscovered(BluetoothGatt gatt, int status) : 원격 장치의 원격 서비스, 특성 및 설명자 목록이 업데이트되었을 때, 즉 새로운 서비스가 검색되었을 때 호출되는 콜백입니다.


3. BluetoothGattCallback 주의점 : 

  >> 해당 콜백함수는 API 레벨 33에서 >> 34로 넘어가는 과정에 변경 된 사항이 많으니 안드로이드 도큐먼트 문서 참고가 필히 필요합니다.


4. BluetoothGattCallback 예시 소스 코드 : 

  bluetoothGatt = device.connectGatt(mMainCtx, false, new BluetoothGattCallback() {

    // --------------------------------------------------
    // TODO [GATT 클라이언트가 원격 GATT 서버에 연결되거나 연결 해제되는 시점을 나타내는 콜백입니다.]
    // --------------------------------------------------
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        super.onConnectionStateChange(gatt, status, newState);

        S_Log._W_(ACTIVITY_NAME + " :: onConnectionStateChange :: 원격 장치 연결 및 해제 상태 체크 콜백 동작", new String[]{
                "Device Status :: " + String.valueOf(newState)
        });

        if (newState == BluetoothAdapter.STATE_CONNECTED) { // [새로운 장치 연결 됨]
            

        } else if (newState == BluetoothAdapter.STATE_DISCONNECTED) { // [연결 된 장치 해제 됨]
            
        }
    }

    // --------------------------------------------------
    // TODO [원격 장치의 원격 서비스, 특성 및 설명자 목록이 업데이트되었을 때, 즉 새로운 서비스가 검색되었을 때 호출되는 콜백입니다.]
    // --------------------------------------------------
    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        super.onServicesDiscovered(gatt, status);

        if (status == BluetoothGatt.GATT_SUCCESS) {
            

        } else {

        }
    }

    // --------------------------------------------------
    // TODO [특성 읽기 작업의 결과를 보고하는 콜백입니다.]
    // --------------------------------------------------
    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, byte []value, int status) {
        super.onCharacteristicRead(gatt, characteristic, value, status);
        S_Log.w("BLE_Read", "MAC : " + String.valueOf(device.getAddress()) + " / " + "STATUS : " + String.valueOf(status));
    }

    // --------------------------------------------------
    // TODO [원격 특성 알림의 결과로 콜백이 트리거되었습니다.]
    // --------------------------------------------------
    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, byte []value) {
        super.onCharacteristicChanged(gatt, characteristic, value);
        S_Log.w("BLE_Changed", "MAC : " + String.valueOf(device.getAddress()));
    }

    // --------------------------------------------------
    // TODO [특성 쓰기 작업의 결과를 나타내는 콜백입니다.]
    // --------------------------------------------------
    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        super.onCharacteristicWrite(gatt, characteristic, status);
        S_Log.w("BLE_Write", "MAC : " + String.valueOf(device.getAddress()) + " / " + "STATUS : " + String.valueOf(status));
    }
});

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

https://developer.android.com/reference/android/bluetooth/BluetoothGattCallback

// --------------------------------------------------------------------------------------
 
반응형
Comments