непрерывное обнаружение значений RSSI радиомаяка на частоте 10 Гц - PullRequest
3 голосов
/ 20 февраля 2020

Я создал приложение android (java), которое использует библиотеку altbeacon ( github page ) для обнаружения маяков через модуль Bluetooth.

Маяки настроены с помощью Eddystone UID, протокол с рекламным интервалом 100ms и уровнем мощности передачи сильный (10dBm). То, что я хотел бы сделать, это обнаружить RSSI значение маяков с частотой 10Hz (т.е. 100 мс).

Я уже подготовил сервис, который реализует библиотеку altbeacon соответствующая часть показана ниже:

mBeaconManager = BeaconManager.getInstanceForApplication(this);

        beaconRegion = new Region("beacon_region", null, null, null);

        // use Eddystone protocol
        mBeaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));

        mBeaconManager.setAndroidLScanningDisabled(true);
        mBeaconManager.setForegroundScanPeriod(100l); // scan frequency
        mBeaconManager.setForegroundBetweenScanPeriod(0);

и обратный вызов didRangeBeaconsInRegion, из которого я вижу маяки и получаю значение RSSI, таково:

@Override
    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
        Log.i(BeaconDataCollectorService.class.getSimpleName(), String.format("Found %s beacons in range", beacons.size()));
    }

Что моя проблема? Запустив приложение, я заметил, что в didRangeBeaconsInRegion я часто не вижу все маяки.

Я запустил сбор данных в течение нескольких секунд, создавая формат CSV полученных данных, где вы видно, что у меня часто 0 (указывает на то, что маяк не был обнаружен); Я поставил общий доступ к этому csv на pastebin (https://pastebin.com/zkUZC5R4)

Как я могу улучшить частоту сканирования, всегда имея возможность обнаруживать все маяки?

используемая версия altbeacon:

implementation 'org.altbeacon:android-beacon-library:2.16.3'

Android версия: 9

Спасибо

1 Ответ

2 голосов
/ 20 февраля 2020

К сожалению, библиотека не предназначена для этого, так как API ранжирования моделируются после iOS эквивалентов, которые дают совокупные обнаружения через фиксированные интервалы, а не для доступа к отдельным пакетам, когда они поступают.

Основная причина, по которой вы часто получаете 0 маяков, обнаруженных с таким коротким периодом сканирования, заключается в том, что сканирование включается и выключается каждые 100 мс, а для запуска и остановки требуется около 10 мс. Это дает хорошую вероятность пропустить обнаружение.

Вот хорошая новость: если библиотека когда-либо обнаружит два маяковых пакета за один и тот же период сканирования, то она прекратит отключение сканирования и ваша скорость обнаружения улучшится. Но заставить его обнаруживать два маяка за 100 мс почти невозможно из-за рекламы вашего маяка с номинальной частотой 10 Гц.

Одна вещь, которую вы можете попробовать, - начать с установки периода сканирования на 1 секунду. После того, как вы обнаружили конечное число ваших маяков в течение 10 секунд или около того, очень вероятно, что вы обнаружите два маяка за один цикл сканирования, а затем вы можете переключиться на период сканирования 100 мс и получить более высокую скорость обнаружения.

Вы никогда не получите 100% обнаружение по двум причинам:

  • Не все передаваемые пакеты маяка принимаются из-за коллизий и радиошум. На близком расстоянии обычно 80-90%.

  • "Рекламодатели BLE не размещают рекламу через регулярные промежутки времени. Они рандомизируются, когда их пакеты отправляются во избежание коллизий. Номинальный передатчик 10 Гц может иметь где-то между 70 мс и 140 мс между отдельными пакетами, поэтому для фиксированных циклов сканирования 100 мс иногда могут быть получены 0, 1 или 2 упаковщика.

Если вам действительно нужно получать обратные вызовы при каждом обнаружении, вы можете попробовать настроить NonBeaconBleScanCallback в BeaconManager, а затем вызвать * 1 027 *. Это приведет к тому, что все обнаруженные маяки будут отправлены этому обратному вызову немедленно при обнаружении. Затем вам нужно будет создать новый BeaconParser для использования внутри этого обратного вызова для декодирования маяка из необработанного пакета. Используйте beaconParser.parse(...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...