RSSI (Received Signal Strength Indicator) هو مقياس رقمي يقيس قوة إشارة جهاز BLE بوحدة dBm على الجانب المستقبل. تتراوح قيم RSSI من -30 dBm (الجهاز قريب) إلى -100 dBm (عند حد الكشف). يحدد Bluetooth Core Specification 5.4 (2023) RSSI كمعامل اختياري متاح في كل حزمة إعلانية وحزمة بيانات. يُستخدم RSSI لتقدير المسافة وتصفية الأجهزة حسب مستوى الإشارة، لكنه مؤشر غير دقيق: تتأثر دقته بالعوائق والانتشار متعدد المسارات ونوع الهوائي. للتحديد الدقيق للموضع تُستخدم التثليث ومرشح كالمان.
الخلاصة
RSSI (Received Signal Strength Indicator) هو قياس لقوة إشارة الراديو التي يستقبلها مستقبل BLE عند استلام الحزمة. في BLE، يُقاس RSSI لكل حزمة إعلانية وكل حزمة بيانات بعد الاتصال. 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 من جهاز بقوة إرسال +4 dBm يعني أن الإشارة تضعفت بمقدار 74 dB. إذا كانت قوة الإرسال غير معروفة، فإن التقدير الدقيق للمسافة مستحيل. يتضمن iBeacon قوة الإرسال (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 م) وحساب مرجع قوة الإرسال. في 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 GHz بفعالية. لذلك، قد تظهر المنارات على أبواب المتاجر RSSI مختلفاً للعملاء ذوي الأطوال والأجسام المختلفة.
عوامل إضافية: تداخل Wi-Fi على القنوات المجاورة يمكن أن يقلل RSSI بمقدار 3–5 dB، درجة الحرارة لرقاقة BLE تؤثر على دقة قياس RSSI (بعض الرقاقات تنحرف حتى 1 dB/°C)، تدهور البطارية في المنارة يقلل من قوة الإرسال مما يؤدي إلى انخفاض 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 بفاصل زمني لا يزيد عن مرة واحدة في الثانية.
// الحصول على 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 من خلال استدعاء 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 م في الظروف الحقيقية. للتحديد الدقيق للموضع، يلزم التثليث من عدة ماسحات ضوئية ومرشح كالمان ومراعاة قوة الإرسال.
بسبب الانتشار متعدد المسارات وتقلبات إشارة الراديو. تخلق الانعكاسات من الجدران والأشياء تداخلاً حيث تتعزز الإشارة وتضعف بالتناوب. تغيرات RSSI بمقدار 5–10 dB على جهاز ثابت هي ظاهرة طبيعية.
يوصي iOS باستدعاء readRSSI بما لا يزيد عن مرة واحدة في الثانية. الطلبات المتكررة جداً قد تؤدي إلى فقدان حزم البيانات. لمراقبة RSSI أثناء المسح، استخدم CBAdvertisementDataRSSIKey المتاح لكل حزمة إعلانية.
TX Power Level هو قوة المرسل بوحدة dBm المُشار إليها في الحزمة الإعلانية. RSSI + TX Power = التوهين الكلي للإشارة من المرسل إلى المستقبل. معرفة قوة الإرسال تسمح بتقدير أكثر دقة للمسافة: RSSI - TX Power = Path Loss (فقدان المسار).
لـ لمنارات الثابتة — المتوسط المتحرك بنافذة من 5–10 قيم. لـ الأجهزة المتحركة — مرشح كالمان مع ضوضاء عملية منخفضة (0.01–0.05). لاستبعاد القيم الشاذة، أضف مرشح الوسيط الذي يستبعد القيم خارج انحرافين معياريين.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.