RSSI (Received Signal Strength Indicator) es una métrica numérica que mide la potencia de la señal de un dispositivo BLE en dBm en el lado receptor. Los valores de RSSI van desde -30 dBm (dispositivo cercano) hasta -100 dBm (en el límite de detección). Bluetooth Core Specification 5.4 (2023) define RSSI como un parámetro opcional disponible en cada paquete de publicidad y paquete de datos. RSSI se utiliza para la estimación de distancia y el filtrado de dispositivos por nivel de señal, pero es un indicador impreciso: le afectan obstáculos, propagación multitrayecto y tipo de antena. Para un posicionamiento preciso se utilizan triangulación y filtrado Kalman.
Puntos clave
RSSI (Received Signal Strength Indicator) es una medición de la potencia de la señal de radio recibida por el receptor BLE en el momento de recibir un paquete. En BLE, RSSI se mide para cada paquete de publicidad y cada paquete de datos después de la conexión. RSSI es una escala logarítmica donde cada paso de 1 dBm corresponde aproximadamente a un cambio de 1.26 veces en la potencia de la señal.
RSSI es un indicador dependiente del hardware: diferentes chips BLE (nRF, TI, Dialog, Broadcom) y diferentes antenas pueden mostrar distintos valores de RSSI para la misma señal. Por lo tanto, comparar RSSI entre diferentes dispositivos es incorrecto. Incluso dos smartphones idénticos con el mismo SO pueden mostrar una diferencia de 2–5 dBm para el mismo beacon.
En un paquete de publicidad, RSSI se mide para cada uno de los tres canales (37, 38, 39). Los valores pueden diferir en 3–10 dBm entre canales debido a interferencias de frecuencia. Las pilas BLE modernas informan RSSI promediado en todos los canales o RSSI para cada paquete individualmente. iOS Core Bluetooth proporciona RSSI promedio, Android proporciona RSSI del último paquete.
El rango típico de RSSI para BLE es de -30 dBm a -100 dBm. Los valores fuera de este rango son extremadamente raros: -20 dBm significa que el dispositivo está tocando literalmente la antena del escáner, mientras que -105 dBm significa ausencia total de señal. Los fabricantes de chips pueden limitar el rango: por ejemplo, nRF52832 informa RSSI de -40 a -105 dBm.
| RSSI (dBm) | Calidad de señal | Distancia aproximada | Recomendación |
|---|---|---|---|
| -30 – -50 | Excelente | 0–1 m | Dispositivo cercano |
| -51 – -70 | Buena | 1–5 m | Dentro de la habitación |
| -71 – -85 | Media | 5–15 m | Aceptable para beacons |
| -86 – -95 | Débil | 15–30 m | Conexión no fiable |
| Por debajo de -95 | Crítica | 30+ m | En el límite de detección |
TX Power Level es la potencia del transmisor que se indica en el paquete de publicidad (AD Type 0x0A) y permite ajustar la estimación. RSSI -70 dBm de un dispositivo con TX Power +4 dBm significa que la señal se ha atenuado en 74 dB. Si se desconoce TX Power, la estimación precisa de distancia es imposible. iBeacon incluye TX Power (1 byte) en la estructura Manufacturer Data para la calibración de distancia.
El modelo Path Loss (pérdida de propagación) se utiliza para estimar la distancia a partir de RSSI. La fórmula básica: RSSI = TX_Power - 10 × n × log10(d), donde n es el coeficiente de atenuación (2.0 para espacio libre, 3.0–4.5 para interiores con obstáculos) y d es la distancia en metros. En la práctica, la precisión de la estimación es de ±2–5 m en condiciones reales.
Para calibrar el modelo, es necesario medir RSSI a una distancia conocida (generalmente 1 m) y calcular la referencia de TX Power. En iBeacon, este parámetro se almacena en el paquete. Eddystone utiliza un mecanismo similar. Después de la calibración, se puede calcular la distancia: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Según Apple Core Bluetooth Programming Guide (2024), la precisión de la estimación de distancia para iBeacon es: immediate (<0.5 m) — cuando RSSI está por encima del valor de calibración, near (0.5–3 m) — cuando RSSI está dentro de 3–6 dB del valor de calibración, far (>3 m) — con señal débil. Ningún modelo matemático proporciona una precisión superior a ±1 m sin procesamiento adicional.
RSSI es un indicador ruidoso, y su precisión depende de muchos factores. Las principales fuentes de error: los obstáculos (paredes, muebles, personas) atenúan la señal entre 3–15 dB cada uno, la propagación multitrayecto (reflexiones en las paredes) puede amplificar la señal en algunos puntos y atenuarla en otros, la orientación de la antena cambia RSSI entre 3–10 dB al girar el dispositivo.
El cuerpo humano es uno de los absorbentes más fuertes de la señal BLE. Si hay una persona entre el beacon y el smartphone, RSSI puede caer entre 10–20 dB. El agua en el cuerpo humano absorbe eficazmente la radiación de radio a 2.4 GHz. Por lo tanto, los beacons en las puertas de las tiendas pueden mostrar diferente RSSI para clientes de diferentes alturas y constituciones.
Factores adicionales: la interferencia Wi-Fi en canales adyacentes puede reducir RSSI entre 3–5 dB, la temperatura del chip BLE afecta la precisión de la medición de RSSI (algunos chips se desvían hasta 1 dB/°C), la degradación de la batería en el beacon reduce TX Power, lo que lleva a un RSSI más bajo en el receptor.
RSSI bruto no es adecuado para cálculos precisos: contiene demasiado ruido y valores atípicos. Se utilizan métodos de filtrado para obtener una estimación de distancia estable. El más simple es la media móvil: se toma la media aritmética de los últimos N valores de RSSI. Generalmente N = 5–10 es suficiente para suavizar fluctuaciones a corto plazo.
// Filtro Kalman para 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 {
// Predecir
errorCovariance += processNoise
// Actualizar
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
El filtro Kalman es un método más avanzado que tiene en cuenta la dinámica del cambio de RSSI y proporciona menos retraso que la media móvil. Para beacons estacionarios (fijos), la media móvil da resultados aceptables. Para dispositivos en movimiento, el filtro Kalman es preferible porque se adapta más rápido a los cambios. Adicionalmente, se puede usar un filtro Mediana para descartar valores atípicos.
iOS Core Bluetooth proporciona RSSI a través de la propiedad peripheral.rssi (NSNumber) después de completar la lectura de RSSI. Para obtener el RSSI del paquete de publicidad, use advertisementData[CBAdvertisementDataRSSIKey]. iOS devuelve RSSI como un valor promedio en los tres canales. Para monitoreo continuo de RSSI, llame a readRSSI con intervalos de no más de una vez por segundo.
// Obtener RSSI en iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filtrar señales débiles
guard signalStrength > -90 else {
return
}
print("Dispositivo " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android proporciona RSSI a través del callback onScanResult: result.getRssi(). El valor RSSI es el RSSI del último paquete de publicidad (no un promedio). Para obtener lecturas estables, es necesario acumular varios valores y aplicar filtrado. Android también proporciona TX Power Level a través de result.getScanRecord().getTxPowerLevel(), si se transmite en el paquete de publicidad.
// Obtener RSSI en Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Aplicar filtro Kalman
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Al desarrollar aplicaciones que usan RSSI para posicionamiento, tenga en cuenta: en iOS los valores de RSSI son más estables gracias a la calibración de hardware; en Android son más ruidosos y dependen del fabricante del dispositivo. Para proyectos multiplataforma, se recomienda implementar filtrado en el lado de la aplicación con parámetros configurables para cada plataforma.
Preguntas frecuentes
No, RSSI proporciona solo una estimación aproximada de la distancia con una precisión de ±2–5 m en condiciones reales. Para un posicionamiento preciso se requiere triangulación desde múltiples escáneres, filtrado Kalman y consideración de TX Power.
Debido a la propagación multitrayecto y las fluctuaciones de la señal de radio. Los reflejos en paredes y objetos crean interferencias donde la señal se fortalece y debilita alternativamente. Los cambios de RSSI de 5–10 dB en un dispositivo estacionario son normales.
iOS recomienda llamar a readRSSI no más de una vez por segundo. Las solicitudes demasiado frecuentes pueden provocar la pérdida de paquetes de datos. Para monitorear RSSI durante el escaneo, use CBAdvertisementDataRSSIKey, que está disponible para cada paquete de publicidad.
TX Power Level es la potencia del transmisor en dBm indicada en el paquete de publicidad. RSSI + TX Power = atenuación total de la señal desde el transmisor hasta el receptor. Conociendo TX Power se puede estimar la distancia con mayor precisión: RSSI - TX Power = Path Loss (pérdida de trayecto).
Para beacons estacionarios — media móvil con una ventana de 5–10 valores. Para dispositivos en movimiento — filtro Kalman con bajo ruido de proceso (0.01–0.05). Para descartar valores atípicos, agregue un filtro Mediana que elimine los valores fuera de 2 desviaciones estándar.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también