RSSI (Received Signal Strength Indicator) — är ett numeriskt mätvärde som mäter styrkan hos en BLE-enhets signal i dBm på mottagarsidan. RSSI-värdet varierar från -30 dBm (enhet i närheten) till -100 dBm (vid detektionsgränsen). Bluetooth Core Specification 5.4 (2023) definierar RSSI som en valfri parameter som finns i varje reklampaket och datapaket. RSSI används för avståndsuppskattning (range estimation) och filtrering av enheter efter signalstyrka, men är en inexakt indikator: det påverkas av hinder, flervägsutbredning och antenntyp. För noggrann positionering används triangulering och Kalman-filtrering.
Huvudpunkter
RSSI (Received Signal Strength Indicator) — är mätningen av radiosignalstyrkan som tas emot av BLE-mottagaren vid paketmottagningstillfället. I BLE mäts RSSI för varje reklampaket (advertising) och varje datapaket efter anslutning. RSSI-värdet är en logaritmisk skala, där varje steg på 1 dBm ungefär motsvarar en förändring av signalstyrkan med 1,26 gånger.
RSSI är en maskinvaruberoende indikator: olika BLE-chips (nRF, TI, Dialog, Broadcom) och olika antenner kan visa olika RSSI-värden för samma signal. Därför är jämförelse av RSSI mellan olika enheter felaktig. Även två identiska smartphones med samma operativsystem kan visa en skillnad på 2–5 dBm för samma beacon.
I reklampaketet mäts RSSI för var och en av de tre kanalerna (37, 38, 39). Värdena kan skilja sig med 3–10 dBm mellan kanalerna på grund av frekvensstörningar. Moderna BLE-stackar rapporterar genomsnittligt RSSI över alla kanaler eller RSSI för varje paket separat. iOS Core Bluetooth tillhandahåller genomsnittligt RSSI, Android — RSSI för det senaste paketet.
Typiskt RSSI-omfång för BLE är från -30 dBm till -100 dBm. Värden utanför dessa gränser är extremt sällsynta: -20 dBm innebär att enheten bokstavligen vidrör skannerns antenn, och -105 dBm — fullständig frånvaro av signal. Chiptillverkare kan begränsa omfånget: till exempel rapporterar nRF52832 RSSI från -40 till -105 dBm.
| RSSI (dBm) | Signalkvalitet | Ungefärligt avstånd | Rekommendation |
|---|---|---|---|
| -30 – -50 | Utmärkt | 0–1 m | Enhet i närheten |
| -51 – -70 | Bra | 1–5 m | Inom rummet |
| -71 – -85 | Medel | 5–15 m | Acceptabelt för beacons |
| -86 – -95 | Svag | 15–30 m | Opålitlig anslutning |
| Under -95 | Kritisk | 30+ m | Vid detektionsgränsen |
TX Power Level — sändareffekten, som anges i reklampaketet (AD Type 0x0A) och möjliggör korrigering av uppskattningen. RSSI -70 dBm från en enhet med TX Power +4 dBm innebär att signalen har dämpats med 74 dB. Om TX Power är okänd är noggrann avståndsuppskattning omöjlig. iBeacon innehåller TX Power (1 byte) i Manufacturer Data-strukturen för avståndskalibrering.
Path Loss-modellen (utbredningsförluster) används för att uppskatta avstånd baserat på RSSI. Grundformeln: RSSI = TX_Power - 10 × n × log10(d), där n — dämpningskoefficient (2,0 för fritt utrymme, 3,0–4,5 för utrymmen med hinder), d — avstånd i meter. I praktiken är uppskattningsnoggrannheten ±2–5 m i verkliga förhållanden.
För att kalibrera modellen måste RSSI mätas på ett känt avstånd (vanligtvis 1 m) och TX Power-referensen beräknas. I iBeacon lagras denna parameter i paketet. I Eddystone används en liknande mekanism. Efter kalibrering kan avståndet beräknas: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Enligt Apple Core Bluetooth Programming Guide (2024) är noggrannheten för avståndsuppskattning för iBeacon: immediate (<0,5 m) — när RSSI är högre än kalibreringsvärdet, near (0,5–3 m) — när RSSI är inom 3–6 dB från kalibreringsvärdet, far (>3 m) — vid svag signal. Ingen matematisk modell ger bättre noggrannhet än ±1 m utan ytterligare bearbetning.
RSSI är en brusig indikator och dess noggrannhet beror på många faktorer. De främsta felkällorna: hinder (väggar, möbler, människor) dämpar signalen med 3–15 dB vardera, flervägsutbredning (reflektioner från väggar) kan förstärka signalen på vissa punkter och dämpa på andra, antennorientering ändrar RSSI med 3–10 dB vid rotation av enheten.
Människokroppen är en av de starkaste absorbenterna av BLE-signal. Om en person befinner sig mellan beacone och smartphonen kan RSSI sjunka med 10–20 dB. Vatten i människokroppen absorberar effektivt radiostrålning vid frekvensen 2,4 GHz. Därför kan beacons på butiksdörrar visa olika RSSI för kunder med olika längd och kroppsbyggnad.
Ytterligare faktorer: Wi-Fi-störningar på angränsande kanaler kan minska RSSI med 3–5 dB, temperatur hos BLE-chippet påverkar RSSI-mätnoggrannheten (hos vissa chips drift upp till 1 dB/°C), batteriförsämring i beacone minskar TX Power, vilket leder till lägre RSSI på mottagarsidan.
Rå RSSI är inte lämplig för noggranna beräkningar — den innehåller för mycket brus och avvikande värden. För att få en stabil avståndsuppskattning används filtreringsmetoder. Den enklaste — glidande medelvärde: det aritmetiska medelvärdet av de senaste N RSSI-värdena tas. N = 5–10 är vanligtvis tillräckligt för att jämna ut kortvariga fluktuationer.
// Kalman-filter för 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 {
// Förutsäg
errorCovariance += processNoise
// Uppdatera
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Kalman-filter — en mer avancerad metod som tar hänsyn till dynamiken i RSSI-förändringar och ger mindre fördröjning än glidande medelvärde. För stationära beacons (orörliga) ger glidande medelvärde ett acceptabelt resultat. För rörliga enheter är Kalman-filtret att föredra eftersom det anpassar sig snabbare till förändringar. Dessutom kan ett Median-filter användas för att kassera avvikande värden.
iOS Core Bluetooth tillhandahåller RSSI via egenskapen peripheral.rssi (NSNumber) efter att RSSI-avläsningen är klar. För att hämta RSSI för reklampaketet, använd advertisementData[CBAdvertisementDataRSSIKey]. iOS returnerar RSSI som medelvärde över tre kanaler. För kontinuerlig RSSI-övervakning, anropa readRSSI med ett intervall på högst 1 gång per sekund.
// Hämta RSSI på iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filtrera svaga signaler
guard signalStrength > -90 else {
return
}
print("Enhet " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android tillhandahåller RSSI via callbacken onScanResult: result.getRssi(). RSSI-värdet är RSSI för det senaste reklampaketet (inte medelvärdet). För stabila avläsningar måste flera värden samlas in och filtrering tillämpas. Android tillhandahåller även TX Power Level via result.getScanRecord().getTxPowerLevel(), om det sänds i reklampaketet.
// Hämta RSSI på Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Använd Kalman-filter
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Vid utveckling av applikationer som använder RSSI för positionering, beakta: i iOS är RSSI-värden mer stabila tack vare hårdvarukalibrering, i Android — mer brusiga och beroende av enhetstillverkaren. För plattformsoberoende projekt rekommenderas att implementera filtrering på applikationssidan med konfigurerbara parametrar för varje plattform.
Vanliga frågor
Nej, RSSI ger endast en ungefärlig uppskattning av avståndet med en noggrannhet på ±2–5 m i verkliga förhållanden. För exakt positionering krävs triangulering från flera skannrar, Kalman-filtrering och hänsyn till sändarens TX Power.
På grund av flervägsutbredning och fluktuationer i radiosignalen. Reflektioner från väggar och föremål skapar interferens där signalen ibland förstärks och ibland dämpas. Förändringar av RSSI med 5–10 dB på en stillastående enhet är normalt.
iOS rekommenderar att readRSSI anropas högst 1 gång per sekund. Alltför frekventa förfrågningar kan leda till förlust av datapaket. För RSSI-övervakning under skanning, använd CBAdvertisementDataRSSIKey som är tillgängligt för varje reklampaket.
TX Power Level — sändareffekten i dBm som anges i reklampaketet. RSSI + TX Power = total signaldämpning på vägen från sändare till mottagare. Med kännedom om TX Power kan avståndet uppskattas mer exakt: RSSI - TX Power = Path Loss (vägförluster).
För stationära beacons — glidande medelvärde med ett fönster på 5–10 värden. För rörliga enheter — Kalman-filter med lågt processbrus (0,01–0,05). För att kassera avvikande värden, lägg till ett Median-filter som kapar värden utanför 2 standardavvikelser.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också