RSSI (Received Signal Strength Indicator) — είναι μια αριθμητική μέτρηση που μετρά την ισχύ του σήματος μιας συσκευής BLE σε dBm στην πλευρά λήψης. Η τιμή RSSI κυμαίνεται από -30 dBm (συσκευή κοντά) έως -100 dBm (στο όριο ανίχνευσης). Το Bluetooth Core Specification 5.4 (2023) ορίζει το RSSI ως προαιρετική παράμετρο διαθέσιμη σε κάθε διαφημιστικό πακέτο και πακέτο δεδομένων. Το RSSI χρησιμοποιείται για εκτίμηση απόστασης (range estimation) και φιλτράρισμα συσκευών ανά επίπεδο σήματος, αλλά είναι ανακριβής δείκτης: τον επηρεάζουν εμπόδια, πολυδιαδρομική διάδοση και τύπος κεραίας. Για ακριβή εντοπισμό θέσης εφαρμόζονται τριγωνισμός και φίλτρο Kalman.
Κύρια σημεία
RSSI (Received Signal Strength Indicator) — είναι η μέτρηση της ισχύος του ραδιοσήματος που λαμβάνει ο δέκτης BLE τη στιγμή λήψης του πακέτου. Στο BLE, το RSSI μετράται για κάθε διαφημιστικό πακέτο (advertising) και για κάθε πακέτο δεδομένων μετά τη σύνδεση. Η τιμή RSSI είναι μια λογαριθμική κλίμακα, όπου κάθε βήμα 1 dBm αντιστοιχεί περίπου σε αλλαγή της ισχύος σήματος κατά 1,26 φορές.
Το RSSI είναι ένας δείκτης εξαρτώμενος από το υλικό: διαφορετικά τσιπ BLE (nRF, TI, Dialog, Broadcom) και διαφορετικές κεραίες μπορεί να εμφανίζουν διαφορετικές τιμές RSSI για το ίδιο σήμα. Επομένως, η σύγκριση RSSI μεταξύ διαφορετικών συσκευών είναι εσφαλμένη. Ακόμη και δύο πανομοιότυπα smartphone με το ίδιο λειτουργικό σύστημα μπορεί να εμφανίζουν διαφορά 2–5 dBm για τον ίδιο beacon.
Στο διαφημιστικό πακέτο, το RSSI μετράται για καθένα από τα τρία κανάλια (37, 38, 39). Οι τιμές μπορεί να διαφέρουν κατά 3–10 dBm μεταξύ των καναλιών λόγω παρεμβολών συχνότητας. Οι σύγχρονες στοίβες BLE αναφέρουν μέσο RSSI σε όλα τα κανάλια ή RSSI για κάθε πακέτο ξεχωριστά. Το iOS Core Bluetooth παρέχει μέσο RSSI, το Android — RSSI του τελευταίου πακέτου.
Το τυπικό εύρος RSSI για BLE είναι από -30 dBm έως -100 dBm. Τιμές εκτός αυτών των ορίων είναι εξαιρετικά σπάνιες: -20 dBm σημαίνει ότι η συσκευή αγγίζει κυριολεκτικά την κεραία του σαρωτή, και -105 dBm — πλήρης απουσία σήματος. Οι κατασκευαστές τσιπ μπορεί να περιορίζουν το εύρος: για παράδειγμα, το nRF52832 αναφέρει RSSI από -40 έως -105 dBm.
| RSSI (dBm) | Ποιότητα σήματος | Κατά προσέγγιση απόσταση | Σύσταση |
|---|---|---|---|
| -30 – -50 | Εξαιρετική | 0–1 m | Συσκευή κοντά |
| -51 – -70 | Καλή | 1–5 m | Εντός δωματίου |
| -71 – -85 | Μέτρια | 5–15 m | Αποδεκτή για beacon |
| -86 – -95 | Ασθενής | 15–30 m | Αναξιόπιστη σύνδεση |
| Κάτω από -95 | Κρίσιμη | 30+ m | Στο όριο ανίχνευσης |
TX Power Level — η ισχύς του πομπού, η οποία αναφέρεται στο διαφημιστικό πακέτο (AD Type 0x0A) και επιτρέπει τη διόρθωση της εκτίμησης. RSSI -70 dBm από συσκευή με TX Power +4 dBm σημαίνει ότι το σήμα εξασθένισε κατά 74 dB. Εάν το TX Power είναι άγνωστο, η ακριβής εκτίμηση απόστασης είναι αδύνατη. Το iBeacon περιλαμβάνει TX Power (1 byte) στη δομή Manufacturer Data για βαθμονόμηση απόστασης.
Το μοντέλο Path Loss (απώλειες διάδοσης) χρησιμοποιείται για εκτίμηση απόστασης βάσει RSSI. Ο βασικός τύπος: RSSI = TX_Power - 10 × n × log10(d), όπου n — συντελεστής εξασθένησης (2,0 για ελεύθερο χώρο, 3,0–4,5 για χώρους με εμπόδια), d — απόσταση σε μέτρα. Στην πράξη, η ακρίβεια εκτίμησης είναι ±2–5 m σε πραγματικές συνθήκες.
Για βαθμονόμηση του μοντέλου, είναι απαραίτητο να μετρηθεί το RSSI σε γνωστή απόσταση (συνήθως 1 m) και να υπολογιστεί η αναφορά TX Power. Στο iBeacon, αυτή η παράμετρος αποθηκεύεται στο πακέτο. Στο Eddystone χρησιμοποιείται παρόμοιος μηχανισμός. Μετά τη βαθμονόμηση, μπορεί να υπολογιστεί η απόσταση: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Σύμφωνα με το Apple Core Bluetooth Programming Guide (2024), η ακρίβεια εκτίμησης απόστασης για iBeacon είναι: immediate (<0,5 m) — όταν το RSSI είναι υψηλότερο από την τιμή βαθμονόμησης, near (0,5–3 m) — όταν το RSSI είναι στο εύρος 3–6 dB από την τιμή βαθμονόμησης, far (>3 m) — σε ασθενές σήμα. Κανένα μαθηματικό μοντέλο δεν δίνει ακρίβεια καλύτερη από ±1 m χωρίς πρόσθετη επεξεργασία.
Το RSSI είναι ένας θορυβώδης δείκτης και η ακρίβειά του εξαρτάται από πολλούς παράγοντες. Οι κύριες πηγές σφάλματος: εμπόδια (τοίχοι, έπιπλα, άνθρωποι) εξασθενούν το σήμα κατά 3–15 dB το καθένα, πολυδιαδρομική διάδοση (ανακλάσεις από τοίχους) μπορεί να ενισχύει το σήμα σε ορισμένα σημεία και να το εξασθενεί σε άλλα, προσανατολισμός κεραίας αλλάζει το RSSI κατά 3–10 dB κατά την περιστροφή της συσκευής.
Το ανθρώπινο σώμα είναι ένας από τους ισχυρότερους απορροφητές σήματος BLE. Εάν υπάρχει άτομο μεταξύ του beacon και του smartphone, το RSSI μπορεί να πέσει κατά 10–20 dB. Το νερό στο ανθρώπινο σώμα απορροφά αποτελεσματικά τη ραδιοακτινοβολία στη συχνότητα 2,4 GHz. Επομένως, τα beacon στις πόρτες καταστημάτων μπορεί να εμφανίζουν διαφορετικό RSSI για πελάτες διαφορετικού ύψους και σωματικής διάπλασης.
Πρόσθετοι παράγοντες: παρεμβολές Wi-Fi σε γειτονικά κανάλια μπορεί να μειώσουν το RSSI κατά 3–5 dB, θερμοκρασία του τσιπ BLE επηρεάζει την ακρίβεια μέτρησης RSSI (σε ορισμένα τσιπ απόκλιση έως 1 dB/°C), υποβάθμιση μπαταρίας στο beacon μειώνει το TX Power, οδηγώντας σε χαμηλότερο RSSI στον δέκτη.
Το ακατέργαστο RSSI δεν είναι κατάλληλο για ακριβείς υπολογισμούς — περιέχει υπερβολικό θόρυβο και ακραίες τιμές. Για τη λήψη σταθερής εκτίμησης απόστασης εφαρμόζονται μέθοδοι φιλτραρίσματος. Η απλούστερη — κινητός μέσος όρος: λαμβάνεται ο αριθμητικός μέσος όρος των τελευταίων N τιμών RSSI. N = 5–10 συνήθως αρκεί για εξομάλυνση βραχυπρόθεσμων διακυμάνσεων.
// Φίλτρο Kalman για 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 {
// Πρόβλεψη
errorCovariance += processNoise
// Ενημέρωση
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Φίλτρο Kalman — μια πιο προηγμένη μέθοδος που λαμβάνει υπόψη τη δυναμική των αλλαγών RSSI και δίνει μικρότερη καθυστέρηση από τον κινητό μέσο όρο. Για σταθερούς beacon (ακίνητους), ο κινητός μέσος όρος δίνει αποδεκτό αποτέλεσμα. Για κινούμενες συσκευές, το φίλτρο Kalman είναι προτιμότερο καθώς προσαρμόζεται ταχύτερα στις αλλαγές. Επιπλέον, μπορεί να χρησιμοποιηθεί φίλτρο Διάμεσου για απόρριψη ακραίων τιμών.
iOS Core Bluetooth παρέχει RSSI μέσω της ιδιότητας peripheral.rssi (NSNumber) μετά την ολοκλήρωση ανάγνωσης RSSI. Για λήψη RSSI του διαφημιστικού πακέτου, χρησιμοποιήστε το advertisementData[CBAdvertisementDataRSSIKey]. Το iOS επιστρέφει RSSI ως μέση τιμή στα τρία κανάλια. Για συνεχή παρακολούθηση RSSI, καλέστε το readRSSI με μεσοδιάστημα όχι συχνότερο από 1 φορά ανά δευτερόλεπτο.
// Λήψη RSSI σε iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Φιλτράρισμα ασθενών σημάτων
guard signalStrength > -90 else {
return
}
print("Συσκευή " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android παρέχει RSSI μέσω του callback onScanResult: result.getRssi(). Η τιμή RSSI είναι το RSSI του τελευταίου διαφημιστικού πακέτου (όχι ο μέσος όρος). Για σταθερές μετρήσεις, είναι απαραίτητο να συλλέγονται πολλαπλές τιμές και να εφαρμόζεται φιλτράρισμα. Το Android παρέχει επίσης TX Power Level μέσω του result.getScanRecord().getTxPowerLevel(), εάν μεταδίδεται στο διαφημιστικό πακέτο.
// Λήψη RSSI σε Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Εφαρμογή φίλτρου Kalman
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Κατά την ανάπτυξη εφαρμογών που χρησιμοποιούν RSSI για εντοπισμό θέσης, λάβετε υπόψη: στο iOS οι τιμές RSSI είναι πιο σταθερές χάρη στη βαθμονόμηση υλικού, στο Android — πιο θορυβώδεις και εξαρτώμενες από τον κατασκευαστή της συσκευής. Για πολυπλατφορμικά έργα, συνιστάται η υλοποίηση φιλτραρίσματος στην πλευρά της εφαρμογής με παραμετροποιήσιμες παραμέτρους για κάθε πλατφόρμα.
Συχνές ερωτήσεις
Όχι, το RSSI δίνει μόνο κατά προσέγγιση εκτίμηση της απόστασης με ακρίβεια ±2–5 m σε πραγματικές συνθήκες. Για ακριβή εντοπισμό θέσης απαιτείται τριγωνισμός από πολλαπλούς σαρωτές, φίλτρο Kalman και λήψη υπόψη του TX Power του πομπού.
Λόγω πολυδιαδρομικής διάδοσης και διακυμάνσεων του ραδιοσήματος. Οι ανακλάσεις από τοίχους και αντικείμενα δημιουργούν παρεμβολές όπου το σήμα άλλοτε ενισχύεται και άλλοτε εξασθενεί. Οι αλλαγές RSSI κατά 5–10 dB σε ακίνητη συσκευή είναι φυσιολογικό φαινόμενο.
Το iOS συνιστά την κλήση readRSSI όχι συχνότερα από 1 φορά ανά δευτερόλεπτο. Τα πολύ συχνά αιτήματα μπορεί να οδηγήσουν σε απώλεια πακέτων δεδομένων. Για παρακολούθηση RSSI κατά τη σάρωση, χρησιμοποιήστε το CBAdvertisementDataRSSIKey που είναι διαθέσιμο για κάθε διαφημιστικό πακέτο.
TX Power Level — η ισχύς του πομπού σε dBm που αναφέρεται στο διαφημιστικό πακέτο. RSSI + TX Power = συνολική εξασθένηση σήματος στη διαδρομή από τον πομπό στον δέκτη. Γνωρίζοντας το TX Power, μπορεί να εκτιμηθεί με μεγαλύτερη ακρίβεια η απόσταση: RSSI - TX Power = Path Loss (απώλειες διαδρομής).
Για σταθερούς beacon — κινητός μέσος όρος με παράθυρο 5–10 τιμών. Για κινούμενες συσκευές — φίλτρο Kalman με μικρό θόρυβο διεργασίας (0,01–0,05). Για απόρριψη ακραίων τιμών, προσθέστε φίλτρο Διάμεσου που αποκόπτει τιμές εκτός 2 τυπικών αποκλίσεων.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης