我们正在尝试使用Altbeacon库来满足下一个研究案例: 我们希望将几个IBeacons放在一个房间或走廊中,每个房间或走廊之间的距离不超过3米,我们希望根据扫描信标的用户电话获得当前最接近的Ibeacon。 我们首先尝试构建每个只有一个信标的区域,想知道一个区域是一个封闭的集合,这意味着当你进入一个区域时,你不能同时在其他区域,当你离开一个区域时,你输入下一个最近的一个。但这不是图书馆实施的方法。 我们想知道Altbeacon库中是否有任何方法可以应用我们的方法,或者是否必须使用某种补丁来满足我提交给您的研究案例。
答案 0 :(得分:0)
实现这一目标的最简单方法是使用单个区域对所有信标进行测距,然后开始测距:
@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");
}
}
注意,如果您使用的是带有RegionBootstrap
的自定义Application类,则可以将上面的代码放在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
}
请记住,最近的信标可能会因无线电噪声而来回变化,因此您可能需要添加额外的逻辑来防止最近的信标频繁来回翻转。