AltBeacon Range никогда не возвращает более 1 маяка

Я работаю с библиотекой AltBeacon (2.5.1) для обнаружения маяков. Я настраиваю диапазон с «универсальным» регионом, чтобы иметь возможность обнаруживать любой маяк в диапазоне, а затем делаю с ним свои дела. Проблема в том, что, когда у меня есть несколько маяков в диапазоне, обратный вызов didRangeBeaconsInRegion всегда предоставляет мне коллекцию только из 1 маяка за раз, и этот маяк является случайным среди всех существующих маяков ... Почему я не могу получить все маяки в радиусе действия в моей коллекции?

Все это делается из службы, я очистил все остальное, чтобы сохранить только соответствующие части кода ниже -> Надеюсь, я здесь что-то делаю не так?

public class MonitorService extends Service implements BeaconConsumer 
{

    private BeaconManager beaconManager;


    @Override
    public void onCreate() 
    {
        super.onCreate();


        beaconManager = BeaconManager.getInstanceForApplication(this);
        beaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));

        beaconManager.setForegroundScanPeriod(5000l);
        beaconManager.setBackgroundScanPeriod(5000l);
        beaconManager.setForegroundBetweenScanPeriod(1100l);
        beaconManager.setBackgroundBetweenScanPeriod(1100l);


        setupBeaconManager();
    }


    private void setupBeaconManager()
    {
        if (!beaconManager.isBound(this))
            beaconManager.bind(this);
    }

    private void unsetBeaconManager()
    {
        if (beaconManager.isBound(this))
        {
            beaconManager.unbind(this);

            try 
            {
                beaconManager.stopRangingBeaconsInRegion(new Region("apr", null, null, null));
            } 
            catch (RemoteException e) 
            {  
                Log.i(TAG, "RemoteException = "+e.toString());
            }
        }
    }


    @Override
    public void onBeaconServiceConnect() 
    {
        beaconManager.setRangeNotifier(new RangeNotifier() {
            @Override 
            public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) 
            {
                Log.i(TAG,"didRangeBeaconsInRegion, number of beacons detected = "+beacons.size());
                // HERE IT IS : the size is Always 1, but the beacon (UUID etc. can be different)
            }
        });


        try 
        {
            beaconManager.startRangingBeaconsInRegion(new Region("apr", null, null, null));
        } 
        catch (RemoteException e) 
        {  
            Log.i(TAG, "RemoteException = "+e.toString());
        }


    }

    @Override
    public void onDestroy() 
    {
        unsetBeaconManager();

        super.onDestroy();
    }


}

Я работаю над Android 5.1.1 с Nexus 6 (но дешевый телефон Wiko дает те же результаты). Маяки настроены на рекламу каждые 600 мс ... Но даже при 100 мс они также дают точно такие же результаты ...


person JBA    schedule 17.09.2015    source источник


Ответы (1)


Код выглядит нормально. Пару мыслей:

  • Попробуйте использовать готовое приложение-сканер маяков на основе той же библиотеки, например Найти. Обнаруживает ли он все ваши маяки одновременно? Если нет, то может быть что-то не так с маячками или их конфигурацией.

  • У каждого из ваших маяков есть уникальные идентификаторы? По умолчанию библиотека обнаруживает несколько маяков только в том случае, если они имеют уникальные идентификаторы.

person davidgyoung    schedule 18.09.2015
comment
СПАСИБО, Дэвид! У маяков был один и тот же UUID ... изменив его, все они выглядели так, как должны. - person JBA; 18.09.2015
comment
@davidgyoung У меня такая же проблема. Приложение Locate распознает 2 маяка, в то время как мое приложение распознает только 1. оба имеют одинаковые идентификаторы. Откуда вы берете информацию, что библиотека по умолчанию обнаруживает несколько маяков, только если у них есть уникальные идентификаторы. JBA, как вы меняли идентификаторы маяков? - person Maor Hadad; 01.10.2015
comment
Вы также можете установить Beacon.setHardwareEqualityEnformed (true); который сообщает библиотеке рассматривать два маяка как разные, если у них разные MAC-адреса bluetooth, но одинаковые идентификаторы. - person davidgyoung; 01.10.2015
comment
Большое спасибо. У моих маяков тоже был такой же eddyURL, поэтому библиотека altbeacon обнаруживала их только один раз за сканирование. - person Gulshan Jangid; 24.11.2019