0

我们正在尝试使用 Altbeacon 库来满足下一个研究案例:我们希望将几个 IBeacon 放在一个房间或走廊中,每个房间或走廊之间的距离不超过 3 米,我们希望根据扫描信标的用户电话。我们首先尝试构建每个只有一个信标的区域,想知道一个区域是一个封闭集,这意味着当你进入一个区域时,你不能同时在另一个区域,而当你离开一个区域时,你输入下一个最接近的,依此类推。但这不是图书馆实施的方法。我们想知道 Altbeacon 库中是否有任何方法可以应用我们的方法,或者是否必须制作某种补丁来满足我向您展示的研究案例。

4

1 回答 1

1

实现此目标的最简单方法是使用单个区域对所有信标进行测距,然后开始测距:

@Override
public void onBeaconServiceConnect() {
    try {
         // Set up a region that matches all of your beacons.  You may want to replace the first
         // null with a UUID that all your beacons share.

        Region allBeaconsRegion = new Region("all beacons", null, null, null);
        beaconManager.startRangingBeaconsInRegion(mAllBeaconsRegion);
        beaconManager.setRangeNotifier(this);    

    } catch (RemoteException e) {
        Log.e(TAG, "Cannot connect to beacon service");
    }
}

请注意,如果您使用带有 的自定义 Application 类,则RegionBootstrap可以将上面的代码放在didEnterRegion方法中而不是onBeaconServiceConnect方法中。

开始测距后,您将每秒收到一次回调,其中包含所有可见信标的列表。您可以添加代码以确定哪个最接近:

@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region arg1) {
    Beacon closestBeacon = null;

    for (Beacon beacon : beacons) {
            if (closestBeacon == null) {
                closestBeacon = beacon;
            }
            else {
                if (closestBeacon.getDistance() > beacon.getDistance()) {
                    closestBeacon = beacon;
                }
            }
    }

    // Do Something with closestBeacon here        
}

请记住,最近的信标可能会由于无线电噪声来回变化,因此您可能需要添加额外的逻辑来防止最近的信标过于频繁地来回翻转。

于 2014-10-20T12:55:18.733 回答