[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 패킷을 스캔할 수 있습니다.
'개발 > 안드로이드-kotlin' 카테고리의 다른 글
[android/kotlin] Intent는 무엇인가? (0) | 2022.08.13 |
---|---|
[android/kotlin] RecyclerView이 보이지 않을 때 (0) | 2022.08.06 |