CBCentralManager في iOS — ما هو، إدارة BLE وCore Bluetooth

المؤلف: IT Sectr نُشر: 2026-07-16 وقت القراءة: 11 دق

CBCentralManager هو الفئة المركزية لإطار Core Bluetooth في iOS التي تدير المسح والاتصال والتفاعل مع الأجهزة الطرفية BLE. يوفر Core Bluetooth (iOS 5+، 2011) تجريداً عالي المستوى فوق مكدس BLE على مستوى GATT، مخفياً عن المطور تفاصيل Link Layer وHCI. ينفذ CBCentralManager دور Central: فهو يمسح الهواء عبر scanForPeripherals، ويبدأ الاتصال عبر connect، ويكتشف الخدمات عبر discoverServices ويدير نقل البيانات. وفقاً لوثائق مطوري Apple (2024)، يدعم CBCentralManager ما يصل إلى 7 اتصالات متزامنة مع أجهزة BLE على الأجهزة المزودة بـ BLE 5.0.

الخلاصة

  • CBCentralManager هي فئة iOS لإدارة مسح BLE والاتصالات ونقل البيانات في دور Central.
  • يبدأ المسح عبر scanForPeripherals مع تصفية بواسطة UUID الخدمات لتوفير الطاقة.
  • يتم الاتصال عبر connect(peripheral:options:) مع تتبع الحالة من خلال المفوض.
  • يدعم iOS ما يصل إلى 7 اتصالات BLE متزامنة على الأجهزة المزودة بـ BLE 5.0.
  • يتطلب المسح في الخلفية تفعيل bluetooth-central في Background Modes واستخدام CBCentralManagerScanOptionAllowDuplicatesKey.

ما هو CBCentralManager؟

CBCentralManager هي الفئة الرئيسية لـ Core Bluetooth لتطبيق دور Central في بنية BLE على iOS. يدير دورة حياة اتصال BLE بالكامل: من مسح الأجهزة المعلنة إلى نقل البيانات وقطع الاتصال. يعمل CBCentralManager بشكل غير متزامن من خلال مفوض CBCentralManagerDelegate، لإعلام التطبيق بالأحداث في مكدس Bluetooth.

يبدأ تهيئة CBCentralManager عملية استعادة الحالة: يتحقق المدير من حالة Bluetooth على الجهاز ويستعيد الاتصالات السابقة إذا تم إغلاق التطبيق. يمكن أن تستغرق عملية التهيئة من 50 إلى 500 مللي ثانية اعتماداً على حالة Bluetooth. يجب على التطبيق انتظار استدعاء centralManagerDidUpdateState قبل بدء أي عمليات BLE.

تم تصميم بنية Core Bluetooth على نمط التفويض: يفوض CBCentralManager معالجة الأحداث (اكتشاف الأجهزة، الاتصال، الأخطاء) إلى بروتوكول CBCentralManagerDelegate. للعمل مع جهاز طرفي محدد، يتم استخدام بروتوكول CBPeripheralDelegate، الذي يخطر باكتشاف الخدمات والخصائص واستلام البيانات. يضمن هذا النموذج غير المتزامن واجهة مستخدم غير محجوبة.

حالات CBCentralManager

يمر CBCentralManager بعدة حالات تحدد ما إذا كان مكدس BLE متاحاً. يتم نقل الحالة من خلال المفوض: centralManagerDidUpdateState(_:). يجب على المطور معالجة جميع الحالات — ليس فقط poweredOn، ولكن أيضاً الحالات التي يكون فيها Bluetooth مغلقاً أو غير متاح.

الحالةالقيمةإجراء المطور
.poweredOnBluetooth قيد التشغيل وجاهزبدء المسح
.poweredOffBluetooth متوقفإظهار تنبيه للمستخدم
.unauthorizedلا يوجد إذنطلب الإذن في الإعدادات
.unsupportedالجهاز لا يدعم BLEإخفاء ميزات BLE
.unknownالحالة غير محددةانتظار التحديث التالي
.resettingBluetooth يعاد تشغيلهانتظار الاستعادة

