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

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