根据与设备的距离检测信标
Detecting beacons depending on its distance from the device
我正在开发一个基于 iBeacon 技术的小应用程序。
一般的想法是在博物馆中的每件艺术品上放置一个灯塔,该灯塔具有特定的相关信息。
当几个信标靠得太近时就会出现问题,尽管配置了最低传输功率的信标,应用程序仍会检测到两个信标。
试过几个厂家,Estimote,radius networks,onyx beacon,BlueCat ...
即使将信标设置在最低传输级别,0.5 到 1 米,根据它们在一件艺术品前面的 specifications.Located,应用程序会检测最近的信标,但也会检测到的信标超过4米。这怎么可能,按照厂家的说法,下部的广播距离大概是一米?
有什么想法吗?我将不胜感激。
谢谢
了解蓝牙信标是无线电发射器很重要。像所有无线电发射器一样,信号会持续很远的距离,但越远越弱。 蓝牙无线电信号传输的最大距离没有硬性规定。信标通过无线电以数据包的形式发出广告。你走得越远,收到的数据包百分比就越小。
当人们说信标的范围为 40-50 米时,这通常意味着大部分数据包将在此距离接收。但这不是硬性限制。在开放区域的测试中,我很少看到在 200 米外检测到单个信标数据包。
当您 "dial down" 信标上的发射器功率使其范围只有几米时,同样的原则也适用。在某些无线电条件有利的情况下(视线清晰,phone 瞄准正确的方向,信标后面的物体像碟形天线一样将信号反射回您)phone 将检测到灯塔在更远的地方。
对于您的用例,一个更好的方法可能是一直打开信标,并依靠信标测距来决定哪个信标最近。然后您可以比较所有可见信标的估计距离,并对距离最短的信标采取行动。但是,如果您采用这种方法,请务必将信标上的发射器电源重新打开。信号越弱,距离估计越不准确。
我写了下面的逻辑。 @davidyoung ,请验证并建议您是否有更好的逻辑
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if(!beacons.isEmpty()){
Beacon beacon = getNearestBeacon(beacons);
if(isUserNearBeaconForLong(beacon)){
logToDisplay("Long time near "+beacon.getId1());
}
}
});
/*Finds the nearest Beacon out of all detected beacons*/
private Beacon getNearestBeacon(Collection<Beacon> beacons) {
List beaconList = new ArrayList<Beacon>(beacons);
Collections.sort(beaconList,new BeaconDistanceComparator());
return (Beacon) beaconList.get(0);
}
private boolean isUserNearBeaconForLong(Beacon beacon) {
//Some logic to detect that the same Beacon is seen as the nearest for a long time to identify a person is waiting near that artwork
}
class BeaconDistanceComparator implements Comparator {
@Override
public int compare(Object lhs, Object rhs) {
Beacon beacon1 = (Beacon) lhs;
Beacon beacon2 = (Beacon) rhs;
if(beacon1.getDistance() == beacon2.getDistance())
return 0;
else if(beacon1.getDistance()>beacon2.getDistance())
return 1;
else
return -1;
}
}
测距周期可以说是每5秒一次
我尚未测试此解决方案,因为我的 Beacon 将于明天发货。如果我发现任何问题,我会更新我的解决方案。
我正在开发一个基于 iBeacon 技术的小应用程序。
一般的想法是在博物馆中的每件艺术品上放置一个灯塔,该灯塔具有特定的相关信息。
当几个信标靠得太近时就会出现问题,尽管配置了最低传输功率的信标,应用程序仍会检测到两个信标。
试过几个厂家,Estimote,radius networks,onyx beacon,BlueCat ...
即使将信标设置在最低传输级别,0.5 到 1 米,根据它们在一件艺术品前面的 specifications.Located,应用程序会检测最近的信标,但也会检测到的信标超过4米。这怎么可能,按照厂家的说法,下部的广播距离大概是一米?
有什么想法吗?我将不胜感激。
谢谢
了解蓝牙信标是无线电发射器很重要。像所有无线电发射器一样,信号会持续很远的距离,但越远越弱。 蓝牙无线电信号传输的最大距离没有硬性规定。信标通过无线电以数据包的形式发出广告。你走得越远,收到的数据包百分比就越小。
当人们说信标的范围为 40-50 米时,这通常意味着大部分数据包将在此距离接收。但这不是硬性限制。在开放区域的测试中,我很少看到在 200 米外检测到单个信标数据包。
当您 "dial down" 信标上的发射器功率使其范围只有几米时,同样的原则也适用。在某些无线电条件有利的情况下(视线清晰,phone 瞄准正确的方向,信标后面的物体像碟形天线一样将信号反射回您)phone 将检测到灯塔在更远的地方。
对于您的用例,一个更好的方法可能是一直打开信标,并依靠信标测距来决定哪个信标最近。然后您可以比较所有可见信标的估计距离,并对距离最短的信标采取行动。但是,如果您采用这种方法,请务必将信标上的发射器电源重新打开。信号越弱,距离估计越不准确。
我写了下面的逻辑。 @davidyoung ,请验证并建议您是否有更好的逻辑
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
if(!beacons.isEmpty()){
Beacon beacon = getNearestBeacon(beacons);
if(isUserNearBeaconForLong(beacon)){
logToDisplay("Long time near "+beacon.getId1());
}
}
});
/*Finds the nearest Beacon out of all detected beacons*/
private Beacon getNearestBeacon(Collection<Beacon> beacons) {
List beaconList = new ArrayList<Beacon>(beacons);
Collections.sort(beaconList,new BeaconDistanceComparator());
return (Beacon) beaconList.get(0);
}
private boolean isUserNearBeaconForLong(Beacon beacon) {
//Some logic to detect that the same Beacon is seen as the nearest for a long time to identify a person is waiting near that artwork
}
class BeaconDistanceComparator implements Comparator {
@Override
public int compare(Object lhs, Object rhs) {
Beacon beacon1 = (Beacon) lhs;
Beacon beacon2 = (Beacon) rhs;
if(beacon1.getDistance() == beacon2.getDistance())
return 0;
else if(beacon1.getDistance()>beacon2.getDistance())
return 1;
else
return -1;
}
}
测距周期可以说是每5秒一次 我尚未测试此解决方案,因为我的 Beacon 将于明天发货。如果我发现任何问题,我会更新我的解决方案。