2016-12-10 49 views
0

我有一个房间有6个iBeacons,如果其中一个距离设备不到2.5米,则会发出一个动作,但这不能很好地工作,因为经常会有大的干扰,错误的行动。 我的问题是排序这些信标更好 - 使用rssi值或准确性?斯威夫特iBeacon使用准确度或rssi距离

下面我用于排序的代码/调用操作:

if beacons.count > 0 { 
     let sortedBeacons = beacons.sorted { (first, second) -> Bool in 
      if first.accuracy == -1 || second.accuracy == -1 { 
       return true 
      } 
      return first.accuracy < second.accuracy 
     } 
     let beacon = sortedBeacons[0] 

     if beacon.major.intValue == helperMajorValue && beacon.accuracy < 2.5 { 
      if beacon.accuracy != -1 { 
       if triggeredMajor == 0 { 
        counter += 1 
       } else if abs((helperMajorValue - triggeredMajor)) < 3 { 
        counter += 1 
       } 
      } 
     } else { 
      counter = 0 
      helperMajorValue = beacon.major.intValue 
     } 
      if counter > 4 { 
       counter = 0 
       print("majorValue: \(beacon.major.intValue) distance: \(beacon.accuracy)") 
       if beacon.accuracy < 2.5 { 
        startNavigation = true 
        majorValue = helperMajorValue 
        triggered = false 
       } 
      } 

      if majorValue == 171 { 
       //call action 
      } else if majorValue == 170 { 
       //call action 
      } else if majorValue == 172 { 
       //Call action 
      }} 

回答

1

使用CLBeaconrssiaccuracy字段排序信标的最大区别是变异性或数量和平均间隔。

准确度字段的平均值大约为20秒,所以它基本上为您提供了设备在过去20秒内的估计距离。真正的好处是,这个号码是嘈杂比rssi,但有显着的滞后

rssi字段的平均值为1秒,因此它使用的数据点更少。虽然它有较少的时间滞后,它也有很多更多噪音。为了排序的目的,如果使用rssi,你会看到排序顺序跳转很多。

你必须适当地设置你的期望值,以确定这些数字的准确程度,正如@ Duncan-C在他的回答中所描述的距离估计值。但对于精度不重要的一些用例,它们可以很好地工作。

+0

非常感谢! 你能为这个问题推荐一个好的解决方案吗? 用例是用户通过设备穿过这个房间,并自动获取当前区域的不同屏幕。我怎样才能确保没有错误的行动触发? 信标距离彼此约5米。 – Thomas

+0

同样,你必须适当地设定你的期望。这意味着意识到你**不能**确保不存在触发的错误操作。信标距离估计值是粗略估计值。有一件事可以帮助更好地进行距离的相对比较,即设定一个阈值。例如,您可能会认为两个信标距离相同,除非估计两个距离近一倍。 – davidgyoung

1

可悲的答案是“以上都不是”。 “准确度”读数是距离灯标距离的最佳来源,但它很粗糙,是非常。在电话的顶端考虑远,中,近,和右。试图远远地评估距离,而不是毫无意义,甚至可能也是如此。无线电信号的强度受到很多与距离无关的变量的影响,因此它不是一个非常准确的测量。