【问题标题】:Swift find closest Beacon by rssi通过 rssi Swift 找到最近的 Beacon
【发布时间】:2015-08-05 13:57:38
【问题描述】:

我正在尝试的是 iBeacon,我从 Youtube 学到了一些东西。这是通过邻近度找到最近的信标,但它不是很准确。所以我想通过rssi找到最接近的一个。我应该如何修改代码? rssi的值总是负数,是不是说rssi越大越接近?

 func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
    //print(beacons)
    let knownBeacons = beacons.filter{ $0.proximity != CLProximity.Unknown }

    //print(knownBeacons)
    if(knownBeacons.count>0){
        let closestBeacon = knownBeacons[0] as CLBeacon
        self.showName.text = self.name[closestBeacon.minor.integerValue]
    }
}

【问题讨论】:

    标签: ios iphone ibeacon


    【解决方案1】:

    RSSI 的幅度越低,信号越强。换句话说,-49 dBm 的 RSSI 表示比 -59 dBm 的信号更强(通常是更接近的信标)。

    您当然可以使用 RSSI 而不是使用 CLBeacon 准确度属性来计算最近的信标,但您不会得到更一致的结果。这是因为在 iOS 上,RSSI 的平均时间仅为 1 秒(使用在该期间检测到的数据包的所有测量值),而 CLBeacon 准确度属性的平均时间为 20 秒。这意味着准确度属性(以米为单位测量估计距离)更加稳定。

    编辑:修复了两个版本中的错误

    所以你可以试试这个:

    var closestBeacon: CLBeacon? = nil
    for beacon in beacons {
      if closesBeacon ==nil || (beacon.rssi < 0 && beacon.rssi > closestBeacon!.rssi) {
        closestBeacon = beacon as? CLBeacon
      }
    }
    

    但是你会得到更稳定的结果:

    var closestBeacon: CLBeacon? = nil
    for beacon in beacons {
      if closesBeacon == nil || (beacon.accuracy > 0 && beacon.accuracy < closestBeacon!.accuracy) {
        closestBeacon = beacon as? CLBeacon
      }
    }
    

    【讨论】:

    • 谢谢,很有帮助
    • 请问我是否想要一个包含所有信标按精度升序排列的数组,我必须自己在 Swift1.2 中编写一个排序吗?我知道在 Swift2.0 中有 Array.sort,但这似乎在 IOS 8 中不起作用。
    • 其实你甚至不需要做排序,因为iOS会自动在测距回调中按照准确率升序返回信标。
    • 我现在有一个数组,所以我想使用 beacon.minor 来配对数组并在 tableview 上显示数组中的内容,但它不起作用。 Xcode 说找不到接受提供的参数的“下标”的重载。 cell.textLabel?.text = self.Array[self.beaconArray[indexPath.row].minor]
    • 由于这是一个不同的问题,请打开一个新问题而不是在 cmets 中提问。您可以从 cmets 链接到新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2013-06-16
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    相关资源
    最近更新 更多