RSSI (Received Signal Strength Indicator) est une métrique numérique qui mesure la puissance du signal d'un périphérique BLE en dBm du côté récepteur. Les valeurs RSSI vont de -30 dBm (périphérique à proximité) à -100 dBm (à la limite de détection). Bluetooth Core Specification 5.4 (2023) définit RSSI comme un paramètre optionnel disponible dans chaque paquet publicitaire et paquet de données. RSSI est utilisé pour l'estimation de distance et le filtrage des périphériques par niveau de signal, mais c'est un indicateur imprécis : il est affecté par les obstacles, la propagation par trajets multiples et le type d'antenne. Pour un positionnement précis, on utilise la triangulation et le filtrage de Kalman.
Points clés
RSSI (Received Signal Strength Indicator) est une mesure de la puissance du signal radio reçue par le récepteur BLE au moment de la réception du paquet. En BLE, le RSSI est mesuré pour chaque paquet publicitaire et chaque paquet de données après la connexion. Le RSSI est une échelle logarithmique où chaque pas de 1 dBm correspond approximativement à un changement de 1,26 fois de la puissance du signal.
Le RSSI est un indicateur dépendant du matériel : différentes puces BLE (nRF, TI, Dialog, Broadcom) et différentes antennes peuvent afficher des valeurs RSSI différentes pour le même signal. Par conséquent, comparer le RSSI entre différents appareils est incorrect. Même deux smartphones identiques sur le même système d'exploitation peuvent présenter une différence de 2–5 dBm pour la même balise.
Dans un paquet publicitaire, le RSSI est mesuré pour chacun des trois canaux (37, 38, 39). Les valeurs peuvent différer de 3–10 dBm entre les canaux en raison des interférences de fréquence. Les piles BLE modernes signalent le RSSI moyen sur tous les canaux ou le RSSI pour chaque paquet individuellement. iOS Core Bluetooth fournit le RSSI moyen, Android fournit le RSSI du dernier paquet.
La plage typique de RSSI pour BLE est de -30 dBm à -100 dBm. Les valeurs en dehors de cette plage sont extrêmement rares : -20 dBm signifie que l'appareil touche littéralement l'antenne du scanner, tandis que -105 dBm signifie une absence totale de signal. Les fabricants de puces peuvent limiter la plage : par exemple, le nRF52832 signale un RSSI de -40 à -105 dBm.
| RSSI (dBm) | Qualité du signal | Distance approximative | Recommandation |
|---|---|---|---|
| -30 – -50 | Excellente | 0–1 m | Appareil à proximité |
| -51 – -70 | Bonne | 1–5 m | Dans la pièce |
| -71 – -85 | Moyenne | 5–15 m | Acceptable pour les balises |
| -86 – -95 | Faible | 15–30 m | Connexion non fiable |
| En dessous de -95 | Critique | 30+ m | À la limite de détection |
TX Power Level est la puissance de l'émetteur indiquée dans le paquet publicitaire (AD Type 0x0A) et permet d'ajuster l'estimation. Un RSSI de -70 dBm provenant d'un appareil avec TX Power +4 dBm signifie que le signal a été atténué de 74 dB. Si TX Power est inconnu, une estimation précise de la distance est impossible. iBeacon inclut TX Power (1 octet) dans la structure Manufacturer Data pour l'étalonnage de distance.
Le modèle Path Loss (perte de propagation) est utilisé pour estimer la distance à partir du RSSI. La formule de base : RSSI = TX_Power - 10 × n × log10(d), où n est le coefficient d'atténuation (2,0 pour l'espace libre, 3,0–4,5 pour les environnements intérieurs avec obstacles) et d est la distance en mètres. En pratique, la précision de l'estimation est de ±2–5 m en conditions réelles.
Pour calibrer le modèle, il est nécessaire de mesurer le RSSI à une distance connue (généralement 1 m) et de calculer la référence TX Power. Dans iBeacon, ce paramètre est stocké dans le paquet. Eddystone utilise un mécanisme similaire. Après calibrage, la distance peut être calculée : d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Selon le Guide de programmation Core Bluetooth d'Apple (2024), la précision de l'estimation de distance pour iBeacon est la suivante : immediate (<0,5 m) — lorsque RSSI est supérieur à la valeur de calibrage, near (0,5–3 m) — lorsque RSSI est dans les 3–6 dB de la valeur de calibrage, far (>3 m) — avec un signal faible. Aucun modèle mathématique ne fournit une précision meilleure que ±1 m sans traitement supplémentaire.
Le RSSI est un indicateur bruyant, et sa précision dépend de nombreux facteurs. Les principales sources d'erreur : les obstacles (murs, meubles, personnes) atténuent le signal de 3–15 dB chacun, la propagation par trajets multiples (réflexions sur les murs) peut amplifier le signal à certains endroits et l'atténuer à d'autres, l'orientation de l'antenne modifie le RSSI de 3–10 dB lors de la rotation de l'appareil.
Le corps humain est l'un des plus puissants absorbeurs du signal BLE. Si une personne se trouve entre la balise et le smartphone, le RSSI peut chuter de 10–20 dB. L'eau présente dans le corps humain absorbe efficacement le rayonnement radio à 2,4 GHz. Par conséquent, les balises sur les portes des magasins peuvent afficher un RSSI différent pour des clients de différentes tailles et corpulences.
Facteurs supplémentaires : les interférences Wi-Fi sur les canaux adjacents peuvent réduire le RSSI de 3–5 dB, la température de la puce BLE affecte la précision de mesure du RSSI (certaines puces dérivent jusqu'à 1 dB/°C), la dégradation de la batterie de la balise réduit la puissance d'émission, entraînant un RSSI plus faible au niveau du récepteur.
Le RSSI brut n'est pas adapté aux calculs précis — il contient trop de bruit et de valeurs aberrantes. Des méthodes de filtrage sont utilisées pour obtenir une estimation stable de la distance. La plus simple est la moyenne mobile : on prend la moyenne arithmétique des N dernières valeurs de RSSI. Généralement N = 5–10 suffit pour lisser les fluctuations à court terme.
// Filtre de Kalman pour 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 {
// Prédire
errorCovariance += processNoise
// Mettre à jour
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Le filtre de Kalman est une méthode plus avancée qui prend en compte la dynamique de changement du RSSI et offre moins de retard que la moyenne mobile. Pour les balises stationnaires (fixes), la moyenne mobile donne des résultats acceptables. Pour les appareils en mouvement, le filtre de Kalman est préférable car il s'adapte plus rapidement aux changements. De plus, un filtre Médian peut être utilisé pour éliminer les valeurs aberrantes.
iOS Core Bluetooth fournit le RSSI via la propriété peripheral.rssi (NSNumber) après la lecture du RSSI. Pour obtenir le RSSI du paquet publicitaire, utilisez advertisementData[CBAdvertisementDataRSSIKey]. iOS retourne le RSSI comme valeur moyenne sur les trois canaux. Pour une surveillance continue du RSSI, appelez readRSSI à des intervalles ne dépassant pas une fois par seconde.
// Obtenir RSSI sur iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filtrer les signaux faibles
guard signalStrength > -90 else {
return
}
print("Appareil " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android fournit le RSSI via le callback onScanResult : result.getRssi(). La valeur RSSI est le RSSI du dernier paquet publicitaire (pas une moyenne). Pour des lectures stables, il est nécessaire d'accumuler plusieurs valeurs et d'appliquer un filtrage. Android fournit également TX Power Level via result.getScanRecord().getTxPowerLevel(), s'il est transmis dans le paquet publicitaire.
// Obtenir RSSI sur Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Appliquer le filtre de Kalman
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Lors du développement d'applications utilisant le RSSI pour le positionnement, tenez compte des éléments suivants : sur iOS, les valeurs RSSI sont plus stables grâce à l'étalonnage matériel ; sur Android, elles sont plus bruyantes et dépendent du fabricant de l'appareil. Pour les projets multiplateformes, il est recommandé d'implémenter le filtrage côté application avec des paramètres configurables pour chaque plateforme.
Foire aux questions
Non, le RSSI ne fournit qu'une estimation approximative de la distance avec une précision de ±2–5 m en conditions réelles. Pour un positionnement précis, une triangulation à partir de plusieurs scanners, un filtrage de Kalman et la prise en compte du TX Power sont nécessaires.
En raison de la propagation par trajets multiples et des fluctuations du signal radio. Les réflexions sur les murs et les objets créent des interférences où le signal alterne entre renforcement et affaiblissement. Des changements de RSSI de 5–10 dB sur un appareil stationnaire sont normaux.
iOS recommande d'appeler readRSSI pas plus d'une fois par seconde. Des requêtes trop fréquentes peuvent entraîner une perte de paquets de données. Pour surveiller le RSSI pendant le scan, utilisez CBAdvertisementDataRSSIKey, disponible pour chaque paquet publicitaire.
TX Power Level est la puissance de l'émetteur en dBm indiquée dans le paquet publicitaire. RSSI + TX Power = atténuation totale du signal de l'émetteur au récepteur. Connaître le TX Power permet une estimation plus précise de la distance : RSSI - TX Power = Path Loss (affaiblissement de propagation).
Pour les balises stationnaires — moyenne mobile avec une fenêtre de 5–10 valeurs. Pour les appareils en mouvement — filtre de Kalman avec un faible bruit de processus (0,01–0,05). Pour éliminer les valeurs aberrantes, ajoutez un filtre Médian qui supprime les valeurs en dehors de 2 écarts types.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi