RSSI in BLE — signal indicator and distance estimation

Author: IT Sectr Published: 2026-07-16 Reading time: 10 min

RSSI (Received Signal Strength Indicator) is a numerical metric that measures the power of a BLE device signal in dBm at the receiving side. RSSI values range from -30 dBm (device nearby) to -100 dBm (at the detection limit). Bluetooth Core Specification 5.4 (2023) defines RSSI as an optional parameter available in every advertising packet and data packet. RSSI is used for range estimation and filtering devices by signal level, but it is an inaccurate indicator: it is affected by obstacles, multipath propagation and antenna type. Triangulation and Kalman filtering are used for precise positioning.

Key Takeaways

  • RSSI is the BLE signal power level in dBm measured at the receiving side when a packet is received.
  • RSSI range: from -30 dBm (very strong signal) to -100 dBm (detection limit).
  • RSSI is used for distance estimation using the Path Loss model, but accuracy is ±2–5 m in real conditions.
  • RSSI is affected by: obstacles (walls, people), multipath propagation and antenna orientation.
  • To improve accuracy, Kalman filtering, moving average and triangulation from multiple scanners are used.

What is RSSI in BLE?

RSSI (Received Signal Strength Indicator) is a measurement of the radio signal power received by the BLE receiver at the moment of packet reception. In BLE, RSSI is measured for every advertising packet and every data packet after connection. RSSI is a logarithmic scale where each step of 1 dBm roughly corresponds to a 1.26x change in signal power.

RSSI is a hardware-dependent indicator: different BLE chips (nRF, TI, Dialog, Broadcom) and different antennas can show different RSSI values for the same signal. Therefore, comparing RSSI between different devices is incorrect. Even two identical smartphones on the same OS can show a difference of 2–5 dBm for the same beacon.

In an advertising packet, RSSI is measured for each of the three channels (37, 38, 39). Values can differ by 3–10 dBm between channels due to frequency interference. Modern BLE stacks report either averaged RSSI across all channels or RSSI for each packet individually. iOS Core Bluetooth provides average RSSI, Android provides the last packet's RSSI.

RSSI Value Range

Typical RSSI range for BLE is from -30 dBm to -100 dBm. Values outside this range are extremely rare: -20 dBm means the device is literally touching the scanner antenna, while -105 dBm means complete signal absence. Chip manufacturers may limit the range: for example, nRF52832 reports RSSI from -40 to -105 dBm.

RSSI (dBm)Signal QualityApproximate DistanceRecommendation
-30 – -50Excellent0–1 mDevice nearby
-51 – -70Good1–5 mWithin the room
-71 – -85Fair5–15 mAcceptable for beacons
-86 – -95Weak15–30 mUnreliable connection
Below -95Critical30+ mAt detection limit

TX Power Level is the transmitter power specified in the advertising packet (AD Type 0x0A) and allows adjusting the estimate. RSSI -70 dBm from a device with TX Power +4 dBm means the signal has attenuated by 74 dB. If TX Power is unknown, accurate distance estimation is impossible. iBeacon includes TX Power (1 byte) in the Manufacturer Data structure for distance calibration.

RSSI vs Distance

Path Loss model is used to estimate distance from RSSI. The basic formula: RSSI = TX_Power - 10 × n × log10(d), where n is the attenuation coefficient (2.0 for free space, 3.0–4.5 for indoor environments with obstacles), and d is the distance in meters. In practice, the estimation accuracy is ±2–5 m in real conditions.

To calibrate the model, you need to measure RSSI at a known distance (usually 1 m) and compute the TX Power reference. In iBeacon, this parameter is stored in the packet. Eddystone uses a similar mechanism. After calibration, you can compute distance: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).

According to Apple Core Bluetooth Programming Guide (2024), iBeacon distance estimation accuracy is: immediate (<0.5 m) — when RSSI is above the calibration value, near (0.5–3 m) — when RSSI is within 3–6 dB of the calibration value, far (>3 m) — with weak signal. No mathematical model provides better than ±1 m accuracy without additional processing.

Factors Affecting RSSI Accuracy

RSSI is a noisy indicator, and its accuracy depends on many factors. The main sources of error: obstacles (walls, furniture, people) attenuate the signal by 3–15 dB each, multipath propagation (reflections from walls) can amplify the signal at some points and attenuate it at others, antenna orientation changes RSSI by 3–10 dB when rotating the device.

The human body is one of the strongest absorbers of BLE signal. If a person is between the beacon and the smartphone, RSSI can drop by 10–20 dB. Water in the human body effectively absorbs radio radiation at 2.4 GHz. Therefore, beacons on store doors may show different RSSI for customers of different heights and body types.

Additional factors: Wi-Fi interference on adjacent channels can reduce RSSI by 3–5 dB, temperature of the BLE chip affects RSSI measurement accuracy (some chips drift up to 1 dB/°C), battery degradation on the beacon reduces TX Power, leading to lower RSSI at the receiver.

RSSI Filtering and Smoothing

