개발/안드로이드-kotlin

[android/kotlin] Ble5.0 extension advertising 을 스캔하기

어중E 2022. 11. 26. 16:57

[android/kotlin] Ble5.0 extension advertising을 스캔하기

ESP나 nRF 칩으로 블루투스 기기를 만들면 간혹 블루투스 5.0 확장 advertising을 스캔해야 될 때가 있습니다.

 

구글 공식 문서에 따라서 코드를 작성하면, 일반적인 advertisimng 패킷을 스캔할 때에는 아래와 같이 작성하면 정상적으로 작동합니다. advertising 하는 기기를 찾을 수 있죠.

var bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()

var scanBLEBtn: Button = findViewById(R.id.BLE_Scan_Btn)
scanBLEBtn.setOnClickListener {
    //20초 뒤에 스캔을 stop
    Handler(Looper.getMainLooper()).postDelayed({
        bluetoothAdapter?.bluetoothLeScanner?.stopScan(leScanCallback)
    }, 20000)
	
    //스캔 시작
    bluetoothAdapter?.bluetoothLeScanner?.startScan(leScanCallback)
    textBLS?.text = "블루투스 BLE 찾는 중"
}

 

하지만 위의 방법으로는 블루투스 5.0 확장 advertising(extension advertising) 패킷은 스캔하지 않습니다.

 

var scanBLEBtn: Button = findViewById(R.id.BLE_Scan_Btn)
val filters: MutableList<ScanFilter> = ArrayList()
val scanFilter: ScanFilter = ScanFilter.Builder()
    .build()
filters.add(scanFilter)
val settings = ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
    .setLegacy(false) // 이 부분이 ble 5.0 ext adv 를 스캔 가능하게함
    .build()
scanBLEBtn.setOnClickListener {
    Handler(Looper.getMainLooper()).postDelayed({
        bluetoothAdapter?.bluetoothLeScanner?.stopScan(leScanCallback)
    }, 20000)

    bluetoothAdapter?.bluetoothLeScanner?.startScan(filters, settings, leScanCallback)
    textBLS?.text = "블루투스 BLE 찾는 중"
}

 

스캔을 하기 위해서는 public void startScan (List<ScanFilter> filters, ScanSettings settings, ScanCallback callback)을 사용해야 합니다.

 

filter를 만들고, settings에서 setLegacy라는 함수를 이용하여야 합니다. 매개변수로 false를 전달하고 이 settings를 startScan의 매개변수로 넣으면, 우리가 원하는 extension advertising 패킷을 스캔할 수 있습니다.