Как определить регион Enter/Exit для нескольких маяков с использованием Android-маяка AltBeacon?

Я работаю с iBeacons и использую библиотеку AltBeacon.

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

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

public void **didEnterRegion**(Region region)

и

public void **didExitRegion**(Region region) 

Моя проблема в том, что одновременно отображаются несколько маяков. Я пытаюсь сохранить массив со всеми видимыми маяками. Я хочу генерировать событие каждый раз, когда маяк входит и выходит. Событие должно идентифицировать маяк, который сгенерировал событие по его уникальному идентификатору. Мои маяки уникально идентифицируются с помощью beacon.getIdentifiers() или (UUID, Major и Minor)

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

Может ли кто-нибудь подумать о том, как мне легко достичь моих целей с помощью библиотеки AltBeacon?

Приветствуются любые предложения.

Ответ 1

Два варианта:

  • Настройте другой регион, чтобы соответствовать только каждому отдельному маяку, указывая все их идентификаторы и отслеживать для каждого. Вы получите другую запись и выход для обратного вызова для каждого региона.

    Region region1 = new Region("myIdentifier1", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("1"));        
    Region region2 = new Region("myIdentifier2", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("2"));   
    
    beaconManager.startMonitoringBeaconsInRegion(region1);
    beaconManager.startMonitoringBeaconsInRegion(region2);    
    
  • Включить ранжирование и поместить код в обратный вызов didRangeBeaconsInRegion для отслеживания отдельных маяков. Вы можете использовать java.util.HashMap для отслеживания всех видимых маяков (с отметкой времени в последний раз, когда каждый был замечен), а затем, если вы не видели маячок, скажем, пять секунд, вы можете удалить маяк от HashMap и выполните логику выхода для этого маяка.

Вариант 1 отлично подходит для небольшого количества маяков, где вы знаете свои идентификаторы спереди. Вариант 2 более активен, но лучше для большого количества маяков или если вы заранее не знаете их идентификаторы.

Ответ 2

/*************** Этот код для оценки маяков *****************/

private  final Region ALL_ESTIMOTE_BEACONS_REGION = new Region("beaconall", null, null, null);

private BeaconManager beaconManager;

public  onCreate()
{

    beaconManager.connect(new BeaconManager.ServiceReadyCallback()
    {
        @Override
        public void onServiceReady()
        {
            Log.d("Lalit", "Beacon service Ready");

            beaconManager.startRanging(ALL_ESTIMOTE_BEACONS_REGION);
            beaconManager.startMonitoring(ALL_ESTIMOTE_BEACONS_REGION);
        }
    });
    beaconManager.setRangingListener(new BeaconManager.RangingListener() {
        @Override
        public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) {

            int index = beacons.size();
            // UUID uuid = UUID.fromString("");
            if (beacons.size() > 0) {
                Beacon SelectedBeacon = beacons.get(index-1);

                Log.d("Lalit", "Beacon Id :- " + SelectedBeacon.getProximityUUID());
                Log.d("Lalit", "Beacon major :- " + SelectedBeacon.getMajor());
                Log.d("Lalit", "Beacon miner :- " + SelectedBeacon.getMinor());
                Log.d("Lalit", "Beacon total :- " + beacons.size());
                Log.d("Lalit","Distance :- "+ getDistance(SelectedBeacon.getRssi(),SelectedBeacon.getMeasuredPower()));
            }

        }
    });

    beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
        @Override
        public void onEnteredRegion(Region region, List<Beacon> list) {
            Calendar calendar = Calendar.getInstance();
            Date entertime = calendar.getTime();
            Log.d("Lalit", "Region Enter :- " + entertime);
            Log.d("List", "Region  UUID id :- " + region.getProximityUUID());
        }

        @Override
        public void onExitedRegion(Region region) {
            Calendar calendar = Calendar.getInstance();
            Date entertime = calendar.getTime();
            Log.d("Lalit", "Region exit :- " + entertime);
            Log.d("List", "Region  UUID id :- " + region.getProximityUUID());
        }
    });
}