투케이2K

918. (Android/Java) [간단 소스] ScanCallback 간단 설명 및 사용 옵션 정리 - Bluetooth LE 스캔 콜백 본문

Android

918. (Android/Java) [간단 소스] ScanCallback 간단 설명 및 사용 옵션 정리 - Bluetooth LE 스캔 콜백

투케이2K 2024. 12. 24. 17:12

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[설명 정리]

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

- 언어 : Java / Kotlin


- 개발 툴 : AndroidStudio


- 기술 구분 : ScanCallback / Bluetooth LE 스캔 콜백

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






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

1. ScanCallback 은 블루투스 기능 사용에서 Bluetooth LE 스캔 리스트를 콜백 받을 수 있는 객체입니다.


2. ScanCallback 은 Android Api Level 21 (안드로이드 5.0 / LOLLIPOP) 에서 부터 사용할 수 있습니다.


3. ScanCallback 관련 상수 : 

  >> SCAN_FAILED_ALREADY_STARTED : 앱에서 이미 동일한 설정으로 BLE 스캔이 시작되어 스캔을 시작할 수 없습니다.

  >> SCAN_FAILED_APPLICATION_REGISTRATION_FAILED : 앱을 등록할 수 없어 스캔을 시작할 수 없습니다.

  >> SCAN_FAILED_FEATURE_UNSUPPORTED : 이 기능이 지원되지 않으므로 전원 최적화 검사를 시작할 수 없습니다.

  >> SCAN_FAILED_INTERNAL_ERROR : 내부 오류로 인해 스캔을 시작하지 못했습니다.

  >> SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES : 하드웨어 리소스가 부족하여 스캔을 시작할 수 없습니다.

  >> SCAN_FAILED_SCANNING_TOO_FREQUENTLY : 응용 프로그램이 너무 자주 스캔을 시도하여 스캔을 시작하는 데 실패했습니다.


4. ScanCallback 관련 함수 : 

  >> onBatchScanResults(List<ScanResult> results) : 일괄 처리 결과가 전달될 때 콜백합니다.

  >> onScanFailed(int errorCode) : 스캔을 시작할 수 없을 때 콜백합니다. (errorCode)
    - SCAN_FAILED_ALREADY_STARTED
    - SCAN_FAILED_APPLICATION_REGISTRATION_FAILED
    - SCAN_FAILED_INTERNAL_ERROR
    - SCAN_FAILED_FEATURE_UNSUPPORTED
    - SCAN_FAILED_OUT_OF_HARDWARE_RESOURCES 또는 SCAN_FAILED_SCANNING_TOO_FREQUENTLY

  >> onScanResult(int callbackType, ScanResult result) : BLE 광고가 발견되면 콜백합니다.


5. ScanCallback 사용 예시 소스 코드 : 

    // TODO [블루투스 신호 활성 이름 설정] : name = String Type
    ble_advertising_Adapter.setName(name);


    // TODO [블루투스 신호 활성 UUID 데이터 및 옵션 설정] : uuid = String Type
    ParcelUuid pUuid = new ParcelUuid(UUID.fromString(uuid));

    AdvertiseData ad_data = new AdvertiseData.Builder()
            .setIncludeTxPowerLevel(true) // [Tx Power 포함]
            .addServiceUuid(pUuid) // [서비스 UUID 설정]
            //.addServiceData(pUuid, "Data".getBytes(StandardCharsets.UTF_8)) // [서비스 DATA 설정]
            .build();


    // TODO [블루투스 신호 활성 정보 설정]
    AdvertiseSettings ad_settings = new AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY) // [낮은 대기 시간, 높은 전력 모드에서 Bluetooth LE 광고를 수행]
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH) // [높은 TX 전력 수준을 사용하여 광고]
            .setConnectable(true) // [블루투스 연결 설정]
            .setTimeout(BLE_ADVERTISING_TIME_OUT * 1000) // [신호 활성 시간]
            .build();


    // TODO [블루투스 스캔 시 표시 되는 이름 표시 여부 설정]
    AdvertiseData sc_data = new AdvertiseData.Builder()
            .setIncludeDeviceName(true) // [기기 이름 포함]
            .build();


    // TODO [블루투스 신호 활성 콜백 응답 리스너 선언]
    AdvertiseCallback advertiseCallback = new AdvertiseCallback() {
        @Override
        public void onStartSuccess(AdvertiseSettings settingsInEffect) {
            super.onStartSuccess(settingsInEffect);

            // [블루투스 정상 신호 활성 로그]
            ble_advertising_LOG = "[Success] : Bluetooth Advertising onStartSuccess";

            S_Log._W_(ACTIVITY_NAME + " :: observableBluetoothAdvertising :: 블루투스 실시간 신호 활성 수행", new String[]{
                    "M_LOG :: " + String.valueOf(ble_advertising_LOG),
                    "NAME :: " + String.valueOf(name),
                    "UUID :: " + String.valueOf(uuid)
            });

        }

        @Override
        public void onStartFailure(int errorCode) {
            super.onStartFailure(errorCode);

            String errorMessage = String.valueOf(errorCode);
            switch (errorCode) {
                case AdvertiseCallback.ADVERTISE_FAILED_ALREADY_STARTED:
                    errorMessage += " / " + "ADVERTISE_FAILED_ALREADY_STARTED";
                    break;
                case AdvertiseCallback.ADVERTISE_FAILED_DATA_TOO_LARGE:
                    errorMessage += " / " + "ADVERTISE_FAILED_DATA_TOO_LARGE";
                    break;
                case AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED:
                    errorMessage += " / " + "ADVERTISE_FAILED_FEATURE_UNSUPPORTED";
                    break;
                case AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR:
                    errorMessage += " / " + "ADVERTISE_FAILED_INTERNAL_ERROR";
                    break;
                case AdvertiseCallback.ADVERTISE_FAILED_TOO_MANY_ADVERTISERS:
                    errorMessage += " / " + "ADVERTISE_FAILED_TOO_MANY_ADVERTISERS";
                    break;
            }

            // [블루투스가 신호 활성 에러 발생]
            ble_advertising_LOG = "[Error] : Bluetooth Advertising onStartFailure (" + String.valueOf(errorMessage) + ")";

            S_Log._E_(ACTIVITY_NAME + " :: observableBluetoothAdvertising :: 에러 발생", new String[]{
                    "M_LOG :: " + String.valueOf(ble_advertising_LOG),
                    "NAME :: " + String.valueOf(name),
                    "UUID :: " + String.valueOf(uuid)
            });

        }
    };


    // TODO [블루투스 신호 활성 시작] : [콜백 리스너 지정]
    ble_Advertiser.startAdvertising(ad_settings, ad_data, sc_data, advertiseCallback);

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






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

https://developer.android.com/reference/android/bluetooth/le/ScanCallback

https://blog.naver.com/kkh0977/222341695003?trackingCode=blog_bloghome_searchlist

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