RSSI (Received Signal Strength Indicator) — یک معیار عددی است که قدرت سیگنال دستگاه BLE را بر حسب dBm در سمت گیرنده اندازهگیری میکند. مقدار RSSI از -30 dBm (دستگاه در نزدیکی) تا -100 dBm (در مرز تشخیص) متغیر است. Bluetooth Core Specification 5.4 (2023) RSSI را به عنوان یک پارامتر اختیاری تعریف میکند که در هر بسته تبلیغاتی و بسته داده در دسترس است. RSSI برای تخمین فاصله (range estimation) و فیلتر کردن دستگاهها بر اساس سطح سیگنال استفاده میشود، اما نشانگر دقیقی نیست: موانع، انتشار چندمسیره و نوع آنتن بر آن تأثیر میگذارند. برای موقعیتیابی دقیق از مثلثسازی و فیلتر کالمن استفاده میشود.
نکات اصلی
RSSI (Received Signal Strength Indicator) — اندازهگیری قدرت سیگنال رادیویی است که توسط گیرنده BLE در لحظه دریافت بسته به دست میآید. در BLE، RSSI برای هر بسته تبلیغاتی (advertising) و هر بسته داده پس از اتصال اندازهگیری میشود. مقدار RSSI یک مقیاس لگاریتمی است که در آن هر گام 1 dBm تقریباً معادل تغییر قدرت سیگنال به میزان 1.26 برابر است.
RSSI یک شاخص وابسته به سختافزار است: تراشههای مختلف BLE (nRF، TI، Dialog، Broadcom) و آنتنهای مختلف ممکن است مقادیر متفاوتی از RSSI را برای یک سیگنال یکسان نشان دهند. بنابراین مقایسه RSSI بین دستگاههای مختلف نادرست است. حتی دو گوشی هوشمند یکسان با یک سیستمعامل ممکن است برای یک بیکن تفاوت 2–5 dBm نشان دهند.
در بسته تبلیغاتی، 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 متر | دستگاه در نزدیکی |
| -51 – -70 | خوب | 1–5 متر | در محدوده اتاق |
| -71 – -85 | متوسط | 5–15 متر | قابل قبول برای بیکنها |
| -86 – -95 | ضعیف | 15–30 متر | اتصال غیرقابل اعتماد |
| پایینتر از -95 | بحرانی | 30+ متر | در مرز تشخیص |
TX Power Level — قدرت فرستنده که در بسته تبلیغاتی (AD Type 0x0A) مشخص میشود و امکان اصلاح تخمین را فراهم میکند. RSSI -70 dBm از دستگاهی با TX Power +4 dBm به این معنی است که سیگنال 74 dB تضعیف شده است. اگر TX Power ناشناخته باشد، تخمین دقیق فاصله غیرممکن است. iBeacon TX Power (1 بایت) را در ساختار Manufacturer Data برای کالیبراسیون فاصله ذخیره میکند.
مدل Path Loss (تلفات انتشار) برای تخمین فاصله بر اساس RSSI استفاده میشود. فرمول پایه: RSSI = TX_Power - 10 × n × log10(d)، که در آن n — ضریب تضعیف (2.0 برای فضای آزاد، 3.0–4.5 برای فضاهای با مانع)، d — فاصله بر حسب متر. در عمل، دقت تخمین در شرایط واقعی ±2–5 متر است.
برای کالیبراسیون مدل، لازم است RSSI در فاصله مشخص (معمولاً 1 متر) اندازهگیری شود و مرجع TX Power محاسبه شود. در iBeacon این پارامتر در بسته ذخیره میشود. در Eddystone از مکانیزم مشابهی استفاده میشود. پس از کالیبراسیون میتوان فاصله را محاسبه کرد: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
طبق Apple Core Bluetooth Programming Guide (2024)، دقت تخمین فاصله برای iBeacon عبارت است از: immediate (<0.5 متر) — هنگامی که RSSI بالاتر از مقدار کالیبراسیون است، near (0.5–3 متر) — هنگامی که RSSI در محدوده 3–6 dB از مقدار کالیبراسیون است، far (>3 متر) — هنگام سیگنال ضعیف. هیچ مدل ریاضی دقت بهتری از ±1 متر بدون پردازش اضافی ارائه نمیدهد.
RSSI یک شاخص پرنویز است و دقت آن به عوامل متعددی بستگی دارد. منابع اصلی خطا: موانع (دیوارها، مبلمان، افراد) هر کدام سیگنال را 3–15 dB تضعیف میکنند، انتشار چندمسیره (بازتاب از دیوارها) میتواند سیگنال را در برخی نقاط تقویت و در برخی دیگر تضعیف کند، جهت آنتن RSSI را هنگام چرخش دستگاه 3–10 dB تغییر میدهد.
بدن انسان یکی از قویترین جاذبهای سیگنال BLE است. اگر فردی بین بیکن و گوشی هوشمند قرار گیرد، RSSI میتواند 10–20 dB کاهش یابد. آب در بدن انسان به طور مؤثر تشعشعات رادیویی را در فرکانس 2.4 گیگاهرتز جذب میکند. بنابراین بیکنهای روی درب فروشگاهها ممکن است RSSI متفاوتی برای خریداران با قد و اندام مختلف نشان دهند.
عوامل اضافی: تداخل Wi-Fi در کانالهای مجاور میتواند RSSI را 3–5 dB کاهش دهد، دمای تراشه BLE بر دقت اندازهگیری RSSI تأثیر میگذارد (در برخی تراشهها رانش تا 1 dB/°C)، تخریب باتری در بیکن TX Power را کاهش میدهد که منجر به RSSI پایینتر در گیرنده میشود.
RSSI خام برای محاسبات دقیق مناسب نیست — حاوی نویز و مقادیر پرت بیش از حد است. برای به دست آوردن تخمین پایدار فاصله از روشهای فیلتر کردن استفاده میشود. سادهترین روش — میانگین متحرک: میانگین حسابی آخرین N مقدار RSSI گرفته میشود. N = 5–10 معمولاً برای هموارسازی نوسانات کوتاهمدت کافی است.
// فیلتر کالمن برای 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
}
}
فیلتر کالمن — روش پیشرفتهتری که پویایی تغییرات RSSI را در نظر میگیرد و تأخیر کمتری نسبت به میانگین متحرک دارد. برای بیکنهای ثابت (غیرمتحرک)، میانگین متحرک نتیجه قابل قبولی میدهد. برای دستگاههای متحرک، فیلتر کالمن ترجیح داده میشود زیرا سریعتر با تغییرات سازگار میشود. علاوه بر این، میتوان از فیلتر میانه برای حذف مقادیر پرت استفاده کرد.
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
// اعمال فیلتر کالمن
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
هنگام توسعه برنامههایی که از RSSI برای موقعیتیابی استفاده میکنند، در نظر داشته باشید: در iOS مقادیر RSSI به دلیل کالیبراسیون سختافزاری پایدارتر هستند، در Android — پرنویزتر و وابسته به تولیدکننده دستگاه. برای پروژههای چندسکویی، توصیه میشود فیلتر کردن در سمت برنامه با پارامترهای قابل تنظیم برای هر سکو پیادهسازی شود.
سؤالات متداول
خیر، RSSI فقط یک تخمین تقریبی از فاصله با دقت ±2–5 متر در شرایط واقعی ارائه میدهد. برای موقعیتیابی دقیق، مثلثسازی با چند اسکنر، فیلتر کالمن و در نظر گرفتن 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 (تلفات مسیر).
برای بیکنهای ثابت — میانگین متحرک با پنجره 5–10 مقدار. برای دستگاههای متحرک — فیلتر کالمن با نویز فرآیند کوچک (0.01–0.05). برای حذف مقادیر پرت، فیلتر میانهای اضافه کنید که مقادیر خارج از 2 انحراف معیار را حذف میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید