RSSI(接收信号强度指示器)是一种数值指标,用于在接收端测量BLE设备的信号功率(单位为dBm)。RSSI值范围从-30 dBm(设备在附近)到-100 dBm(检测极限)。蓝牙核心规范5.4(2023)将RSSI定义为可选参数,每个广播包和数据包中均可用。RSSI用于估算距离(range estimation)和按信号强度过滤设备,但并非精确指标:它会受到障碍物、多径传播和天线类型的影响。精确定位需采用三角测量和卡尔曼滤波。
要点
RSSI(接收信号强度指示器)是BLE接收器在接收数据包时测量的无线电信号功率。在BLE中,每个广播包(advertising)和连接后的每个数据包都会测量RSSI。RSSI值采用对数刻度,每变化1 dBm对应信号功率约1.26倍的变化。
RSSI是一个依赖硬件的指标:不同的BLE芯片(nRF、TI、Dialog、Broadcom)和不同的天线对同一信号可能显示不同的RSSI值。因此,在不同设备之间比较RSSI是不正确的。即使同一操作系统的两台相同智能手机,对同一信标也可能显示2–5 dBm的差异。
在广播包中,三个信道(37、38、39)各自独立测量RSSI。由于频率干扰,信道间的值可能相差3–10 dBm。现代BLE协议栈报告所有信道的平均RSSI或每个数据包各自的RSSI。iOS Core Bluetooth提供平均RSSI,Android提供最后一个数据包的RSSI。
BLE的典型RSSI范围为-30 dBm至-100 dBm。超出此范围的值极为罕见:-20 dBm表示设备实际上触及扫描仪天线,而-105 dBm表示完全无信号。芯片制造商可能限制范围:例如nRF52832报告RSSI范围为-40至-105 dBm。
| RSSI(dBm) | 信号质量 | 大致距离 | 建议 |
|---|---|---|---|
| -30 – -50 | 优秀 | 0–1米 | 设备在附近 |
| -51 – -70 | 良好 | 1–5米 | 在房间内 |
| -71 – -85 | 中等 | 5–15米 | 信标可接受 |
| -86 – -95 | 弱 | 15–30米 | 连接不可靠 |
| 低于-95 | 临界 | 30米以上 | 在检测极限 |
TX Power Level——发射功率,在广播包(AD Type 0x0A)中标明,可用于校正估算。来自TX Power为+4 dBm的设备的-70 dBm RSSI意味着信号衰减了74 dB。如果TX Power未知,则无法精确估算距离。iBeacon在制造商数据结构中包含TX Power(1字节)用于距离校准。
路径损耗模型用于根据RSSI估算距离。基本公式:RSSI = TX_Power - 10 × n × log10(d),其中n为衰减系数(自由空间为2.0,有障碍物的室内为3.0–4.5),d为以米为单位的距离。实际条件下估算精度为±2–5米。
为校准模型,需在已知距离处(通常为1米)测量RSSI并计算TX Power参考值。iBeacon将此参数存储在数据包中。Eddystone使用类似机制。校准后可计算距离:d = 10 ^ ((TX_Power — RSSI) / (10 × n))。
根据Apple Core Bluetooth编程指南(2024),iBeacon的距离估算精度为:immediate(<0.5米)——当RSSI高于校准值时;near(0.5–3米)——当RSSI在校准值3–6 dB范围内时;far(>3米)——信号较弱时。没有数学模型能在不进行额外处理的情况下提供优于±1米的精度。
RSSI是一个噪声指标,其精度取决于多种因素。主要误差来源:障碍物(墙壁、家具、人体)各使信号衰减3–15 dB,多径传播(墙壁反射)可能在某些点增强信号而在另一些点减弱信号,天线方向在设备旋转时使RSSI变化3–10 dB。
人体是BLE信号最强的吸收体之一。如果信标和智能手机之间存在人,RSSI可能下降10–20 dB。人体内的水分能有效吸收2.4 GHz频率的无线电辐射。因此,商店门上的信标对不同身高和体型的顾客可能显示不同的RSSI。
其他因素:相邻信道上的Wi-Fi干扰可能使RSSI降低3–5 dB,BLE芯片温度影响RSSI测量精度(某些芯片漂移达1 dB/°C),信标电池退化会降低TX Power,导致接收端的RSSI偏低。
原始RSSI不适合精确计算——它包含过多噪声和异常值。为获得稳定的距离估算,需采用滤波方法。最简单的是滑动平均:取最后N个RSSI值的算术平均值。通常N = 5–10足以平滑短期波动。
// RSSI的卡尔曼滤波器
class RssiKalmanFilter(
private val processNoise: Double = 0.01,
private val measurementNoise: Double = 1.0
) {
private var estimate: Double = 0.0
private var errorCovariance: Double = 1.0
fun filter(rawRssi: Double): Double {
// 预测
errorCovariance += processNoise
// 更新
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
卡尔曼滤波器——更高级的方法,考虑了RSSI变化的动态特性,且延迟比滑动平均更小。对于固定信标(静止),滑动平均可获得可接受的结果。对于移动设备,卡尔曼滤波器更优,因为它能更快适应变化。此外,可使用中值滤波器剔除异常值。
iOS Core Bluetooth在RSSI读取完成后通过peripheral.rssi(NSNumber)属性提供RSSI。要获取广播包的RSSI,使用advertisementData[CBAdvertisementDataRSSIKey]。iOS返回三个信道的平均值作为RSSI。如需持续监控RSSI,调用readRSSI的频率不超过每秒1次。
// 在iOS上获取RSSI
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// 过滤弱信号
guard signalStrength > -90 else {
return
}
print("设备 " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android通过回调onScanResult提供RSSI:result.getRssi()。RSSI值为最后一个广播包的RSSI(非平均值)。为获得稳定的读数,需累积多个值并应用滤波。如果广播包中包含TX Power Level,Android还通过result.getScanRecord().getTxPowerLevel()提供该值。
// 在Android上获取RSSI
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// 应用卡尔曼滤波器
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
开发使用RSSI进行定位的应用时,请注意:iOS中的RSSI值因硬件校准而更稳定,Android中的RSSI值噪声更大且取决于设备制造商。对于跨平台项目,建议在应用端实现滤波,并为每个平台设置可配置参数。
常见问题
不能,RSSI仅提供大致估算,在实际条件下精度为±2–5米。精确定位需要来自多个扫描仪的三角测量、卡尔曼滤波以及考虑发射器的TX Power。
由于多径传播和无线电信号的波动。墙壁和物体的反射产生干涉,导致信号有时增强、有时减弱。静止设备上RSSI变化5–10 dB是正常现象。
iOS建议调用readRSSI的频率不超过每秒1次。过于频繁的请求可能导致数据包丢失。如需在扫描期间监控RSSI,可使用每个广播包均有的CBAdvertisementDataRSSIKey。
TX Power Level——广播包中标明的发射功率(dBm)。RSSI + TX Power =信号从发射器到接收器的总衰减。知道TX Power后,可更精确地估算距离:RSSI - TX Power =路径损耗(Path Loss)。
对于固定信标——采用5–10个值的窗口滑动平均。对于移动设备——采用小过程噪声(0.01–0.05)的卡尔曼滤波器。为剔除异常值,可添加中值滤波器,截断超出2个标准偏差的值。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。