Нам нужно широковещательное событие, которое пробуждает наше приложение, когда BLE-устройство с определенным Service-UUID оказывается в пределах досягаемости.
Вы, вероятно, знаете, как фильтровать результаты сканирования по сервисному UUID, поэтому я не буду вдаваться в подробности. Про пробуждение: если ваше приложение сканирует, оно бодрствует по определению. Он может быть или не быть на переднем плане, но он бодрствует.
Возможно, теперь доступен лучший BLE API, чем 2 года назад.
Начиная с SDK версии 21, появился новый API, который можно использовать для сканирования BLE. Насколько мне известно, единственная разница заключается в том, как вы получаете доступ к API, и основные функции (относительно энергопотребления и т. д.) не изменились.
О сканировании:
Действительно, при сканировании расходуется много заряда батареи. Об этом говорится даже в документах.
Хотя интенсивность относительная. Это интенсивно по сравнению с полным отсутствием сканирования, но оно недостаточно интенсивно, чтобы безнадежно разрядить аккумулятор. В конце концов, это называется с низким энергопотреблением.
Другой ответ предлагает отслеживать геозоны и сканировать только тогда, когда вы знаете, что находитесь в зоне действия устройств BLE. Несмотря на то, что это снизит расход заряда батареи ble scan, ему понадобится заряд батареи для GPS, иначе он не сможет отслеживать геозоны (ну, может, с данными сотовой связи/Wi-Fi, но тогда это будет не так точно).
В зависимости от того, насколько критично ваше сканирование по времени (например, если поблизости есть устройство, должны ли вы знать его сразу же? или можно с задержкой на пару секунд?) вы можете сделать паузу между сканированиями.
Скажем, вы сканируете в течение 5 секунд, делаете паузу на 5 секунд, снова сканируете в течение 5 секунд. Таким образом, вы будете сканировать почти все время, но при этом потреблять примерно половину заряда батареи. Эти интервалы можно настроить в соответствии с вашей ситуацией. Возможно, вас устраивает сканирование в течение 3 секунд и пауза в 10. (обратите внимание, что максимальное время между трансляциями устройства составляет 10,24 секунды).
У меня есть приложение с примерно 50 пользователями, которое сканирует с такими паузами (сканирование в течение 3 секунд, пауза в 3, повтор) 24/7 в фоновом режиме, и я не получил никаких жалоб на чрезмерное использование батареи.
person
Tim
schedule
14.04.2016