Raw RSSI is unsuitable for accurate calculations — it contains too much noise and outliers. Filtering methods are used to obtain a stable distance estimate. The simplest is the moving average: the arithmetic mean of the last N RSSI values is taken. N = 5–10 is usually sufficient to smooth out short-term fluctuations.

kotlin
// Kalman filter for 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 {
        // Predict
        errorCovariance += processNoise

        // Update
        val kalmanGain =
            errorCovariance /
            (errorCovariance + measurementNoise)

        estimate = estimate +
            kalmanGain * (rawRssi - estimate)

        errorCovariance =
            (1.0 - kalmanGain) * errorCovariance

        return estimate
    }
}

Kalman filter is a more advanced method that accounts for the dynamics of RSSI change and provides less delay than a moving average. For stationary beacons (fixed), the moving average gives acceptable results. For moving devices, the Kalman filter is preferable because it adapts faster to changes. Additionally, a Median filter can be used to discard outliers.

Getting RSSI on iOS and Android

iOS Core Bluetooth provides RSSI through the peripheral.rssi property (NSNumber) after RSSI reading completes. To get advertising packet RSSI, use advertisementData[CBAdvertisementDataRSSIKey]. iOS returns RSSI as an average value across three channels. For continuous RSSI monitoring, call readRSSI at intervals no more than once per second.

swift
// Get RSSI on iOS
func centralManager(
    _ central: CBCentralManager,
    didDiscover peripheral: CBPeripheral,
    advertisementData: [String: Any],
    rssi RSSI: NSNumber
) {
    let signalStrength = Int(truncating: RSSI)

    // Filter weak signals
    guard signalStrength > -90 else {
        return
    }

    print("Device " +
          "\(peripheral.name ?? "unknown") " +
          "RSSI: \(signalStrength) dBm")
}

Android provides RSSI through the onScanResult callback: result.getRssi(). The RSSI value is the RSSI of the last advertising packet (not an average). For stable readings, you need to accumulate several values and apply filtering. Android also provides TX Power Level via result.getScanRecord().getTxPowerLevel(), if it is transmitted in the advertising packet.

kotlin
// Get RSSI on Android
private val scanCallback = object : ScanCallback() {

    override fun onScanResult(
        callbackType: Int,
        result: ScanResult
    ) {
        val rssi = result.rssi
        val txPower = result.scanRecord?.
            txPowerLevel ?: -128

        // Apply Kalman filter
        val filtered = kalmanFilter.
            filter(rssi.toDouble())

        Log.d("BLEScanner",
            "RSSI: $rssi, " +
            "Filtered: $filtered, " +
            "TX: $txPower")
    }
}

When developing applications that use RSSI for positioning, keep in mind: on iOS, RSSI values are more stable due to hardware calibration; on Android, they are noisier and depend on the device manufacturer. For cross-platform projects, it is recommended to implement filtering on the application side with configurable parameters for each platform.

Frequently Asked Questions

Can distance be accurately determined by RSSI?

No, RSSI provides only a rough estimate of distance with ±2–5 m accuracy in real conditions. For precise positioning, triangulation from multiple scanners, Kalman filtering and TX Power accounting are required.

Why does RSSI change even when the device is not moving?

Due to multipath propagation and radio signal fluctuations. Reflections from walls and objects create interference where the signal alternately strengthens and weakens. RSSI changes of 5–10 dB on a stationary device are normal.

How often can RSSI be read on iOS?

iOS recommends calling readRSSI no more than once per second. Too frequent requests may lead to data packet loss. For RSSI monitoring during scanning, use CBAdvertisementDataRSSIKey, which is available for every advertising packet.

What is TX Power Level and how is it related to RSSI?

TX Power Level is the transmitter power in dBm specified in the advertising packet. RSSI + TX Power = total signal attenuation from transmitter to receiver. Knowing TX Power allows more accurate distance estimation: RSSI - TX Power = Path Loss.

Which RSSI filtering method is best for beacons?

For stationary beacons — moving average with a window of 5–10 values. For moving devices — Kalman filter with low process noise (0.01–0.05). To discard outliers, add a Median filter that cuts off values outside 2 standard deviations.

Summary

  • RSSI is a BLE signal power indicator in dBm measured at the receiving side upon receiving each packet.
  • Value range: from -30 dBm (excellent signal) to -100 dBm (weak signal at detection limit).
  • RSSI provides a rough distance estimate with ±2–5 m accuracy, but is not an accurate rangefinder due to noise and interference.
  • Main sources of error: obstacles (walls, people), multipath propagation, antenna orientation and Wi-Fi interference.
  • For stable distance estimation, Kalman filtering, moving average and Median filter for outlier removal are used.
  • On iOS, RSSI is the average across three channels; on Android, it is the last packet value, requiring filtering on the application side.
  • TX Power Level in the advertising packet together with RSSI gives Path Loss — total signal attenuation for more accurate distance estimation.

We will develop a mobile application turnkey

IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.

Discuss the project

Read also