Я пишу приложение, которое сканирует маяки Bluetooth, когда оно находится на переднем плане и на заднем плане. У меня есть часть переднего плана, но я не знаю, что делать с фоновой частью, особенно в Android 8.0 и выше, где система не позволяет приложению работать дольше, чем 15 минут в фоновом режиме.
Приложение должно сканировать маяки и получать их MAC-адреса и UUID. Кроме того, он должен получить ответ на сканирование, потому что там есть некоторая информация, которую мне нужно декодировать и сохранить. Я использовал руководство здесь для осуществления сканирования переднего плана с использованием BluetoothLeScanner. Что касается фона, я попытался изменить режим сканирования на LOW_POWER, но ОС убивает приложение примерно через 15 минут. Обратите внимание, что мне не нужна служба переднего плана с постоянным уведомлением, и я в порядке, когда сканирование выполняется только с интервалом ~ 15 минут.
Многие предлагали библиотеку маяков Android, но я не смог найти требуемый beaconLayout для типа используемых маяков, Kontakt Beacon Pro BP16-3, и поэтому библиотека маяков не обнаруживает их.
Информация, которую мне нужно получить от маяков, включает уникальный идентификатор и процент заряда батареи. См. [Здесь] (https://support.kontakt.io/hc/en-gb/articles/206294004-How-to-check-the-battery-level-on-your-beacons) для получения подробной информации о том, где они находятся в ответе на сканирование.
Буду признателен за любую помощь в написании кода для поиска маяков в фоновом режиме, который будет работать на любой версии Android от 6.0 и выше, или помощь в использовании библиотеки маяков с маяком, о котором я упоминал выше.
РЕДАКТИРОВАТЬ: уникальный идентификатор и Bluetooth из ответа на сканирование
Когда я использую BLEScanner для сканирования маяков, я могу использовать ScanResult :: getScanRecord (), чтобы получить объект scanRecord. Затем я использую метод getServiceData () для получения байтового массива, первые 4 байта которого представляют уникальный идентификатор в ASCII, следующие два байта - это версия прошивки в ASCII, и, наконец, последний байт - это процент заряда батареи в шестнадцатеричном формате. Я даже подтвердил уровень заряда батареи в официальном приложении Kontakt, и я уверен, что он правильный.
Когда я использовал библиотеку маяков, я не мог найти простой способ получить проанализированную версию ответа на сканирование. Вместо этого я должен использовать NonBeaconLeScanCallback, чтобы получить массив байтов. Тогда массив байтов оказывается
[2, 1, 6, 26, -1, 76, 0, 2, 21, -9, -126, 109, -90, 79, -94, 78, -104, -128, 36, -68, 91, 113, -32, -119, 62, -91, 68, 124, 56, -77, 8, 9, 75, 111, 110, 116, 97, 107, 116, 2, 10, -12, 10, 22, 13, -48, 68, 106, 69, 77, 52, 50, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0].
Кажется, что байты из индекса 46-49 указывают уникальный идентификатор в ASCII, в данном случае "DjEM". Кроме того, байт в индексе 52 - это процент батареи в десятичном формате; В данном случае это 68.
Кажется, что с помощью сканера BLE я могу сэкономить много головной боли с точки зрения анализа уникального идентификатора и батареи. Однако было бы гораздо сложнее надежно реализовать фоновое сканирование. Следовательно, есть ли способ объединить лучшее из двух и получить библиотеку бекона для анализа уникального идентификатора и процента заряда батареи?
EDIT2: сообщение библиотеки маяков, когда не распознается мой маяк
Библиотека маяков по-прежнему не может обнаружить мой маяк, хотя я использую схемы маяков iBeacon и EddyStone. Это печатает ниже в logcat:
processing pdu type 16: 0201060d166afe0206010a64f456425a4d08094b6f6e74616b74000000000000000000000000000000000000000000000000000000000000000000000000 with startIndex: 5, endIndex: 16
This is not a matching Beacon advertisement. (Was expecting 02 15. The bytes I see are: 0201060d166afe0206010a64f456425a4d08094b6f6e74616b74000000000000000000000000000000000000000000000000000000000000000000000000
Ignoring pdu type 01
Заранее спасибо.