حالة عدم التصريح أصبحت أكثر شيوعاً منذ iOS 13+. ابتداءً من هذا الإصدار، يجب أن يحتوي التطبيق على تصريح NSBluetoothAlwaysUsageDescription في Info.plist. بدونه، ينتقل المدير المركزي إلى حالة .unauthorized ويصبح المسح مستحيلاً. يمكن للمستخدم تغيير التصريح في الإعدادات > الخصوصية > Bluetooth في أي وقت.

مسح أجهزة BLE

scanForPeripherals(withServices:options:) هي الطريقة الرئيسية لبدء المسح. تقبل المعلمة withServices مصفوفة من UUID الخدمات للتصفية: إذا تم تمرير nil، سيتم اكتشاف جميع الأجهزة، مما يزيد استهلاك الطاقة بشكل كبير. يوصى دائماً بالتصفية حسب UUID الخدمات التي يحتاجها التطبيق. تتضمن خيارات المسح CBCentralManagerScanOptionAllowDuplicatesKey (إشعارات متكررة عن نفس الجهاز).

swift
import CoreBluetooth

class BLEController: NSObject,
    CBCentralManagerDelegate {

    private var centralManager: CBCentralManager!

    override init() {
        super.init()
        centralManager =
            CBCentralManager(
                delegate: self,
                queue: nil
            )
    }

    func startScanning() {
        let serviceUUID =
            CBUUID("180F") // خدمة البطارية

        centralManager.scanForPeripherals(
            withServices: [serviceUUID],
            options: [
                CBCentralManagerScanOptionAllowDuplicatesKey: false
            ]
        )
    }
}

عند اكتشاف جهاز، يتم استدعاء centralManager(_:didDiscover:advertisementData:rssi:). تحتوي المعلمة advertisementData على قاموس كامل لبيانات حزمة الإعلان، بما في ذلك اسم الجهاز (CBAdvertisementDataLocalNameKey)، UUID الخدمات (CBAdvertisementDataServiceUUIDsKey) وبيانات الشركة المصنعة (CBAdvertisementDataManufacturerDataKey). RSSI هو مستوى الإشارة بالديسيبل مللي واط المتاح وقت الاكتشاف.

الاتصال بجهاز طرفي

connect(_:options:) هي الطريقة لإنشاء اتصال BLE مع جهاز طرفي مكتشف. بعد استدعاء connect، يحاول iOS الاتصال بالجهاز. يتم تأكيد الاتصال الناجح عبر centralManager(_:didConnect:)، والخطأ عبر centralManager(_:didFailToConnect:error:). تتضمن خيارات الاتصال CBConnectPeripheralOptionNotifyOnConnectionKey وCBConnectPeripheralOptionNotifyOnDisconnectionKey وCBConnectPeripheralOptionNotifyOnNotificationKey للإشعارات في الخلفية.

swift
// الاتصال بجهاز BLE
func connectToPeripheral(
    _ peripheral: CBPeripheral
) {
    centralManager.connect(peripheral, options: nil)

    // تعيين مفوض للجهاز الطرفي
    peripheral.delegate = self
}

// المفوض: اتصال ناجح
func centralManager(
    _ central: CBCentralManager,
    didConnect peripheral: CBPeripheral
) {
    print("متصل بـ " +
          "\(peripheral.name ?? "unknown")")

    // بدء اكتشاف الخدمات
    peripheral.discoverServices(nil)
}

