Notice
Recent Posts
Recent Comments
Link
투케이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
// --------------------------------------------------------------------------------------
반응형
'Android' 카테고리의 다른 글
Comments