根据信标与设备的距离来检测信标

时间:2016-05-03 18:49:36

标签: ios ibeacon beacon

我正在开发一个基于iBeacon技术的小型应用程序。

一般的想法是在博物馆中的每件艺术品上放置一个灯塔,该博物馆中有一定的信息。

当几个信标太靠近时,问题就出现了,尽管配置了具有最低传输功率的信标,应用程序会检测到两个信标。

我曾尝试过几家制造商,Estimote,radius networks,onyx beacon,BlueCat ......

甚至将信标设置在最低传输水平,0.5到1米,根据他们的规格。位于一件艺术品前面,应用程序检测最近的信标,但也检测超过4米的信标。如果根据制造商的说法,在较低范围内广播的距离大约是一米,这怎么可能呢?

有什么想法吗?我将不胜感激。

由于

2 个答案:

答案 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将在明天发货。如果我发现任何问题,我会更新我的解决方案。