Как увеличить период сканирования BLE-устройств в Android?

Я пытался реализовать программу сканирования маяков, и я хочу, чтобы службы Android BLE вели себя аналогично методу iOS «didRangeBeacons», т. Е. Он должен вызываться каждую секунду. Но в андроиде такого метода нет. Но в Android есть метод «leScanCallback», который очень часто вызывается с периодом сканирования менее секунды. Итак, есть ли способ, которым я могу реализовать свою функциональность в методе leScanCallback и увеличить интервал периода сканирования до 1 секунды, чтобы он вел себя аналогично методу iOS «didRangeBeacons».

* Также будет ли плохо программировать постоянное сканирование маяка и увеличение интервала его сканирования в Android?

заранее спасибо


person HeadOnn    schedule 12.06.2014    source источник


Ответы (1)


Важно понимать, что в Android нет встроенной поддержки iBeacon. Метод Android leScanCallback совсем не эквивалентен методу iOS didRangeBeacons.

Метод leScanCallback просто дает вам обратный вызов каждый раз, когда виден рекламный пакет от Bluetooth-устройства (устройства с битом соединения, установленным в объявлении, получают обратный вызов только при первом обнаружении их Mac-адреса, пока вы не остановите и не перезапустите сканирование). Если вы не остановите и не перезапустите сканирование по таймеру, периода сканирования не будет, и вы будете получать обратные вызовы по мере поступления пакетов. Это может быть много раз в секунду.

При написании библиотеки iBeacon для Android с открытым исходным кодом мне пришлось создать всю функциональность с нуля, чтобы сделать didRangeBeaconsInRegion обратный вызов, который был эквивалент того, что есть в iOS. Для этого библиотека останавливает и перезапускает сканирование примерно раз в секунду и буферизует список всех видимых iBeacons в цикле, вызывая обратный вызов только со списком видимых iBeacons в конце цикла. Есть много других сложностей, которые здесь не обсуждаются.

Код предоставляется бесплатно для просмотра и изменения, поэтому я рекомендую вам сделать это, если вы хотите своя.

person davidgyoung    schedule 12.06.2014
comment
Спасибо, Дэвид. Я просматривал код, написанный вами. Это действительно хорошая работа. И теперь я понял логику сканирования. :) - person HeadOnn; 12.06.2014
comment
Если мы хотим сканировать только тогда, когда приложение находится на переднем плане, а не в фоновом режиме. Что будет лучше? Непрерывное сканирование или сканирование с интервалом (скажем, 1 секунда) - person Raj Trivedi; 09.06.2015
comment
Вы должны сканировать с интервалом. Многие устройства Android имеют аппаратный уровень Bluetooth, который обеспечивает только один обратный вызов обнаружения для каждого обнаруженного аппаратного устройства за сканирование. Остановка и перезапуск необходимы для получения второго обратного вызова для того же аппаратного устройства. - person davidgyoung; 09.06.2015
comment
Если мы не сканируем в фоновом режиме, должны ли мы использовать BluetoothCrashResolver? Как говорится в библиотеке, это редко для большинства пользователей, но может быть проблематичным для тех, у кого приложения сканируют устройства Bluetooth LE в фоновом режиме. - person Raj Trivedi; 10.06.2015
comment
Такие же сбои случаются только с приложениями на переднем плане, да, они просто реже. - person davidgyoung; 10.06.2015
comment
@davidgyoung Можно ли как-то увеличить этот интервал? - person Eugen Sunic; 04.03.2016
comment
Да, библиотека Android Beacon Library позволяет настраивать интервал сканирования с помощью beaconManager.setForgroundScanPeriod(...) и beaconManager.setBackgroundScanPeriod(...). Однако, если вы уменьшите этот интервал до 1,1 секунды по умолчанию, вероятность того, что вы пропустите обнаружение, увеличится, поскольку увеличится вероятность остановки и перезапуск сканирования в середине получения пакета маяка, из-за чего получатель пропустит его. - person davidgyoung; 04.03.2016
comment
@davidgyoung Если мы остановим и перезапустим сканирование по таймеру, так как периода сканирования нет, есть ли вероятность, что мы пропустим какую-либо рекламу BLE ?? или эта остановка и перезагрузка произойдет немедленно? Пожалуйста, дай мне знать - person KK_07k11A0585; 26.07.2017
comment
В каждом обратном вызове будет преднамеренная задержка в 1 секунду из-за остановки и перезапуска службы. Таким образом, если какая-либо реклама выполняется, скажем, за 100 мс, вы, скорее всего, найдете рекламу за 1000 мс. Я надеюсь, что в этом есть смысл. - person HeadOnn; 26.07.2017
comment
Всякий раз, когда сканирование выключено, вы можете пропустить пакеты Bluetooth, да. Лучшая стратегия — поддерживать интервал сканирования как минимум равным рекламной скорости вашего маяка. - person davidgyoung; 26.07.2017