Обнаружение маяков в зависимости от их удаленности от устройства

Я разрабатываю небольшое приложение на основе технологии iBeacon.

Общая идея состоит в том, чтобы разместить маяк на каждом произведении искусства в музее, связанном с определенной информацией.

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

Я пробовал несколько производителей, Estimote, радиусные сети, ониксовый маяк, BlueCat...

Даже устанавливая маяки на самый низкий уровень передачи, от 0,5 до 1 метра, в соответствии с их спецификациями. Расположенное перед произведением искусства, приложение обнаруживает ближайший маяк, а также обнаруживает маяки, которые находятся на расстоянии более 4 метров. Как это возможно, если по заявлению производителей дальность вещания в нижнем диапазоне около метра?

Любая идея об этом? Буду признателен за помощь.

Спасибо


person Kepa Santos    schedule 03.05.2016    source источник
comment
Вы получили решение? Пожалуйста, просмотрите мой один раз и дайте мне знать, если у вас есть лучше.   -  person Alok Kulkarni    schedule 12.09.2016


Ответы (2)


Важно понимать, что Bluetooth-маяки — это радиопередатчики. Как и у всех радиопередатчиков, сигнал будет передаваться на большие расстояния, но по мере продвижения он будет становиться все слабее и слабее. Не существует жесткого ограничения максимального расстояния, на которое могут передаваться радиосигналы Bluetooth. Маяки посылают рекламу в виде пакетов по радио. Чем дальше, тем меньший процент пакетов будет получен.

Когда люди говорят, что маяк имеет дальность 40-50 метров, это обычно означает, что большой процент пакетов будет получен на этом расстоянии. Но это не жесткий предел. При тестировании на открытых площадках я видел редкие обнаружения одного пакета маяка на расстоянии 200 метров.

Тот же принцип применяется, когда вы «уменьшаете» мощность передатчика маяка, чтобы дать ему дальность действия всего в несколько метров. В некоторых случаях, когда условия радиосвязи благоприятны (прямая видимость, телефон направлен точно в правильном направлении, объект позади маяка, который отражает сигнал обратно к вам, как параболическая антенна), телефон обнаружит маяк на гораздо большем расстоянии.

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

person davidgyoung    schedule 03.05.2016
comment
Хорошо, но при таком подходе не было бы проблемы, что приложение всегда будет обнаруживать ближайший маяк в радиусе 50 метров? - person Kepa Santos; 03.05.2016
comment
Да, он всегда будет обнаруживать все маяки в этом диапазоне. Таким образом, вам нужно будет создать диапазон приложений для маяков (а не только для их мониторинга). Если вам нужно работать в фоновом режиме, вы можете расширить фоновый диапазон, чтобы сделать это до 3 минут после того, как приложение впервые обнаружит маяк или будет переведено в фоновый режим. - person davidgyoung; 04.05.2016
comment
Я скорее имел в виду, что следует добавить некоторый алгоритм, чтобы заботиться только о ближайшем маяке, расстояние до которого меньше x. В противном случае уведомления слишком далеко уходят от художественных работ. - person Kepa Santos; 04.05.2016
comment
Точно. Вам нужно будет активировать логику на ближайшем маяке, только если предполагаемое расстояние меньше порогового значения. - person davidgyoung; 04.05.2016

Я написал следующую логику. @davidyoung, пожалуйста, проверьте и предложите, если у вас есть лучшая логика

beaconManager.addRangeNotifier(new RangeNotifier() {
           @Override
               public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {

               if(!beacons.isEmpty()){
                   Beacon beacon =  getNearestBeacon(beacons);
                   if(isUserNearBeaconForLong(beacon)){
                      logToDisplay("Long time near "+beacon.getId1());
                   }

               }

});
  /*Finds the nearest Beacon out of all detected beacons*/ 
 private Beacon getNearestBeacon(Collection<Beacon> beacons) {
        List beaconList = new ArrayList<Beacon>(beacons);

        Collections.sort(beaconList,new BeaconDistanceComparator());
        return (Beacon) beaconList.get(0);
    }

private boolean isUserNearBeaconForLong(Beacon beacon) {
//Some logic to detect that the same Beacon is seen as the nearest for a long time to identify a person is waiting near that artwork
}

class BeaconDistanceComparator implements Comparator {
    @Override
    public int compare(Object lhs, Object rhs) {
        Beacon beacon1 = (Beacon) lhs;
        Beacon beacon2 = (Beacon) rhs;

        if(beacon1.getDistance() == beacon2.getDistance())
            return 0;
        else if(beacon1.getDistance()>beacon2.getDistance())
            return 1;
        else
            return -1;

    }
}

Период ранжирования может быть, скажем, каждые 5 секунд. Мне еще предстоит протестировать это решение, так как мои маяки будут отправлены завтра. Я обновлю свое решение, если обнаружу какие-либо проблемы в этом.

person Alok Kulkarni    schedule 12.09.2016