지난 1편에서는 BLE의 기본개념 및 사용에 있어 준비해야할 몇 가지에 대해 알아보았습니다.
오늘은 안드로이드 내 블루투스 사용에 있어 저전력 블루투스(BLE)를 이용하여 다른 BLE기기를 찾는 스캔방법에 대해 정리해보았습니다.
BLE 1편 : https://sjunh812.tistory.com/26
[안드로이드 / Kotlin] 저전력 블루투스 BLE(1), BLE란?
오늘은 안드로이드 내 블루투스 사용에 있어 저전력 블루투스(BLE)의 기본 개념 및 주요 용어, 사용에 있어 준비해야할 것들에 대해 정리해보았습니다. 저전력 블루투스(BLE)는 기존 블루투스와
sjunh812.tistory.com
블루투스 설정
1편에서 저전력 블루투스가 기기에 지원되는지 여부를 파악했다면 다음으로는 사용기기에 블루투스가 활성화 되어있는지 확인해야합니다. 이는 BluetoothAdapter 를 사용해서 확인 가능합니다. 간단한 예제코드는 아래와 같습니다.
<BluetoothAdapter 가져오기>
private val bluetoothAdapter: BluetoothAdapter? by lazy(LazyThreadSafetyMode.NONE) {
val bluetoothManger = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManger
bluetoothManger.adapter
}
<블루투스 활성화>
private val BluetoothAdapter.isDisabled: Boolean
get() = !isEnabled
...
bluetoothAdapter?.takeIf { it.isDisabled }?.apply {
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
enableBtIntent.launch(enableBtIntent)
}
스캔
다른 BLE 기기를 스캔하기위해 BluetoothAdapter 의 startLeScan() 메소드를 사용합니다. 하지만 이번 예제에서는 BluetoothLeScanner 를 이용한 스캔 방법에 대해 소개하도록 하겠습니다. 스캐너를 이용하면 startScan() 메소드를 이용해 스캔할 수 있습니다. startLeScan() 메소드의 매개변수로 BluetoothAdapter.LeScanCallback 을 받아 스캔결과를 콜백 받는 것과 비슷하게 ScanCallback 을 매개변수로 스캔 결과의 콜백으로 받습니다.
* 스캔 구현 시 유의사항
- 원하는 기기를 찾았다면 곧바로 스캔 중단하기!
-> 스캔을 통해 기기에서는 많은 리소스를 먹고있기 때문에 원하는 결과를 얻었다면 바로 종료해야합니다. - 반복 스캔을 하지 말아야하며 스캔에 제한 시간을 설정하기!
-> 이전에 사용 가능했던 기기가 범위 밖으로 이동했을 가능성이 있고, 계속 스캔을 할 경우 배터리 소모가 크기 때문입니다.
<예제 코드>
... // BluetoothAdapter 초기화 및 블루투스 활성화 여부파악
private mBleScanner: BluetoothScanner? = bluetoothAdapter?.bluetoothLeScanner // 스캐너
private const val SCAN_PERIOD: Long = 10000 // 스캔주기
private var mScanning: Boolean = false // 스캔여부
private val handler: Hanlder // 딜레이를 위한 핸들러 -> 코루틴 대체가능
...
/**
* 스캔
* @param enable // 블루투스 활성화 여부
*/
private fun scanLeDevice(enable: Boolean) {
when(enable) {
true -> {
handler.postDelayed({
mScanning = false
mBleScanner?.stopScan(callback)
}, SCAN_PERIOD)
mScanning = true
// 스캔 필터링(사용시)
val filters: Arraylist<ScanFilter> = arrayListOf()
// filters.add(ScanFilter.Builder().setDeviceName("deviceName").build())
// filters.add(ScanFilter.Builder().setSeviceUuid(ParcelUuid(uuid)).build())
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
// .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH)
.setReportDelay(0)
.build()
mBleScanner?.startScan(callback)
// mBleScanner?.startScan(filters, settings, callback)
}
else -> {
mScanning = false
mBleScanner?.stopScan(callback)
}
}
}
* 스캔시 필터링을 이용해 원하는 기기만 스캔하고 싶은 경우가 있습니다. 위의 예제는 filters 를 이용해 필터링을 구현하고 있습니다. 필터링은 보통 고유값인 UUID, MAC, 디바이스명 등으로 합니다.
<ScanCallback 구현>
/**
* ScanCallback
*/
override fun onScanFailed(errorCode: Int) {
// 스캔실패
super.onScanFailed(errorCode)
...
}
override fun onScanResult(callbackType: Int, result: ScanResult?) {
// 스캔결과(성공)
super.onScanResult(callbackType, result)
...
}
override fun onBatchScanResults(results: MutableList<ScanResult>?) {
// ScanSettings에서 SCAN_MODE_LOW_POWER 옵션을 주는 경우
// 스캔후 일정시간 뒤에 결과값을 묶어서 전달..
super.onBatchScanResults(results)
...
}
오늘은 간단하게 BLE를 이용해 다른 기기를 스캔하는 방법에 대해 알아보았습니다.
다음에는 스캔한 BLE 기기와 연결하는 방법에 대해 소개하도록 하겠습니다.
부족한 글 봐주셔서 감사합니다:)
참고 : https://developer.android.com/guide/topics/connectivity/bluetooth-le?hl=ko#find
저전력 블루투스 개요 | Android 개발자 | Android Developers
저전력 블루투스 개요 Android 4.3(API 레벨 18)에서는 저전력 블루투스(BLE)에 대한 플랫폼 내 지원을 핵심적 역할로 도입하고 앱이 기기를 검색하고, 서비스를 쿼리하고, 정보를 전송하는 데 사용할
developer.android.com
'Android' 카테고리의 다른 글
[안드로이드 / Kotlin] 저전력 블루투스 BLE(3), 기기 연결 (0) | 2022.03.15 |
---|---|
[안드로이드 / Kotlin] 화면 전환 시 작업 처리, 구성 변경 처리(onConfigurationChanged) (0) | 2022.03.06 |
[안드로이드 / Kotlin] 저전력 블루투스 BLE(1), BLE란? (0) | 2022.02.27 |
[안드로이드 / Kotlin] 진동 (0) | 2022.02.13 |
[안드로이드 / Kotlin] RecyclerView에 대한 고찰 (0) | 2022.01.22 |