RSSI (Received Signal Strength Indicator) è una metrica numerica che misura la potenza del segnale di un dispositivo BLE in dBm sul lato ricevente. I valori RSSI vanno da -30 dBm (dispositivo vicino) a -100 dBm (al limite di rilevamento). Bluetooth Core Specification 5.4 (2023) definisce RSSI come parametro opzionale disponibile in ogni pacchetto advertising e pacchetto dati. RSSI viene utilizzato per la stima della distanza e il filtraggio dei dispositivi per livello di segnale, ma è un indicatore impreciso: è influenzato da ostacoli, propagazione multipercorso e tipo di antenna. Per un posizionamento preciso vengono utilizzati triangolazione e filtraggio di Kalman.
Punti chiave
RSSI (Received Signal Strength Indicator) è una misura della potenza del segnale radio ricevuta dal ricevitore BLE al momento della ricezione del pacchetto. In BLE, RSSI viene misurato per ogni pacchetto advertising e ogni pacchetto dati dopo la connessione. RSSI è una scala logaritmica dove ogni passo di 1 dBm corrisponde approssimativamente a una variazione di 1,26 volte della potenza del segnale.
RSSI è un indicatore dipendente dall'hardware: diversi chip BLE (nRF, TI, Dialog, Broadcom) e diverse antenne possono mostrare valori RSSI diversi per lo stesso segnale. Pertanto, confrontare RSSI tra dispositivi diversi non è corretto. Anche due smartphone identici sullo stesso sistema operativo possono mostrare una differenza di 2–5 dBm per lo stesso beacon.
In un pacchetto advertising, RSSI viene misurato per ciascuno dei tre canali (37, 38, 39). I valori possono differire di 3–10 dBm tra canali a causa di interferenze di frequenza. Gli stack BLE moderni riportano RSSI medio su tutti i canali o RSSI per ogni pacchetto individualmente. iOS Core Bluetooth fornisce RSSI medio, Android fornisce RSSI dell'ultimo pacchetto.
L'intervallo tipico di RSSI per BLE è da -30 dBm a -100 dBm. I valori al di fuori di questo intervallo sono estremamente rari: -20 dBm significa che il dispositivo tocca letteralmente l'antenna dello scanner, mentre -105 dBm significa assenza totale di segnale. I produttori di chip possono limitare l'intervallo: ad esempio, nRF52832 riporta RSSI da -40 a -105 dBm.
| RSSI (dBm) | Qualità del segnale | Distanza approssimativa | Raccomandazione |
|---|---|---|---|
| -30 – -50 | Eccellente | 0–1 m | Dispositivo vicino |
| -51 – -70 | Buona | 1–5 m | Nella stanza |
| -71 – -85 | Media | 5–15 m | Accettabile per beacon |
| -86 – -95 | Debole | 15–30 m | Connessione inaffidabile |
| Sotto -95 | Critica | 30+ m | Al limite di rilevamento |
TX Power Level è la potenza del trasmettitore indicata nel pacchetto advertising (AD Type 0x0A) e consente di regolare la stima. Un RSSI di -70 dBm da un dispositivo con TX Power +4 dBm significa che il segnale è stato attenuato di 74 dB. Se TX Power è sconosciuto, una stima accurata della distanza è impossibile. iBeacon include TX Power (1 byte) nella struttura Manufacturer Data per la calibrazione della distanza.
Il modello Path Loss (perdita di propagazione) viene utilizzato per stimare la distanza da RSSI. La formula di base: RSSI = TX_Power - 10 × n × log10(d), dove n è il coefficiente di attenuazione (2,0 per spazio libero, 3,0–4,5 per ambienti interni con ostacoli) e d è la distanza in metri. In pratica, la precisione della stima è di ±2–5 m in condizioni reali.
Per calibrare il modello, è necessario misurare RSSI a una distanza nota (di solito 1 m) e calcolare il riferimento TX Power. In iBeacon, questo parametro è memorizzato nel pacchetto. Eddystone utilizza un meccanismo simile. Dopo la calibrazione, la distanza può essere calcolata: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Secondo Apple Core Bluetooth Programming Guide (2024), la precisione della stima della distanza per iBeacon è: immediate (<0,5 m) — quando RSSI è superiore al valore di calibrazione, near (0,5–3 m) — quando RSSI è entro 3–6 dB dal valore di calibrazione, far (>3 m) — con segnale debole. Nessun modello matematico fornisce una precisione migliore di ±1 m senza elaborazione aggiuntiva.
RSSI è un indicatore rumoroso e la sua precisione dipende da molti fattori. Le principali fonti di errore: gli ostacoli (muri, mobili, persone) attenuano il segnale di 3–15 dB ciascuno, la propagazione multipercorso (riflessioni sulle pareti) può amplificare il segnale in alcuni punti e attenuarlo in altri, l'orientamento dell'antenna modifica RSSI di 3–10 dB ruotando il dispositivo.
Il corpo umano è uno dei più forti assorbitori del segnale BLE. Se una persona si trova tra il beacon e lo smartphone, RSSI può calare di 10–20 dB. L'acqua nel corpo umano assorbe efficacemente le radiazioni radio a 2,4 GHz. Pertanto, i beacon sulle porte dei negozi possono mostrare RSSI diverso per clienti di diversa altezza e corporatura.
Fattori aggiuntivi: le interferenze Wi-Fi sui canali adiacenti possono ridurre RSSI di 3–5 dB, la temperatura del chip BLE influisce sulla precisione di misurazione di RSSI (alcuni chip derivano fino a 1 dB/°C), il degrado della batteria sul beacon riduce TX Power, portando a un RSSI più basso sul ricevitore.
RSSI grezzo non è adatto per calcoli precisi — contiene troppo rumore e valori anomali. Per ottenere una stabile stima della distanza vengono utilizzati metodi di filtraggio. Il più semplice è la media mobile: si prende la media aritmetica degli ultimi N valori RSSI. Generalmente N = 5–10 è sufficiente per livellare le fluttuazioni a breve termine.
// Filtro di Kalman per 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 {
// Prevedere
errorCovariance += processNoise
// Aggiornare
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Il filtro di Kalman è un metodo più avanzato che tiene conto della dinamica del cambiamento di RSSI e fornisce meno ritardo rispetto alla media mobile. Per beacon stazionari (fissi), la media mobile dà risultati accettabili. Per dispositivi in movimento, il filtro di Kalman è preferibile perché si adatta più rapidamente ai cambiamenti. Inoltre, è possibile utilizzare un filtro Mediana per eliminare i valori anomali.
iOS Core Bluetooth fornisce RSSI tramite la proprietà peripheral.rssi (NSNumber) dopo il completamento della lettura RSSI. Per ottenere RSSI del pacchetto advertising, utilizzare advertisementData[CBAdvertisementDataRSSIKey]. iOS restituisce RSSI come valore medio su tre canali. Per il monitoraggio continuo di RSSI, chiamare readRSSI a intervalli non superiori a una volta al secondo.
// Ottenere RSSI su iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filtrare segnali deboli
guard signalStrength > -90 else {
return
}
print("Dispositivo " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android fornisce RSSI tramite il callback onScanResult: result.getRssi(). Il valore RSSI è l'RSSI dell'ultimo pacchetto advertising (non una media). Per letture stabili, è necessario accumulare più valori e applicare filtraggio. Android fornisce anche TX Power Level tramite result.getScanRecord().getTxPowerLevel(), se trasmesso nel pacchetto advertising.
// Ottenere RSSI su Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Applicare filtro Kalman
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Quando si sviluppano applicazioni che utilizzano RSSI per il posizionamento, tenere presente: su iOS, i valori RSSI sono più stabili grazie alla calibrazione hardware; su Android, sono più rumorosi e dipendono dal produttore del dispositivo. Per progetti multipiattaforma, si consiglia di implementare il filtraggio sul lato applicazione con parametri configurabili per ciascuna piattaforma.
Domande frequenti
No, RSSI fornisce solo una stima approssimativa della distanza con una precisione di ±2–5 m in condizioni reali. Per un posizionamento preciso sono necessari triangolazione da più scanner, filtraggio di Kalman e considerazione del TX Power.
A causa della propagazione multipercorso e delle fluttuazioni del segnale radio. Le riflessioni su pareti e oggetti creano interferenze in cui il segnale si alterna tra rafforzamento e indebolimento. Variazioni di RSSI di 5–10 dB su un dispositivo stazionario sono normali.
iOS raccomanda di chiamare readRSSI non più di una volta al secondo. Richieste troppo frequenti possono portare alla perdita di pacchetti dati. Per monitorare RSSI durante la scansione, utilizzare CBAdvertisementDataRSSIKey, disponibile per ogni pacchetto advertising.
TX Power Level è la potenza del trasmettitore in dBm indicata nel pacchetto advertising. RSSI + TX Power = attenuazione totale del segnale dal trasmettitore al ricevitore. Conoscere TX Power consente una stima più accurata della distanza: RSSI - TX Power = Path Loss (perdita di percorso).
Per beacon stazionari — media mobile con finestra di 5–10 valori. Per dispositivi in movimento — filtro di Kalman con basso rumore di processo (0,01–0,05). Per eliminare i valori anomali, aggiungere un filtro Mediana che tagli i valori al di fuori di 2 deviazioni standard.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche