RSSI (Received Signal Strength Indicator) — is een numerieke metriek die de signaalsterkte van een BLE-apparaat in dBm aan de ontvangende zijde meet. De RSSI-waarde varieert van -30 dBm (apparaat in de buurt) tot -100 dBm (op de grens van detectie). Bluetooth Core Specification 5.4 (2023) definieert RSSI als een optionele parameter die beschikbaar is in elk advertentiepakket en datapakket. RSSI wordt gebruikt voor afstandsschatting (range estimation) en filtering van apparaten op signaalniveau, maar is een onnauwkeurige indicator: obstakels, multipath propagation en het type antenne beïnvloeden het. Voor nauwkeurige positionering worden triangulatie en Kalman-filtering toegepast.
Belangrijkste punten
RSSI (Received Signal Strength Indicator) — is de meting van het radiovermogen dat door de BLE-ontvanger wordt ontvangen op het moment van pakketontvangst. In BLE wordt RSSI gemeten voor elk advertentiepakket (advertising) en elk datapakket na verbinding. De RSSI-waarde is een logaritmische schaal, waarbij elke stap van 1 dBm overeenkomt met ongeveer een 1,26-voudige verandering van het signaalvermogen.
RSSI is een hardware-afhankelijke indicator: verschillende BLE-chips (nRF, TI, Dialog, Broadcom) en verschillende antennes kunnen verschillende RSSI-waarden tonen voor hetzelfde signaal. Daarom is vergelijking van RSSI tussen verschillende apparaten onjuist. Zelfs twee identieke smartphones met hetzelfde besturingssysteem kunnen een verschil van 2–5 dBm tonen voor dezelfde beacon.
In het advertentiepakket wordt RSSI gemeten voor elk van de drie kanalen (37, 38, 39). Waarden kunnen 3–10 dBm verschillen tussen kanalen vanwege frequentie-interferentie. Moderne BLE-stacks rapporteren gemiddelde RSSI over alle kanalen of RSSI voor elk pakket afzonderlijk. iOS Core Bluetooth levert gemiddelde RSSI, Android — RSSI van het laatste pakket.
Het typische RSSI-bereik voor BLE is van -30 dBm tot -100 dBm. Waarden buiten deze grenzen zijn uiterst zeldzaam: -20 dBm betekent dat het apparaat letterlijk de antenne van de scanner raakt, en -105 dBm — volledige afwezigheid van signaal. Chipfabrikanten kunnen het bereik beperken: bijvoorbeeld nRF52832 rapporteert RSSI van -40 tot -105 dBm.
| RSSI (dBm) | Signaalkwaliteit | Geschatte afstand | Aanbeveling |
|---|---|---|---|
| -30 – -50 | Uitstekend | 0–1 m | Apparaat in de buurt |
| -51 – -70 | Goed | 1–5 m | Binnen de kamer |
| -71 – -85 | Gemiddeld | 5–15 m | Aanvaardbaar voor beacons |
| -86 – -95 | Zwak | 15–30 m | Onbetrouwbare verbinding |
| Onder -95 | Kritiek | 30+ m | Op de grens van detectie |
TX Power Level — het zendvermogen, dat wordt vermeld in het advertentiepakket (AD Type 0x0A) en correctie van de schatting mogelijk maakt. RSSI -70 dBm van een apparaat met TX Power +4 dBm betekent dat het signaal met 74 dB is verzwakt. Als TX Power onbekend is, is nauwkeurige afstandsschatting onmogelijk. iBeacon bevat TX Power (1 byte) in de Manufacturer Data-structuur voor afstandskalibratie.
Het Path Loss-model (propagatieverliezen) wordt gebruikt om afstand te schatten op basis van RSSI. De basisformule: RSSI = TX_Power - 10 × n × log10(d), waarbij n — de dempingscoëfficiënt (2,0 voor vrije ruimte, 3,0–4,5 voor ruimtes met obstakels), d — afstand in meters. In de praktijk is de nauwkeurigheid van de schatting ±2–5 m in reële omstandigheden.
Om het model te kalibreren moet RSSI worden gemeten op een bekende afstand (meestal 1 m) en de TX Power-referentie worden berekend. In iBeacon wordt deze parameter in het pakket opgeslagen. In Eddystone wordt een vergelijkbaar mechanisme gebruikt. Na kalibratie kan de afstand worden berekend: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Volgens Apple Core Bluetooth Programming Guide (2024) is de nauwkeurigheid van de afstandsschatting voor iBeacon: immediate (<0,5 m) — wanneer RSSI hoger is dan de kalibratiewaarde, near (0,5–3 m) — wanneer RSSI in het bereik van 3–6 dB van de kalibratiewaarde ligt, far (>3 m) — bij zwak signaal. Geen enkel wiskundig model geeft een betere nauwkeurigheid dan ±1 m zonder aanvullende verwerking.
RSSI is een ruisachtige indicator en de nauwkeurigheid ervan hangt van vele factoren af. De belangrijkste foutbronnen: obstakels (muren, meubilair, mensen) verzwakken het signaal met elk 3–15 dB, multipath propagation (reflecties van muren) kan het signaal op sommige punten versterken en op andere verzwakken, oriëntatie van de antenne verandert RSSI met 3–10 dB bij het draaien van het apparaat.
Het menselijk lichaam is een van de sterkste absorbeerders van BLE-signaal. Als er een persoon tussen de beacon en de smartphone staat, kan RSSI met 10–20 dB dalen. Water in het menselijk lichaam absorbeert effectief radiofrequente straling op 2,4 GHz. Daarom kunnen beacons bij winkeldeuren verschillende RSSI tonen voor klanten van verschillende lengte en lichaamsbouw.
Aanvullende factoren: Wi-Fi-interferentie op aangrenzende kanalen kan RSSI met 3–5 dB verminderen, temperatuur van de BLE-chip beïnvloedt de nauwkeurigheid van RSSI-meting (bij sommige chips drift tot 1 dB/°C), batterijdegradatie in de beacon vermindert TX Power, wat leidt tot lagere RSSI aan de ontvangende zijde.
Ruwe RSSI is ongeschikt voor nauwkeurige berekeningen — het bevat te veel ruis en uitschieters. Om een stabiele afstandsschatting te verkrijgen, worden filtermethoden toegepast. De eenvoudigste is het voortschrijdend gemiddelde: het rekenkundig gemiddelde van de laatste N RSSI-waarden wordt genomen. N = 5–10 is meestal voldoende om kortstondige fluctuaties af te vlakken.
// Kalman-filter voor 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 {
// Voorspel
errorCovariance += processNoise
// Update
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Kalman-filter — een geavanceerdere methode die rekening houdt met de dynamiek van RSSI-veranderingen en minder vertraging geeft dan het voortschrijdend gemiddelde. Voor stationaire beacons (onbeweeglijk) geeft het voortschrijdend gemiddelde een acceptabel resultaat. Voor bewegende apparaten heeft het Kalman-filter de voorkeur omdat het sneller aan veranderingen aanpast. Aanvullend kan een Mediaan-filter worden gebruikt om uitschieters te verwijderen.
iOS Core Bluetooth levert RSSI via de eigenschap peripheral.rssi (NSNumber) na het voltooien van RSSI-lezing. Om RSSI van het advertentiepakket te verkrijgen, gebruikt u advertisementData[CBAdvertisementDataRSSIKey]. iOS retourneert RSSI als gemiddelde waarde over drie kanalen. Voor continue RSSI-bewaking roept u readRSSI aan met een interval van maximaal 1 keer per seconde.
// RSSI verkrijgen op iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filter zwakke signalen
guard signalStrength > -90 else {
return
}
print("Apparaat " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android levert RSSI via de callback onScanResult: result.getRssi(). De RSSI-waarde is de RSSI van het laatste advertentiepakket (niet het gemiddelde). Voor stabiele metingen moeten meerdere waarden worden verzameld en filtering worden toegepast. Android biedt ook TX Power Level via result.getScanRecord().getTxPowerLevel(), als dit in het advertentiepakket wordt verzonden.
// RSSI verkrijgen op Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Pas Kalman-filter toe
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Bij het ontwikkelen van applicaties die RSSI gebruiken voor positionering, moet u rekening houden: in iOS zijn RSSI-waarden stabieler dankzij hardwarekalibratie, in Android — ruisachtiger en afhankelijk van de apparaatfabrikant. Voor cross-platform projecten wordt aanbevolen filtering aan de applicatiezijde te implementeren met configureerbare parameters voor elk platform.
Veelgestelde vragen
Nee, RSSI geeft slechts een globale schatting van de afstand met een nauwkeurigheid van ±2–5 m in reële omstandigheden. Voor nauwkeurige positionering zijn triangulatie met meerdere scanners, Kalman-filtering en het meenemen van TX Power van de zender vereist.
Vanwege multipath propagation en fluctuaties van het radiosignaal. Reflecties van muren en objecten creëren interferentie waarbij het signaal soms wordt versterkt en soms verzwakt. Veranderingen van RSSI met 5–10 dB op een stilstaand apparaat zijn normaal.
iOS beveelt aan om readRSSI niet vaker dan 1 keer per seconde aan te roepen. Te frequente verzoeken kunnen leiden tot het missen van datapakketten. Voor RSSI-bewaking tijdens het scannen gebruikt u CBAdvertisementDataRSSIKey, dat beschikbaar is voor elk advertentiepakket.
TX Power Level — het zendvermogen in dBm vermeld in het advertentiepakket. RSSI + TX Power = totale signaalverzwakking op de weg van zender naar ontvanger. Met kennis van TX Power kan de afstand nauwkeuriger worden geschat: RSSI - TX Power = Path Loss (verliezen op de route).
Voor stationaire beacons — voortschrijdend gemiddelde met een venster van 5–10 waarden. Voor bewegende apparaten — Kalman-filter met kleine procesruis (0,01–0,05). Voor het verwijderen van uitschieters voegt u een Mediaan-filter toe dat waarden buiten 2 standaarddeviaties afsnijdt.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook