【问题标题】:Beacon distance shows wrong values with EddystoneEddystone 的信标距离显示错误值
【发布时间】:2018-10-24 06:24:29
【问题描述】:

当我选择 Eddystone 协议到我的 Kontakt 信标时,我的距离有误。

对于 Kontakt,RSSI 值不同:

Tx Power            RSSI for ibeacon @ 1m             RSSI for Eddystone @ 0m

0 (-30dBm)                -115                           -74
1 (-20dBm)                -84                            -43
2 (-16dBm)                -81                            -40
3 (-12dBm)                -77                            -36
4 (-8dBm)                 -72                            -31
5 (-4dBm)                 -69                            -28
6 (0dBm)                  -65                            -24
7 (4dBm)                  -59                            -18

为什么使用 Eddystone 时所有距离都那么远,而我使用 iBeacon 时一切正常?

这是我的代码示例:

public static let signalLossAtOneMeter: Int = -41

public static func calculateDistance(rssi: Float, calibratedRssi: Float, calibratedDistance: Float, pathLossParameter: Float) -> Float {
    return calculateDistance(rssi: rssi,
                             calibratedRssi: getCalibratedRssiAtOneMeter(calibratedRssi: calibratedRssi, calibratedDistance: calibratedDistance),
        pathLossParameter: BeaconDistanceCalculator.pathLossParameter)
}

public static func getCalibratedRssiAtOneMeter(calibratedRssi: Float, calibratedDistance: Float) -> Float {
    let calibratedRssiAtOneMeter: Float

    if calibratedDistance == IBeacon.calibrationDistanceDefault {
        calibratedRssiAtOneMeter = calibratedRssi
    } else if calibratedDistance == Eddystone.calibrationDistanceDefault {
        calibratedRssiAtOneMeter = calibratedRssi + Float(BeaconDistanceCalculator.signalLossAtOneMeter)
    } else {
        calibratedRssiAtOneMeter = -62
    }

    return calibratedRssiAtOneMeter
}

public static func calculateDistance(rssi: Float, calibratedRssi: Float, pathLossParameter: Float) -> Float {
    return pow(10, (calibratedRssi - rssi) / (10 * pathLossParameter)) as Float
}

【问题讨论】:

  • 只是一个疯狂的猜测......你在这两种情况下得到了什么 calibratedRssi 值,你是如何得到它们的?我只是在考虑这样一种情况:已经为 Eddystone 重新计算了 calibratedRssi @ 1m(通过您正在使用的库)并且您正在再次执行此操作
  • 我从 UID 帧的第二个字节获取 calibratedRssi
  • 另一个疯狂的猜测。您确定在 getCalibratedRssiAtOneMeter 中为 Eddystone 选择了正确的 if 分支吗?不是因为其他地方的编码错误而添加了-62而不是-41吗?
  • 是的,我查过了

标签: ibeacon beacon rssi eddystone kontakt.io


【解决方案1】:

我不确定getCalibratedRssiAtOneMeter 方法中的逻辑要完成什么——这应该是每个信标的固定值,基于其发射器在安装位置的强度。您应该实际测量这一点,而不是使用制造商的查找表,因为它可能会因反射而变化(一些附近的物体充当“背板”并加强信号),而另一些则衰减它。

Eddystone 的关键在于它将信标数据包内的校准 RSSI 编码为 0m 参考值,而不是 iBeacon 的 1m 参考值。这实际上意味着,在从 Eddystone 数据包中读取常数后,您必须在常数中添加 -41,然后再将其插入公式。这会将 0m 参考值转换为 1m 参考值。

如果您不进行此转换,距离估计值在 Eddystone 上会显得太远。

【讨论】:

  • getCalibratedRssiAtOneMeter() 与您在上一段中提到的完全一样,它将-41 添加到 Eddystone 并为 iBeacon 采用相同的值。所以你告诉我,如果我这样做,距离将接近当它是一个 ibeacon 时计算的距离?
  • 再一次,我不明白 getCalibraredRssiAtOneMeter 中的所有逻辑。那里的代码似乎比简单地将任何 eddystone 校准 rssi 调整 -41 所需的代码更多,所以我担心它可能没有达到您的预期。但是,是的,您需要进行此调整。
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多