我正在开发一个基于iBeacon技术的小型应用程序。
一般的想法是在博物馆中的每件艺术品上放置一个灯塔,该博物馆中有一定的信息。
当几个信标太靠近时,问题就出现了,尽管配置了具有最低传输功率的信标,应用程序会检测到两个信标。
我曾尝试过几家制造商,Estimote,radius networks,onyx beacon,BlueCat ......
甚至将信标设置在最低传输水平,0.5到1米,根据他们的规格。位于一件艺术品前面,应用程序检测最近的信标,但也检测超过4米的信标。如果根据制造商的说法,在较低范围内广播的距离大约是一米,这怎么可能呢?
有什么想法吗?我将不胜感激。
由于
答案 0 :(得分:1)
了解蓝牙信标是无线电发射器非常重要。像所有无线电发射器一样,信号将持续很长的距离,但越远越弱。 蓝牙无线电信号的最大传输距离。信标通过无线电将广告作为数据包发出脉冲。你走的越远,接收的数据包百分比就越小。
当人们说信标的范围为40-50米时,这通常意味着将在此距离处接收大部分数据包。但这不是一个硬性限制。在开放区域的测试中,我已经看到在200米外的单个信标包的罕见检测。
同样的原则适用于你"拨打"信标上的发射机功率使其只有几米的范围。在无线电条件有利的某些情况下(视线清晰,电话指向正确的方向,信标后面的物体将信号反射回给你,就像碟形天线一样),手机将在更远的距离探测到信标。
对您的用例更好的方法可能是一直关闭信标,并依靠信标范围来决定哪个信标最接近。然后您将比较所有信标的估计距离。可见的信标,并对距离最短的信标采取行动。但是,如果采用这种方法,请确保在信标上重新启动发射机电源。信号越弱,估计距离越不准确。
答案 1 :(得分:0)
我写了以下逻辑。 @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秒钟一次 我还没有测试这个解决方案,因为我的Beacons将在明天发货。如果我发现任何问题,我会更新我的解决方案。