// المفوض: خطأ في الاتصال
func centralManager(
    _ central: CBCentralManager,
    didFailToConnect peripheral: CBPeripheral,
    error: Error?
) {
    print("Connection failed: 
          \(error?.localizedDescription ?? "")")
}

مهلة الاتصال على iOS هي 30 ثانية. إذا لم يستجب الجهاز لطلب الاتصال خلال هذا الوقت، يتم استدعاء didFailToConnect. تتأثر المهلة بـ: المسافة إلى الجهاز، التداخل، وما إذا كان الجهاز يعلن حالياً. قبل الاتصال، تأكد من أن الجهاز في وضع الإعلان القابل للاتصال (ADV_IND، وليس ADV_NONCONN_IND).

اكتشاف الخدمات والخصائص

بعد الاتصال، يجب اكتشاف الخدمات (discoverServices) والخصائص (discoverCharacteristics) للجهاز الطرفي. هذه خطوة إلزامية قبل قراءة أو كتابة البيانات. العملية غير متزامنة: تُرجع discoverServices النتائج عبر peripheral(_:didDiscoverServices:)، وتُرجع discoverCharacteristics عبر peripheral(_:didDiscoverCharacteristicsFor:error:).

يوصى بتمرير مصفوفة من UUID ذات الصلة إلى discoverServices بدلاً من nil. التصفية تسرع الاكتشاف وتوفر الطاقة. إذا لم يتم العثور على خدمة، سيبلغ iOS عن مصفوفة فارغة. بعد اكتشاف الخصائص، يمكنك قراءة قيمها (readValue)، الاشتراك في الإشعارات (setNotifyValue) أو كتابة البيانات (writeValue).

فارق دقيق مهم: يتم التفاوض على MTU تلقائياً بعد الاتصال. للحصول على MTU الحالي، استخدم peripheral.maximumWriteValueLength(for: .withResponse) أو .withoutResponse. في iOS، الحد الأقصى لـ MTU هو 512 بايت لأجهزة BLE 5.0. إذا كنت بحاجة لنقل بيانات أكبر من MTU، قم بتنفيذ التجزئة على مستوى التطبيق.

المسح في الخلفية وقيود iOS

المسح في الخلفية لأجهزة BLE على iOS يتطلب تكويناً خاصاً. يدعم Core Bluetooth التنفيذ في الخلفية، ولكن مع قيود كبيرة. للعمل في الخلفية، تحتاج إلى: تفعيل bluetooth-central في Background Modes في قدرات المشروع، تهيئة CBCentralManager مع خيار CBCentralManagerOptionRestoreIdentifierKey لاستعادة الحالة، ومعالجة أحداث المدير المركزي عند الانتقال إلى الخلفية.

قيود BLE في الخلفية على iOS: scanForPeripherals بدون تصفية UUID لا يعمل في الخلفية. يجب على التطبيق تحديد UUID خدمات محددة للمسح. قد يؤخر iOS تسليم أحداث BLE لفترة غير محددة. يستأنف Core Bluetooth المسح تلقائياً عند اكتشاف جهاز مطابق، حتى إذا كان التطبيق في الخلفية. مهلة المسح في الخلفية: قد يوقف iOS المسح بعد 10–30 دقيقة لتوفير الطاقة.

استعادة الحالة هي آلية Core Bluetooth التي تسمح باستعادة اتصالات BLE بعد إعادة تشغيل التطبيق أو إعادة تشغيل iOS. لاستخدامها: حدد CBCentralManagerOptionRestoreIdentifierKey أثناء التهيئة، نفذ centralManager(_:willRestoreState:) في المفوض، واستعد قائمة الأجهزة الطرفية المتصلة من القاموس الذي تم تمريره. استعادة الحالة هي وظيفة حاسمة لتطبيقات BLE التي تعمل في الخلفية، مثل أجهزة تتبع اللياقة البدنية أو الأجهزة الطبية.

معالجة الأخطاء واستعادة الاتصال

يولد CBCentralManager أخطاءً في عدة سيناريوهات: فشل الاتصال (didFailToConnect)، قطع الاتصال (didDisconnectPeripheral)، الخاصية غير متاحة للقراءة/الكتابة (خطأ didWriteValue). يتم إرجاع جميع أخطاء Core Bluetooth عبر كائن Error مع نطاق CBErrorDomain. الرموز الأكثر شيوعاً: CBErrorConnectionTimeout (0x04)، CBErrorPeripheralDisconnected (0x07)، CBErrorOperationNotSupported (0x0A).

استراتيجية استعادة الاتصال: عند استلام didDisconnectPeripheral، تحقق من رمز الخطأ. إذا كان الخطأ CBErrorConnectionTimeout أو CBErrorPeripheralDisconnected — قم بجدولة إعادة اتصال تلقائية بعد 1–5 ثوانٍ. إذا كان الخطأ CBErrorOperationNotSupported — سجله ولا تحاول تكرار العملية. للاتصالات الحرجة (الأجهزة الطبية)، استخدم التراجع الأسي بحد أقصى 60 ثانية.

swift
// معالجة قطع الاتصال مع إعادة الاتصال التلقائي
func centralManager(
    _ central: CBCentralManager,
    didDisconnectPeripheral peripheral: CBPeripheral,
    error: Error?
) {
    guard let error = error else {
        return // قطع الاتصال المتوقع
    }

    print("Disconnected: \(error.localizedDescription)")

    // إعادة الاتصال التلقائي
    if shouldAutoReconnect {
        DispatchQueue.main.asyncAfter(
            deadline: .now() + reconnectDelay
        ) {
            central.connect(peripheral)
        }
    }
}

عند تطوير تطبيق BLE قوي على iOS، ضع في اعتبارك: Core Bluetooth لا يضمن تسليم جميع الحزم عند الإشارة الضعيفة. لنقل موثوق، استخدم writeType .withResponse (كتابة مؤكدة) واشترك في الإشعارات (setNotifyValue) لتلقي البيانات من الجهاز الطرفي. احتفظ بسجل للأخطاء لتشخيص مشاكل الاتصال في الإنتاج.

الأسئلة المتكررة

لماذا لا يكتشف CBCentralManager الأجهزة؟

تحقق من حالة المدير عبر centralManagerDidUpdateState. تأكد من أن تصريح NSBluetoothAlwaysUsageDescription موجود في Info.plist، وأن Bluetooth مفعل على الجهاز، وأن الجهاز الطرفي يعلن بالنوع الصحيح (إعلان قابل للاتصال، وليس غير قابل للاتصال).

كم عدد أجهزة BLE التي يمكن الاتصال بها في وقت واحد مع iOS؟

على الأجهزة المزودة بـ BLE 5.0 (iPhone 8 وأحدث) — ما يصل إلى 7 اتصالات متزامنة. على الأجهزة الأقدم — ما يصل إلى 3–5. عدد الأجهزة التي يتم مسحها غير محدود، ولكن الاتصالات النشطة لها حد صارم تحدده وحدة تحكم Bluetooth.

كم مرة يمكنني مسح BLE على iOS دون استنزاف البطارية؟

يوصى بالمسح مع تصفية UUID وإيقاف المسح عند العثور على الجهاز. المسح المستمر يستنزف البطارية: ساعة واحدة من المسح المتواصل تستهلك ~10–15% من شحن iPhone. استخدم المؤقتات والشروط لإيقاف المسح.

ما الفرق بين CBCentralManager وCBPeripheralManager؟

CBCentralManager لمسح والاتصال بأجهزة BLE الخارجية (دور Central). CBPeripheralManager لجعل جهاز iOS الخاص بك يعمل كجهاز طرفي BLE (يعلن عن الخدمات). يمكن أن تكون النسخة الواحدة في دور واحد فقط.

كيف يتم معالجة فقدان الاتصال بجهاز BLE؟

قم بتنفيذ centralManager(_:didDisconnectPeripheral:error:). إذا كان الخطأ ليس nil — قم بجدولة إعادة اتصال تلقائية مع تراجع أسي (1 ث ← 2 ث ← 4 ث ← 8 ث ← حد أقصى 60 ث). إذا كان الخطأ nil — فقد تم قطع الاتصال بشكل طبيعي (مثلاً، ضغط المستخدم على زر في الجهاز).

الملخص

  • CBCentralManager هي الفئة الرئيسية لـ Core Bluetooth لإدارة مسح BLE والاتصالات ونقل البيانات في دور Central على iOS.
  • يبدأ المسح عبر scanForPeripherals مع تصفية اختيارية بواسطة UUID الخدمات لتقليل استهلاك الطاقة.
  • يتم الاتصال عبر connect، يتم تأكيد النجاح عبر didConnect، والخطأ عبر didFailToConnect مع مهلة 30 ثانية.
  • بعد الاتصال، يجب اكتشاف الخدمات والخصائص عبر discoverServices وdiscoverCharacteristics.
  • المسح في الخلفية يتطلب bluetooth-central Background Mode ومدعوم مع قيود (تصفية UUID، تأخيرات محتملة).
  • يدعم iOS ما يصل إلى 7 اتصالات BLE متزامنة على الأجهزة المزودة بـ BLE 5.0، واستعادة الحالة للاسترداد بعد إعادة التشغيل.
  • معالجة الأخطاء وإعادة الاتصال التلقائي مع التراجع الأسي هما أساس تطبيق BLE موثوق على iOS.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا