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

问题描述 投票:0回答:2

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

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

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

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

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

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

谢谢

ios ibeacon beacon
2个回答
1
投票

重要的是要了解蓝牙信标是无线电发射器。像所有无线电发射器一样,信号将持续很长的距离,但越远越弱。蓝牙无线电信号不会传播最大硬距离。信标通过无线电将广告作为数据包发出脉冲。你走的越远,收到的包的百分比就越小。

当人们说信标的范围为40-50米时,这通常意味着将在此距离处接收大部分数据包。但这不是一个硬性限制。在开放区域的测试中,我已经看到在200米外的单个信标包的罕见检测。

当您“降低”信标上的发射机功率时,同样的原则适用于只有几米的范围。在无线电条件有利的某些情况下(视线清晰,电话指向正确的方向,信标后面的物体将信号反射回给你,就像碟形天线一样),手机将在更远的距离探测到信标。

对于您的用例更好的方法可能是一直关闭信标,并依靠信标范围来决定哪个信标最接近。然后,您将比较所有可见信标的估计距离,并对距离最短的信标采取行动。但是,如果采用这种方法,请确保在信标上重新启动发射机电源。信号越弱,估计距离越不准确。


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

© www.soinside.com 2019 - 2024. All rights reserved.