信标距离显示 Eddystone 的错误值
Beacon distance shows wrong values with Eddystone
当我为我的 Kontakt 信标选择 Eddystone 协议时,我得到了错误的距离。
对于 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
}
我不确定 getCalibratedRssiAtOneMeter
方法中的逻辑打算完成什么 -- 这应该是每个信标的固定值,基于其安装位置的发射器强度.你应该实际测量这个而不是使用制造商的查找 table,因为它可能会因反射而变化(一些附近的物体充当 "backplane" 并增强信号)而其他一些物体会衰减它。
Eddystone 的关键是它编码的信标数据包内的 RSSI 被校准为 0m 参考值而不是 iBeacon 的 1m 参考值。这实际上意味着在从 Eddystone 数据包中读取常量后,您必须在将常量插入公式之前将 -41 添加到常量中。这会将 0m 参考值转换为 1m 参考值。
如果您不进行此转换,距离估计值在 Eddystone 上会显得太远。
当我为我的 Kontakt 信标选择 Eddystone 协议时,我得到了错误的距离。
对于 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
}
我不确定 getCalibratedRssiAtOneMeter
方法中的逻辑打算完成什么 -- 这应该是每个信标的固定值,基于其安装位置的发射器强度.你应该实际测量这个而不是使用制造商的查找 table,因为它可能会因反射而变化(一些附近的物体充当 "backplane" 并增强信号)而其他一些物体会衰减它。
Eddystone 的关键是它编码的信标数据包内的 RSSI 被校准为 0m 参考值而不是 iBeacon 的 1m 参考值。这实际上意味着在从 Eddystone 数据包中读取常量后,您必须在将常量插入公式之前将 -41 添加到常量中。这会将 0m 参考值转换为 1m 参考值。
如果您不进行此转换,距离估计值在 Eddystone 上会显得太远。