RSSI in BLE — indicatore di segnale e stima della distanza

Autore: IT Sectr Pubblicato: 2026-07-16 Tempo di lettura: 10 min

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 è il livello di potenza del segnale BLE in dBm misurato sul lato ricevente al ricevimento di un pacchetto.
  • Intervallo RSSI: da -30 dBm (segnale molto forte) a -100 dBm (limite di rilevamento).
  • RSSI viene utilizzato per la stima della distanza tramite il modello Path Loss, ma la precisione è di ±2–5 m in condizioni reali.
  • RSSI è influenzato da: ostacoli (muri, persone), propagazione multipercorso e orientamento dell'antenna.
  • Per migliorare la precisione vengono utilizzati filtraggio Kalman, media mobile e triangolazione da più scanner.

Cos'è RSSI in BLE?

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.

Intervallo dei valori RSSI

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 segnaleDistanza approssimativaRaccomandazione
-30 – -50Eccellente0–1 mDispositivo vicino
-51 – -70Buona1–5 mNella stanza
-71 – -85Media5–15 mAccettabile per beacon
-86 – -95Debole15–30 mConnessione inaffidabile
Sotto -95Critica30+ mAl 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.

Relazione RSSI-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.

Fattori che influenzano la precisione di RSSI

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.

Filtraggio e livellamento di RSSI

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.

kotlin
// 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.

Ottenere RSSI su iOS e Android

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.

swift
// 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.

kotlin
// 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

Si può determinare con precisione la distanza tramite RSSI?

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.

Perché RSSI cambia anche quando il dispositivo non si muove?

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.

Con quale frequenza si può leggere RSSI su iOS?

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.

Cos'è TX Power Level e come si relaziona con RSSI?

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).

Quale metodo di filtraggio RSSI è migliore per i beacon?

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

  • RSSI è un indicatore di potenza del segnale BLE in dBm misurato sul lato ricevente al ricevimento di ogni pacchetto.
  • Intervallo di valori: da -30 dBm (segnale eccellente) a -100 dBm (segnale debole al limite di rilevamento).
  • RSSI fornisce una stima approssimativa della distanza con precisione di ±2–5 m, ma non è un telemetro preciso a causa di rumore e interferenze.
  • Principali fonti di errore: ostacoli (muri, persone), propagazione multipercorso, orientamento dell'antenna e interferenze Wi-Fi.
  • Per una stima stabile della distanza vengono utilizzati filtraggio Kalman, media mobile e filtro Mediana per rimuovere i valori anomali.
  • Su iOS, RSSI è la media dei tre canali; su Android, è il valore dell'ultimo pacchetto, richiedendo filtraggio sul lato applicazione.
  • TX Power Level nel pacchetto advertising insieme a RSSI fornisce Path Loss — l'attenuazione totale del segnale per una stima più accurata della distanza.

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.

Discuti il progetto

Leggi anche