[안드로이드 / Kotlin] 저전력 블루투스 BLE(2), 스캔

2022. 2. 28. 09:56·Android
반응형

지난 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 을 매개변수로 스캔 결과의 콜백으로 받습니다.

 

* 스캔 구현 시 유의사항

  1.  원하는 기기를 찾았다면 곧바로 스캔 중단하기!
    -> 스캔을 통해 기기에서는 많은 리소스를 먹고있기 때문에 원하는 결과를 얻었다면 바로 종료해야합니다.
  2.  반복 스캔을 하지 말아야하며 스캔에 제한 시간을 설정하기!
    -> 이전에 사용 가능했던 기기가 범위 밖으로 이동했을 가능성이 있고, 계속 스캔을 할 경우 배터리 소모가 크기 때문입니다.

<예제 코드>

... // 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
'Android' 카테고리의 다른 글
  • [안드로이드 / Kotlin] 저전력 블루투스 BLE(3), 기기 연결
  • [안드로이드 / Kotlin] 화면 전환 시 작업 처리, 구성 변경 처리(onConfigurationChanged)
  • [안드로이드 / Kotlin] 저전력 블루투스 BLE(1), BLE란?
  • [안드로이드 / Kotlin] 진동
서주냥
서주냥
간단한 것도 기록하는 습관을 가지자
  • 서주냥
    DroidLog
    서주냥
  • 전체
    오늘
    어제
    • 전체보기 (58)
      • 알고리즘 (12)
        • 백준 (4)
        • 프로그래머스 (5)
        • 개념 (3)
      • Android (43)
        • Compose (1)
      • Java (2)
      • Kotlin (1)
  • 링크

    • GitHub
  • 인기 글

  • 태그

    자바
    이진 탐색
    안드로이드
    Coroutine
    SnackBar
    RecyclerView
    FusedLocationProviderClient
    moshi
    블루투스
    백준
    코루틴
    debounce
    클린 아키텍처
    뷰모델
    textunit
    BLE
    프로그래머스
    투 포인터
    최단 경로
    Clean Architecture
    Coroutine Flow
    viewpager2
    viewmodel
    코틀린
    ConstraintLayout
    Hilt
    다이나믹 프로그래밍
    알고리즘
    reified
    벨만 포드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
서주냥
[안드로이드 / Kotlin] 저전력 블루투스 BLE(2), 스캔

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.