Я работаю над сканером RSSI для Android. Я хочу архивировать это с помощью постоянного сканирования устройств BLE. Таким образом, если нужно определить RSSI устройства, оно должно рекламироваться через BLE. Измерительное устройство начинает сканирование с очень короткими интервалами, и, как только он находит рекламодателя, RSSI может быть прочитан в результате сканирования. Это приводит к следующему коду на стороне рекламодателя:
fun beginAdvertise() {
val advertiser = BluetoothAdapter.getDefaultAdapter().bluetoothLeAdvertiser
val settings = AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
.setConnectable(false)
.build()
val data = AdvertiseData.Builder()
.setIncludeDeviceName(true)
.build()
val advertisingCallback = object : AdvertiseCallback() {
override fun onStartFailure(errorCode: Int) {
Log.e("BLE", "Advertising onStartFailure: " + errorCode);
super.onStartFailure(errorCode)
}
}
advertiser.startAdvertising(settings, data, advertisingCallback);
}
Функция для сканирующего устройства вызывается каждые 20 мс (я пробовал гораздо более длительные задержки) и выглядит следующим образом:
private val onBluetoothLeDeviceFound = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult?) {
result?.let {...}}
fun startScan() {
val scanner = mBluetoothAdapter?.bluetoothLeScanner
val scanSetting =
ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE).build()
scanner?.startScan(
null,
scanSetting,
onBluetoothLeDeviceFound
)
}
Этот код отлично работает на моих устройствах Pixel 2. Но если я попробую его на устройствах Pixel 1 (одно на Android 9, другое на Android 10), обратный вызов onBluetoothLeDeviceFound не будет вызван. У меня есть эти разрешения:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCTION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
Я действительно не знаю, что мне следует попробовать дальше. Спасибо за вашу помощь!