BLE中的RSSI——信号指示器与距离估算

作者: IT Sectr 发布日期: 2026-07-16 阅读时间: 10 分钟

RSSI(接收信号强度指示器)是一种数值指标,用于在接收端测量BLE设备的信号功率(单位为dBm)。RSSI值范围从-30 dBm(设备在附近)到-100 dBm(检测极限)。蓝牙核心规范5.4(2023)将RSSI定义为可选参数,每个广播包和数据包中均可用。RSSI用于估算距离(range estimation)和按信号强度过滤设备,但并非精确指标:它会受到障碍物、多径传播和天线类型的影响。精确定位需采用三角测量和卡尔曼滤波。

要点

  • RSSI——在接收数据包时于接收端测量的BLE信号功率水平(dBm)。
  • RSSI范围:从-30 dBm(极强信号)到-100 dBm(检测极限)。
  • RSSI用于基于路径损耗模型的距离估算,但在实际条件下精度为±2–5米。
  • 影响RSSI的因素:障碍物(墙壁、人体)、多径传播和天线方向。
  • 提高精度需采用卡尔曼滤波、滑动平均和来自多个扫描仪的三角测量。

BLE中的RSSI是什么?

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。

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 – -9515–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估算距离。基本公式: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精度的因素

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滤波与平滑

原始RSSI不适合精确计算——它包含过多噪声和异常值。为获得稳定的距离估算,需采用滤波方法。最简单的是滑动平均:取最后N个RSSI值的算术平均值。通常N = 5–10足以平滑短期波动。

kotlin
// 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和Android中获取RSSI

iOS Core Bluetooth在RSSI读取完成后通过peripheral.rssi(NSNumber)属性提供RSSI。要获取广播包的RSSI,使用advertisementData[CBAdvertisementDataRSSIKey]。iOS返回三个信道的平均值作为RSSI。如需持续监控RSSI,调用readRSSI的频率不超过每秒1次。

swift
// 在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()提供该值。

kotlin
// 在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精确确定距离?

不能,RSSI仅提供大致估算,在实际条件下精度为±2–5米。精确定位需要来自多个扫描仪的三角测量、卡尔曼滤波以及考虑发射器的TX Power。

为什么设备不移动时RSSI也会变化?

由于多径传播和无线电信号的波动。墙壁和物体的反射产生干涉,导致信号有时增强、有时减弱。静止设备上RSSI变化5–10 dB是正常现象。

在iOS上多久可以读取一次RSSI?

iOS建议调用readRSSI的频率不超过每秒1次。过于频繁的请求可能导致数据包丢失。如需在扫描期间监控RSSI,可使用每个广播包均有的CBAdvertisementDataRSSIKey

什么是TX Power Level?它与RSSI有何关系?

TX Power Level——广播包中标明的发射功率(dBm)。RSSI + TX Power =信号从发射器到接收器的总衰减。知道TX Power后,可更精确地估算距离:RSSI - TX Power =路径损耗(Path Loss)。

哪种RSSI滤波方法最适合信标?

对于固定信标——采用5–10个值的窗口滑动平均。对于移动设备——采用小过程噪声(0.01–0.05)的卡尔曼滤波器。为剔除异常值,可添加中值滤波器,截断超出2个标准偏差的值。

总结

  • RSSI——在接收每个数据包时于接收端测量的BLE信号功率指示(dBm)。
  • 值范围:从-30 dBm(极佳信号)到-100 dBm(检测极限处的弱信号)。
  • RSSI可对距离进行±2–5米精度的粗略估算,但由于噪声和干扰,并非精确测距仪
  • 主要误差来源:障碍物(墙壁、人体)、多径传播、天线方向和Wi-Fi干扰。
  • 稳定距离估算需采用卡尔曼滤波、滑动平均以及用于剔除异常值的中值滤波器。
  • iOS中RSSI为三个信道的平均值,Android中为最后一个数据包的值,这需要在应用端进行滤波。
  • 广播包中的TX Power Level与RSSI共同提供路径损耗——信号的总衰减,用于更精确的距离估算。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读