Уведомления о приближении Android BLE

Я работаю над разработкой приложения, которое взаимодействует с устройствами BLE. Все отлично работает, я могу сканировать, подключаться и потреблять услуги.

Я прочитал все документы и не вижу ничего, что давало бы разработчику возможность прослушивать устройства BLE. В основном я хотел бы запускать широковещательный приемник, когда устройства входят в диапазон устройства BLE.

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

Эта функция не поддерживается или я пропустил раздел документации, в котором это обсуждается?


person Bobbake4    schedule 22.07.2014    source источник
comment
У меня сложилось впечатление, что в настоящее время вам нужно придумать свою собственную стратегию сканирования (рассмотреть таймеры, другие триггеры и т. д.), но было бы интересно, если бы вы нашли что-нибудь встроенное.   -  person Chris Stratton    schedule 22.07.2014
comment
Рассматривали ли вы возможность использования уже существующих SDK для работы с BLE на Android? Такие, как те, которые предоставляются Estimote или Radiusnetwork.   -  person Nipun Gupta    schedule 22.07.2014
comment
Как называется библиотека, которую вы сейчас используете для BLE в своем проекте?   -  person maytham-ɯɐɥʇʎɐɯ    schedule 10.04.2016
comment
Мы пока не используем никакие библиотеки и не хотим их использовать, если они просто выполняют сканирование с более разумным временем. (Разве это не то, что они делают?) Думал о чем-то энергоэффективном, обеспечиваемом системой Android. Лучшим сценарием было бы просто добавить UUID службы в AndroidManifest, который запускает BroadcastReceiver, когда устройство с этим UUID службы становится доступным. Если этот подход не сработает, мы разработаем собственный умный тайминг для запуска сканирования, поскольку мы разрабатываем велосипедный датчик скорости и частоты вращения педалей (CSC). Мы могли бы использовать действия пользователей (езда на велосипеде, бег...), предоставляемые сервисами Google Play.   -  person OneWorld    schedule 11.04.2016
comment
Я работал над проектом, в котором используется фоновая служба, которая прослушивает активность ibeacons с интервалом ожидания, время ожидания является ключевым. и я использую библиотеку с прослушивателем маяка, я могу предоставить свое решение, но я также был бы уверен, что то, что я говорю, это то, что вы можете использовать. в конечном итоге вы можете написать мне по электронной почте (найдите мой адрес электронной почты в моем профиле), чтобы я мог ответить быстрее   -  person maytham-ɯɐɥʇʎɐɯ    schedule 12.04.2016


Ответы (4)


Недавно я сделал проект, и из того, что я прочитал в вашем вопросе, он имеет некоторое сходство с тем, что я сделал.

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

Что касается проблемы с батареей, постоянно включенный Bluetooth потребляет много энергии, но в то же время вы не можете обнаружить BLE без включенного Bluetooth.

Я провел два эксперимента, и оба они полезны, но разные, и я не могу сказать, какой из них лучше, но вам нужно протестировать его, чтобы он соответствовал вашим требованиям.

  1. Наличие потока, который включает Bluetooth и прослушивает iBeacon и выключает (с временем ожидания) в то время как программно. Это можно сделать многими способами.

  2. Использование пакета под названием Altbeacon имеет множество полезных функций, одной из таких функций является автоматическое энергосбережение с помощью пример кода:

    public class MyApplication extends Application implements BootstrapNotifier {
        private BackgroundPowerSaver backgroundPowerSaver;
    
        public void onCreate() {
            super.onCreate();
            // Simply constructing this class and holding a reference to it
            // in your custom Application class
            // enables auto battery saving of about 60%
            backgroundPowerSaver = new BackgroundPowerSaver(this);
        }
    }
    

Нам нужно широковещательное событие, которое пробуждает наше приложение, когда BLE-устройство с определенным Service-UUID оказывается в пределах досягаемости. Возможно, теперь доступен лучший BLE API, чем 2 года назад. Самый энергосберегающий и самый точный метод получает вознаграждение.

Другая ваша часть называется запуском действий на определенном расстоянии. Я до сих пор использую Altbeacon для проверки дальности действия маяка и срабатывания. пример кода выглядит примерно так:

@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    for (Beacon beacon : beacons) {
        if (beacon.getDistance() < 5.0) {
            Log.d(TAG, "I see a beacon that is less than 5 meters away.");
            // Perform distance-specific action here
        }
    }
}

Итак, когда это сказано, вы также можете получить расстояние определенного UUID. Я создаю метод на основе Altbeacon, который выглядит так (загляните внутрь цикла for и оператора if):

