簡體   English   中英

如何使用AltBeacon android-beacon-library檢測多個信標的區域輸入/退出?

[英]How to detect Region Enter/Exit for multiple beacons using AltBeacon android-beacon-library?

我正在使用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); 
  2. 啟用測距,並將代碼放入didRangeBeaconsInRegion回調中以跟蹤各個信標。 您可以使用java.util.HashMap跟蹤所有可見的信標(每個信號都顯示最新時間的時間戳),然后如果您還沒有看到信標,比如五秒鍾,您可以從HashMap刪除信標並執行該信標的退出邏輯。

選項1適用於少量信標,您可以事先知道它們的標識符。 選項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());
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM