Bonding (الإقران) في Bluetooth Low Energy هو عملية إنشاء اتصال آمن دائم بين جهازين عن طريق تخزين المفاتيح التشفيرية في ذاكرة غير متطايرة. بعد bonding، يمكن للأجهزة استعادة الاتصال المشفر تلقائياً عند إعادة الاتصال دون الحاجة إلى إعادة إدخال PIN أو تأكيد المستخدم. وفقاً لـ Bluetooth SIG Core Specification v5.4 (2025)، فإن آلية bonding إلزامية للأجهزة التي تتطلب إعادة اتصال تلقائي — سماعات الرأس، أجهزة تتبع اللياقة البدنية، أجهزة الاستشعار الطبية وملحقات إنترنت الأشياء.
الملامح الرئيسية
Bonding هو امتداد لعملية pairing في Bluetooth Low Energy، حيث تقوم الأجهزة بتخزين مفاتيح التشفير للاتصالات اللاحقة. يحدد معيار BLE ثلاثة أوضاع أمان: Security Mode 1 (تشفير بدون مصادقة)، Security Mode 2 (توقيع البيانات بدون تشفير) وSecurity Mode 3 (تشفير مع مصادقة). Bonding ذو صلة بالأوضاع مع التشفير حيث تكون الاتصالات المتكررة دون إعادة إنشاء المفاتيح مطلوبة.
الغرض الرئيسي من bonding هو الاستعادة التلقائية للاتصالات المشفرة عند إعادة اتصال الأجهزة. عندما يخرج المستخدم سماعات الأذن من علبتها ويضعها، يضمن bonding الاتصال الفوري بالهاتف الذكي دون الحاجة إلى تحديد الجهاز مرة أخرى من قائمة Bluetooth. وفقاً لإرشادات Apple Bluetooth Design Guidelines (2025)، يجب أن تتصل الأجهزة المرتبطة في غضون لا يزيد عن ثانيتين من الاكتشاف.
أثناء bonding، يخزن كل جهاز مجموعة من المواد التشفيرية: Long Term Key (LTK) لتشفير الاتصال، Identity Resolving Key (IRK) لحل العناوين العشوائية، وConnection Signature Resolving Key (CSRK) للتحقق من توقيعات البيانات. LTK هو المفتاح الأساسي بطول 128 بت يتم إنشاؤه أثناء pairing ويستخدم لجميع الجلسات المشفرة اللاحقة.
| المفتاح | الطول | الغرض |
|---|---|---|
| LTK | 128 بت | تشفير البيانات بعد إعادة الاتصال |
| IRK | 128 بت | حل العناوين الخاصة العشوائية (RPA) |
| CSRK | 128 بت | توقيع البيانات والتحقق من صحتها |
Pairing هو التفاوض المؤقت على المفاتيح لتشفير جلسة الاتصال الحالية. عندما ينتهي الاتصال، يتم حذف مفاتيح التشفير، ويتطلب الاتصال التالي عملية pairing كاملة مرة أخرى. Bonding يشمل جميع مراحل pairing ولكنه يخزن المفاتيح أيضاً للجلسات المستقبلية. جميع أجهزة Bluetooth الاستهلاكية تقريباً (سماعات الرأس، مكبرات الصوت، الساعات) تستخدم bonding لأنه بدونها، كل اتصال سيتطلب إعادة إدخال PIN.
تتكون عملية pairing حسب مواصفات BLE من ثلاث مراحل. المرحلة 1 — تبادل قدرات الأجهزة (قدرات IO، دعم المصادقة). المرحلة 2 — إنشاء وتبادل Short Term Key (STK) أو LTK، حسب طريقة الإقران. المرحلة 3 — نقل المفاتيح: تبادل LTK، IRK، CSRK بين الأجهزة. إذا قامت الأجهزة بتخزين المفاتيح بعد المرحلة 3 — فهذا bonding. إذا لم تفعل — فهو مجرد pairing.
| المعامل | Pairing | Bonding |
|---|---|---|
| تخزين المفاتيح | لا يتم تخزينها | تُخزن في NVRAM |
| إعادة الاتصال التلقائي | لا | نعم |
| إعادة إدخال PIN | مطلوب | غير مطلوب |
| الاستخدام | اتصالات عرضية | أجهزة دائمة |
تبدأ عملية bonding بعد اكتمال pairing بنجاح، عندما يرسل أحد الأجهزة طلباً لتخزين المفاتيح. في BLE، يتبادل Central (عادةً هاتف ذكي) وPeripheral (جهاز قابل للارتداء) المفاتيح عبر القناة الآمنة التي تم إنشاؤها في المرحلة 2. بعد تبادل المفاتيح بنجاح، يخزن كل جهاز منها في ذاكرة غير متطايرة مع عنوان MAC أو Identity Address للشريك.
في جانب Central (iOS/Android)، تُخزن المفاتيح في مخزن Bluetooth النظامي. يستخدم iOS مكدس النظام Core Bluetooth مع إدارة تلقائية لـ bonding: عند الإقران الأول، تُحفظ المفاتيح في NVRAM الجهاز، وتتم الاتصالات اللاحقة لنفس Peripheral تلقائياً. لا يدير المطور المفاتيح مباشرة — مكدس النظام Core Bluetooth يعالج bonding تلقائياً عند الاتصال بجهاز يدعم تخزين المفاتيح.
عند إعادة الاتصال، يرسل Peripheral حزم إعلان تحتوي إما على عنوانه العام أو Resolvable Private Address (RPA). يستقبل Central الحزمة، ويطابق العنوان مع الأجهزة المرتبطة المخزنة، وإذا وجد تطابقاً، يبدأ استعادة الجلسة باستخدام LTK المخزن. إذا تطابق LTK، يتم إنشاء الاتصال المشفر دون إعادة pairing.
يحدد مواصفات BLE عدة طرق مصادقة تؤثر على مستوى أمان bonding. يعتمد اختيار الطريقة على قدرات IO للأجهزة — ما إذا كانت تحتوي على شاشة، لوحة مفاتيح، أو إمكانية تأكيد المقارنة الرقمية. يتطلب bonding الآمن استخدام طريقة لا تقل عن Just Works للتطبيقات غير الحرجة وNumeric Comparison أو Passkey Entry للمهام التي تتطلب حماية ضد هجمات الوسيط.
Just Works هي طريقة بدون مصادقة تُستخدم عندما لا يحتوي أحد الأجهزة على شاشة أو لوحة مفاتيح. يتم نقل مفاتيح التشفير دون التحقق من هوية الجهاز الثاني — أجهزة استشعار درجة الحرارة، أجهزة قياس النبض. Just Works عرضة لهجمات MITM، لذلك تُستخدم فقط للأجهزة حيث لا يشكل اختراق البيانات تهديداً.
Numeric Comparison هي طريقة مصادقة حيث يعرض كلا الجهازين رقماً من ستة أرقام، ويجب على المستخدم تأكيد التطابق. توفر هذه الطريقة حماية ضد هجمات MITM ويوصى بها للأجهزة ذات الشاشة — الساعات الذكية، أجهزة تتبع اللياقة البدنية، أجهزة التحكم عن بعد. بعد التأكيد، يتم تخزين bonding بأقصى مستوى ثقة.
Passkey Entry يتطلب إدخال PIN مكون من ستة أرقام على أحد الأجهزة. عادةً، يتم إنشاء الرمز بواسطة جهاز وعرضه عليه، بينما يدخله المستخدم على الجهاز الثاني. تُستخدم هذه الطريقة للأجهزة الطبية وأقفال إنترنت الأشياء حيث يكون مستوى أمان عالٍ مطلوباً لكن أحد الأجهزة يفتقر إلى شاشة لـ Numeric Comparison.
إدارة bonding هي عملية عرض وحذف وصيانة المفاتيح المخزنة للأجهزة المقترنة. في تطوير التطبيقات المحمولة، من المهم معالجة حالات الأجهزة المرتبطة بشكل صحيح، خاصة عند إعادة ضبط جهاز طرفي أو استبدال برمجيته الثابتة. عندما تتغير مفاتيح bonding على Peripheral، يجب إزالة المفاتيح القديمة على Central وإجراء إقران جديد.
يدير iOS تلقائياً الأجهزة المرتبطة من خلال مكدس النظام Core Bluetooth. لا يملك المطور API مباشر لعرض أو حذف الأجهزة المرتبطة بشكل فردي — تتم الإدارة من خلال إعدادات النظام (Settings > Bluetooth > الجهاز > Forget). إذا كان من الضروري مسح bonding برمجياً، يمكن للتطبيق توجيه المستخدم إلى إعدادات Bluetooth النظام باستخدام UIApplication.openSettingsURLString.
يوفر Android API مباشر للعمل مع الأجهزة المرتبطة من خلال فئة BluetoothAdapter. يقوم الأسلوب getBondedDevices() بإرجاع Set<BluetoothDevice> لجميع الأجهزة المقترنة. لإزالة bonding، يتم استخدام طريقة removeBond() عبر الانعكاس أو، في Android 12+، API الرسمي BluetoothDevice.removeBond().
val adapter = BluetoothAdapter.getDefaultAdapter()
val bondedDevices: Set<BluetoothDevice> = adapter.getBondedDevices()
bondedDevices.forEach { device ->
Log.d("Bonding", "Bonded device: ${device.name}, ${device.address}")
}
تطبيق bonding على Android يتطلب معالجة صحيحة لـ BroadcastReceiver لأحداث BluetoothDevice.ACTION_BOND_STATE_CHANGED. عند أول اتصال بجهاز، يقوم نظام Android تلقائياً ببدء bonding إذا كان الجهاز يدعم هذه الإمكانية. يجب على المطور معالجة ثلاث حالات: BOND_NONE (غير مقترن)، BOND_BONDING (جاري الإقران)، BOND_BONDED (مقترن).
val bondReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)
val bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1)
when (bondState) {
BluetoothDevice.BOND_BONDED -> Log.d("Bonding", "Bonded: ${device.name}")
BluetoothDevice.BOND_NONE -> Log.d("Bonding", "تمت إزالة الرابط")
}
}
}
لبدء bonding على Android، يجب استدعاء طريقة createBond() على كائن BluetoothDevice. ترجع الطريقة قيمة منطقية — true إذا بدأت عملية الإقران بنجاح. بدءاً من Android 12، يتطلب createBond() إذن BLUETOOTH_CONNECT وقد يتم رفضه من قبل النظام إذا لم يكن للتطبيق وصول Bluetooth في الخلفية.
fun initiateBonding(device: BluetoothDevice) {
if (device.bondState == BluetoothDevice.BOND_NONE) {
val success = device.createBond()
if (success) {
Toast.makeText(context, "تم بدء Bonding", Toast.LENGTH_SHORT)
}
}
}
غالباً ما يواجه مطورو التطبيقات المحمولة أخطاء شائعة عند العمل مع bonding لأجهزة BLE. يمكن أن تؤدي المعالجة غير الصحيحة لحالات bonding إلى فشل الاتصال، عدم القدرة على إعادة الإقران، أو فقدان البيانات. دعنا نستعرض المشكلات الأكثر شيوعاً وحلولها.
بعد تحديث البرمجية الثابتة لـ جهاز BLE، قد يتم إعادة ضبط مفاتيح bonding الخاصة به، لكن الهاتف الذكي يستمر في تخزين المفاتيح القديمة (stale bonding). عند محاولة الاتصال، يحاول Central استعادة الجلسة باستخدام LTK القديم، يرفض Peripheral المفتاح، ويفشل الاتصال. الحل هو إزالة bonding على الهاتف الذكي عبر Settings > Bluetooth > Forget Device وإجراء إقران جديد.
رقاقات BLE لها حد أقصى لعدد سجلات bonding المخزنة. بالنسبة لرقاقات Nordic nRF5x الشائعة، يتراوح الحد بين 8-20 سجلاً حسب التكوين. عند تجاوز الحد، يتوقف الجهاز عن قبول إقرانات جديدة. الحل هو إزالة سجلات bonding غير المستخدمة أو استخدام سلسلة مفاتيح ذات أولوية مع تنظيف.
عند استخدام ميزة الخصوصية (عناوين MAC العشوائية)، يغير الجهاز عنوانه بشكل دوري. إذا لم يخزن Central IRK، فلن يتمكن من مطابقة العنوان العشوائي الجديد مع جهاز معروف. الحل هو تنفيذ تخزين IRK بشكل صحيح واستخدامه لحل RPA عند كل اكتشاف لجهاز.
الأسئلة الشائعة
Bonding في Bluetooth Low Energy هو عملية تخزين مفاتيح التشفير (LTK، IRK، CSRK) بعد انتهاء جلسة pairing، لاستعادة الاتصال الآمن تلقائياً عند إعادة الاتصال لاحقاً دون الحاجة إلى إعادة إدخال PIN أو تأكيد.
Pairing هو التفاوض المؤقت على المفاتيح للجلسة الحالية، والتي يتم حذفها عند قطع الاتصال. Bonding يشمل عملية pairing الكاملة بالإضافة إلى تخزين المفاتيح للاتصالات المستقبلية. Bonding مطلوب للأجهزة التي تعيد الاتصال تلقائياً — سماعات الرأس، الساعات، أجهزة تتبع اللياقة البدنية.
على iPhone، يتم إزالة bonding من خلال إعدادات النظام: Settings > Bluetooth > اضغط على أيقونة المعلومات (i) بجانب الجهاز > اختر Forget This Device. بعد ذلك، يتم حذف مفاتيح التشفير، وسيتطلب الاتصال التالي إقراناً جديداً.
عدد الأجهزة المرتبطة يعتمد على سعة الذاكرة غير المتطايرة لرقاقة BLE. يمكن للهواتف الذكية تخزين مئات السجلات، بينما تكون الأجهزة الطرفية BLE محدودة بـ 8-20 سجلاً. عند تجاوز الحد، يتم استبدال السجلات القديمة أو يتوقف الجهاز عن قبول إقرانات جديدة.
Stale bonding هو حالة حيث تم إعادة ضبط مفاتيح التشفير على جهاز واحد (عادةً Peripheral) (مثلاً، بعد تحديث البرمجية الثابتة)، بينما لا يزال Central يحتفظ بالمفاتيح القديمة. نتيجة لذلك، لا يمكن إنشاء الاتصال حتى يقوم المستخدم بإزالة stale bonding عبر إعدادات Bluetooth وإجراء إقران جديد.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.