private void startRangeNotifier() {
    Log.i(TAG, "Starting range notifier...");
    beaconManager.setRangeNotifier(new BeaconRangeListener() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

            if (beacons.size() > 0) {
                for (Beacon beacon : beacons) {
                    Log.d(TAG, "uuid's: " + beacon);
                    Log.d(TAG, "uuid id1: " + beacon.getId1());
                    if (beacon.getId1().toString()
                            .equals("b9407f30-f5f8-466e-aff9-25556b57fe6d")) {
                        Log.d(TAG, "uuid id1 distance: " + beacon.getDistance());
                    }
                }

            }
        }
    });

    try {
        beaconManager.startRangingBeaconsInRegion(
                new Region(BEACON_MONITORING_ID, null, null, null));
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

Мой вывод журнала:

D/Main activity:: uuid's: id1: b9407f30-f5f8-466e-aff9-25556b57fe6d id2: 31807 id3: 59251
D/Main activity:: uuid id1: b9407f30-f5f8-466e-aff9-25556b57fe6d
D/Main activity:: uuid id1 distance: 0.2108658568686884

В своем ответе я хотел представить концепцию, которую использовал, проект Beacons в целом требует терпения. Как упоминалось в другом ответе, здесь также можно комбинировать решение с Geofences и ActivityRecognition.

Примечание. Поскольку по своей природе маяк Bluetooth, расстояние является близким, а не абсолютным, и иногда даже маяк Bluetooth составляет 1 метр, так как он может показывать 2 метра или 0,5 метра, так что имейте это в виду.

Ссылка на ссылку:

person maytham-ɯɐɥʇʎɐɯ    schedule 14.04.2016
comment
Спасибо за указание на активно разрабатываемую библиотеку altbeacon, которая лучше всего подходит для разработчиков, которые начинают использовать BLE в данный момент. Для нашего варианта использования я не вижу особой пользы в сочетании использования этой библиотеки с ActivityRecognition. Однако мы можем посмотреть, как они грамотно рассчитывают время сканирования. - person OneWorld; 15.04.2016
comment
Нет проблем, добро пожаловать и надеемся, что вы добьетесь прогресса в проекте - person maytham-ɯɐɥʇʎɐɯ; 15.04.2016

Сканирование BLE на Android довольно энергозатратно, и это определенно не то, что вы хотите делать в фоновом режиме все время. Если вы работаете над фоновым приложением со стационарными устройствами Bluetooth (а-ля ibeacons), расположение которых вам известно, вы можете использовать Геозоны, чтобы включать и выключать сканирование, когда вы считаете, что находитесь в непосредственной близости от устройства. Если вы не будете осторожны, геозоны также могут разрядить батарею.

Если вы не знаете местоположение своих Bluetooth-устройств, я думаю, вы также можете пошутить с ActivityRecognition, т. е. только периодически сканировать, когда пользователь идет, и останавливать его, если пользователь стоит/бежит/едет на велосипеде/в транспортном средстве. Опять же, распознавание активности также требует батареи, поэтому вам придется быть рассудительным.

person James    schedule 13.04.2016
comment
Мы думали, что ActivityRecognition потребляет меньше энергии, а его широковещательные события можно было получать с помощью BroadcastReceiver в манифесте. Цель состоит в том, чтобы оставить приложение завершенным и просто разбудить его по событию активности пользователя. - person OneWorld; 13.04.2016
comment
Это определенно меньше потребляет заряд батареи. Однако убедитесь, что вы все еще оцениваете расход заряда батареи. - person James; 13.04.2016
comment
Нужно ли проснуться и запросить его, или активность пользователя пробуждает мое приложение, используя зарегистрированный приемник в манифесте? - person OneWorld; 13.04.2016
comment
вы можете включать и выключать обратные вызовы здесь developers.google .com/android/reference/com/google/android/gms/ - person James; 14.04.2016
comment
Вознаграждение, потому что решение лучше всего соответствует нашим требованиям и из-за четкого заявления о том, что использование ActivityRecognition намного меньше потребляет заряд батареи. - person OneWorld; 15.04.2016

Нам нужно широковещательное событие, которое пробуждает наше приложение, когда 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
comment
Спасибо, что четко сказали, что энергопотребление не сильно улучшилось! Жаль, что нельзя поделиться наградами... - person OneWorld; 15.04.2016
comment
@OneWorld, все в порядке. Просто рад поделиться информацией, которую я долго собирал сам - person Tim; 15.04.2016

Если у вас есть определенное периферийное устройство BLE, которое вы хотите обнаружить, выясните период его объявления. Если у вас разные устройства, найдите самый длинный период рекламы. Сканируйте дольше, чем рекламный период устройства, поэтому вы получите хотя бы одно рекламное сообщение. Периодически повторяйте это сканирование с частотой, подходящей для вашего варианта использования. Например. Ваше периферийное устройство рекламирует каждую секунду один раз. Вы хотели бы обнаружить устройство за 5 секунд, когда дело доходит до близости. Затем сканируйте в течение 1 с (или немного больше). Выключите сканирование на 4 секунды. Таким образом, вы можете сэкономить заряд батареи.

person xISTIx    schedule 16.01.2015