CBCentralManager iOS da — bu nima, BLE boshqaruvi va Core Bluetooth

Muallif: IT Sectr Nashr etilgan: 2026-07-16 O'qish vaqti: 11 daq

CBCentralManager — iOS da Core Bluetooth freymvorkining markaziy sinifi bo‘lib, BLE periferiya qurilmalarini skanerlash, ulash va o‘zaro aloqani boshqaradi. Core Bluetooth (iOS 5+, 2011) BLE steki ustida GATT darajasida yuqori darajadabstraksiya ta‘minlaydi, dasturchidan Link Layer va HCI tafsilotlarini yashiradi. CBCentralManager Central rolini bajaradi: scanForPeripherals orqali efirni skanerlaydi, connect orqali ulanishni boshlaydi, discoverServices orqali xizmatlarni kashf etadi va ma‘lumot uzatishni boshqaradi. Apple Developer Documentation (2024) ma‘lumotiga ko‘ra, CBCentralManager BLE 5.0 qurilmalarida 7 tagacha bir vaqtning o‘zida BLE ulanishini qo‘llab-quvvatlaydi.

Asosiy ma’lumotlar

  • CBCentralManager — iOS da BLE skanerlash, ulash va ma’lumot uzatishni Central rolida boshqaruvchi sinif.
  • Skanerlash scanForPeripherals orqali energiya tejash uchun xizmat UUIDlari bilan filtrlangan holda ishga tushiriladi.
  • Ulanish connect(peripheral:options:) orqali delegat orqali holat kuzatilgan holda amalga oshiriladi.
  • iOS BLE 5.0 qurilmalarida 7 tagacha bir vaqtda BLE ulanishini qo‘llab-quvvatlaydi.
  • Fonda skanerlash Background Modes da bluetooth-central yoqilishini va CBCentralManagerScanOptionAllowDuplicatesKey dan foydalanishni talab qiladi.

CBCentralManager nima?

CBCentralManager — iOS da BLE arxitekturasida Central rolini amalga oshirish uchun Core Bluetooth ning asosiy sinifi. BLE ulanishining butun hayot siklini boshqaradi: reklama qilayotgan qurilmalarni skanerlashdan ma’lumot uzatish va uzilishgacha. CBCentralManager CBCentralManagerDelegate delegati orqali asinxron ishlaydi, Bluetooth stekidagi hodisalar haqida ilovani xabardor qiladi.

CBCentralManager ni ishga tushirish state restoration jarayonini boshlaydi: menejer qurilmada Bluetooth holatini tekshiradi va ilova yopilgan bo‘lsa, avvalgi ulanishlarni tiklaydi. Ishga tushirish jarayoni Bluetooth holatiga qarab 50 dan 500 ms gacha davom etishi mumkin. Ilova har qanday BLE operatsiyalarini boshlashdan oldin centralManagerDidUpdateState chaqiruvini kutishi kerak.

Core Bluetooth arxitekturasi Delegation namunasiga asoslangan: CBCentralManager hodisalarni qayta ishlashni (qurilmalarni kashf etish, ulanish, xatolar) CBCentralManagerDelegate protokoliga topshiradi. Muayyan Peripheral bilan ishlash uchun CBPeripheralDelegate protokoli ishlatiladi, u xizmatlar, xususiyatlarni kashf etish va ma’lumot olish haqida xabar beradi. Bunday asinxron model UI ning bloklanmasdan ishlashini ta’minlaydi.

CBCentralManager holatlari

CBCentralManager bir nechta holatlardan o‘tadi, BLE stekining ishlash uchun mavjudligini aniqlaydi. Holat delegat orqali uzatiladi: centralManagerDidUpdateState(_:). Dasturchi barcha holatlarni boshqarishi kerak — nafaqat poweredOn, balki Bluetooth o‘chirilgan yoki mavjud bo‘lmagan holatlarni ham.

HolatMa’nosiDasturchining harakati
.poweredOnBluetooth yoqilgan va tayyorSkanerlashni boshlash
.poweredOffBluetooth o‘chirilganFoydalanuvchiga ogohlantirish ko‘rsatish
.unauthorizedRuxsat yo‘qSozlamalarda ruxsat so‘rash
.unsupportedQurilma BLE ni qo‘llab-quvvatlamaydiBLE funksiyalarini yashirish
.unknownHolat aniqlanmaganKeyingi yangilanishni kutish
.resettingBluetooth qayta ishga tushirilmoqdaTiklanishni kutish

Unauthorized state iOS 13+ dan boshlab tobora keng tarqalgan. Ushbu versiyadan boshlab, ilova Info.plist da NSBluetoothAlwaysUsageDescription ruxsatiga ega bo‘lishi kerak. Aks holda, markaziy menejer .unauthorized holatiga o‘tadi va skanerlash mumkin bo‘lmaydi. Foydalanuvchi istalgan vaqtda Sozlamalar > Maxfiylik > Bluetooth bo‘limida ruxsatni o‘zgartirishi mumkin.

BLE qurilmalarini skanerlash

scanForPeripherals(withServices:options:) — skanerlashni boshlash uchun asosiy metod. withServices parametri filtrlash uchun xizmat UUIDlari massivini qabul qiladi: nil yuborilsa, barcha qurilmalar kashf etiladi, bu energiya sarfini sezilarli darajada oshiradi. Har doim ilovaga kerakli xizmatlarning UUIDlari bilan filtrlash tavsiya etiladi. Skanerlash opsiyalari CBCentralManagerScanOptionAllowDuplicatesKey (bir qurilma haqida takroriy bildirishnomalar) ni o‘z ichiga oladi.

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") // Batareya Xizmati

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

Qurilma kashf etilganda centralManager(_:didDiscover:advertisementData:rssi:) chaqiriladi. advertisementData parametri reklama paketi ma’lumotlarining to‘liq lug‘atini o‘z ichiga oladi, qurilma nomi (CBAdvertisementDataLocalNameKey), xizmat UUIDlari (CBAdvertisementDataServiceUUIDsKey) va ishlab chiqaruvchi ma’lumotlari (CBAdvertisementDataManufacturerDataKey) bilan birga. RSSI — dBm dagi signal darajasi, kashf etish vaqtida mavjud.

Peripheralga ulanish

connect(_:options:) — kashf etilgan Peripheral bilan BLE ulanishini o‘rnatish metodi. connect chaqirilgandan so‘ng iOS qurilmaga ulanishga harakat qiladi. Muvaffaqiyatli ulanish centralManager(_:didConnect:) chaqiruvi bilan, xato esa centralManager(_:didFailToConnect:error:) bilan tasdiqlanadi. Ulanish opsiyalari fonda bildirishnomalar uchun CBConnectPeripheralOptionNotifyOnConnectionKey, CBConnectPeripheralOptionNotifyOnDisconnectionKey va CBConnectPeripheralOptionNotifyOnNotificationKey ni o‘z ichiga oladi.

swift
// BLE qurilmasiga ulanish
func connectToPeripheral(
    _ peripheral: CBPeripheral
) {
    centralManager.connect(peripheral, options: nil)

    // Peripheral uchun delegat o'rnatish
    peripheral.delegate = self
}

// Delegat: muvaffaqiyatli ulanish
func centralManager(
    _ central: CBCentralManager,
    didConnect peripheral: CBPeripheral
) {
    print("Ulangan: " +
          "\(peripheral.name ?? "unknown")")

    // Xizmat kashfiyotini boshlash
    peripheral.discoverServices(nil)
}

// Delegat: ulanish xatosi
func centralManager(
    _ central: CBCentralManager,
    didFailToConnect peripheral: CBPeripheral,
    error: Error?
) {
    print("Connection failed: 
          \(error?.localizedDescription ?? "")")
}

Ulanish vaqti chegarasi iOS da 30 soniya. Agar qurilma shu vaqt ichida ulanish so‘roviga javob bermasa, didFailToConnect chaqiriladi. Vaqt chegarasiga ta’sir qiluvchi omillar: qurilmagacha bo‘lgan masofa, shovqinlar, qurilmaning hozirda reklama qilayotganligi. Ulanishdan oldin qurilma connectable advertising rejimida (ADV_IND, ADV_NONCONN_IND emas) ekanligiga ishonch hosil qiling.

Xizmatlar va xususiyatlarni kashf etish

Ulanishdan so‘ng Peripheral ning xizmatlarini (discoverServices) va xususiyatlarini (discoverCharacteristics) kashf etish kerak. Bu ma’lumot o‘qish yoki yozishdan oldin majburiy qadamdir. Jarayon asinxron: discoverServices natijani peripheral(_:didDiscoverServices:) orqali, discoverCharacteristics esa peripheral(_:didDiscoverCharacteristicsFor:error:) orqali qaytaradi.

discoverServices ga nil emas, balki qiziqish uyg‘otadigan UUIDlar massivini yuborish tavsiya etiladi. Filtrlash kashfiyotni tezlashtiradi va energiyani tejaydi. Xizmat topilmasa, iOS bo‘sh massiv haqida xabar beradi. Xususiyatlar kashf etilgandan so‘ng, ularning qiymatlarini o‘qish (readValue), bildirishnomalarga obuna bo‘lish (setNotifyValue) yoki ma’lumot yozish (writeValue) mumkin.

Muhim nuans: MTU avtomatik kelishiladi ulanishdan so‘ng. Joriy MTUni olish uchun peripheral.maximumWriteValueLength(for: .withResponse) yoki .withoutResponse dan foydalaning. iOS da maksimal MTU BLE 5.0 qurilmalari uchun 512 bayt. MTU dan katta ma’lumot uzatish kerak bo‘lsa, ilova darajasida fragmentatsiyani amalga oshiring.

Fonda skanerlash va iOS cheklovlari

Fonda skanerlash BLE qurilmalarini iOS da maxsus konfiguratsiyani talab qiladi. Core Bluetooth fonda ishlashni qo‘llab-quvvatlaydi, lekin sezilarli cheklovlar bilan. Fonda ishlash uchun zarur: loyihaning Capabilities bo‘limida Background Modes da bluetooth-central ni yoqish, state restoration uchun CBCentralManagerOptionRestoreIdentifierKey opsiyasi bilan CBCentralManager ni ishga tushirish va fonda o‘tishda markaziy menejer hodisalarini boshqarish.

iOS da fonda BLE cheklovlari: UUID bilan filtrlashsiz scanForPeripherals fonda ishlamaydi. Ilova skanerlash uchun aniq xizmat UUIDlarini belgilashi kerak. iOS BLE hodisalarini yetkazib berishni noaniq muddatga kechiktirishi mumkin. Core Bluetooth mos qurilma kashf etilganda avtomatik skanerlashni tiklaydi, hatto ilova fonda bo‘lsa ham. Fonda skanerlash vaqti chegarasi: iOS energiya tejash uchun 10–30 daqiqadan so‘ng skanerlashni to‘xtatishi mumkin.

State Restoration — Core Bluetooth mexanizmi, ilova qayta ishga tushirilganda yoki iOS reboot qilinganda BLE ulanishlarini tiklashga imkon beradi. Foydalanish uchun: ishga tushirishda CBCentralManagerOptionRestoreIdentifierKey ni belgilang, delegatda centralManager(_:willRestoreState:) ni amalga oshiring va uzatilgan lug‘atdan ulangan Peripheral lar ro‘yxatini tiklang. State Restoration — fonda ishlaydigan BLE ilovalari uchun muhim funksionallik, masalan fitnes kuzatuvchilari yoki tibbiy qurilmalar.

Xatolarni boshqarish va ulanishni tiklash

CBCentralManager xatolar yaratadi bir nechta stsenariyda: ulanish muvaffaqiyatsiz (didFailToConnect), ulanish uzildi (didDisconnectPeripheral), xususiyat o‘qish/yozish uchun mavjud emas (didWriteValue error). Barcha Core Bluetooth xatolari CBErrorDomain domeni bilan Error obyekti orqali qaytariladi. Eng keng tarqalgan kodlar: CBErrorConnectionTimeout (0x04), CBErrorPeripheralDisconnected (0x07), CBErrorOperationNotSupported (0x0A).

Ulanishni tiklash strategiyasi: didDisconnectPeripheral qabul qilinganda xato kodini tekshiring. Agar xato CBErrorConnectionTimeout yoki CBErrorPeripheralDisconnected bo‘lsa — 1–5 soniyadan so‘ng avtomatik qayta ulanishni rejalashtiring. Agar xato CBErrorOperationNotSupported bo‘lsa — jurnalga yozing va operatsiyani takrorlamang. Muhim ulanishlar uchun (tibbiy qurilmalar) maksimal 60 soniya interval bilan exponential backoff dan foydalaning.

swift
// Uzilishni avtomatik qayta ulanish bilan boshqarish
func centralManager(
    _ central: CBCentralManager,
    didDisconnectPeripheral peripheral: CBPeripheral,
    error: Error?
) {
    guard let error = error else {
        return // Kutilgan uzilish
    }

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

    // Avtomatik qayta ulanish
    if shouldAutoReconnect {
        DispatchQueue.main.asyncAfter(
            deadline: .now() + reconnectDelay
        ) {
            central.connect(peripheral)
        }
    }
}

iOS da ishonchli BLE ilovasini ishlab chiqishda hisobga oling: Core Bluetooth zaif signalda barcha paketlarni yetkazib berishni kafolatlamaydi. Ishonchli uzatish uchun writeType .withResponse (tasdiqlangan yozish) dan foydalaning va Peripheral dan ma’lumot olish uchun bildirishnomalarga (setNotifyValue) obuna bo‘ling. Ishlab chiqarishda ulanish muammolarini diagnostika qilish uchun xato jurnalini yuriting.

Tez-tez so‘raladigan savollar

Nima uchun CBCentralManager qurilmalarni aniqlamaydi?

Menejer holatini centralManagerDidUpdateState orqali tekshiring. NSBluetoothAlwaysUsageDescription ruxsati Info.plist da borligiga, Bluetooth qurilmada yoqilganligiga va periferiya qurilmasi to‘g‘ri tur bilan (connectable advertising, non-connectable emas) reklama qilayotganligiga ishonch hosil qiling.

Nechta BLE qurilmasi bir vaqtning o‘zida iOS ga ulanishi mumkin?

BLE 5.0 bo‘lgan qurilmalarda (iPhone 8 va yangiroq) — 7 tagacha bir vaqtda ulanish. Eski qurilmalarda — 3–5 gacha. Skanerlanadigan qurilmalar soni cheklanmagan, ammo faol ulanishlar Bluetooth Controller tomonidan o‘rnatilgan qat‘iy chegaraga ega.

iOS da batareyani yo‘qotmasdan BLE ni qanchalik tez-tez skanerlash mumkin?

UUID bilan filtrlangan holda skanerlash va qurilma topilganda skanerlashni o‘chirish tavsiya etiladi. Doimiy skanerlash batareyani zaryadsizlantiradi: 1 soat uzluksiz skanerlash iPhone batareyasining ~10–15% ini sarflaydi. Skanerlashni to‘xtatish uchun taymerlar va shartlardan foydalaning.

CBCentralManager va CBPeripheralManager o‘rtasidagi farq nima?

CBCentralManager — tashqi BLE qurilmalarini skanerlash va ularga ulanish uchun (Central roli). CBPeripheralManager — iOS qurilmangizning o‘zi BLE periferiyasi sifatida ishlashi uchun (xizmatlarni reklama qilish). Bitta nusxa faqat bitta rolda bo‘lishi mumkin.

BLE qurilmasi bilan ulanishni yo‘qotishni qanday boshqarish kerak?

centralManager(_:didDisconnectPeripheral:error:) ni amalga oshiring. Agar xato nil bo‘lmasa — exponential backoff bilan avtomatik qayta ulanishni rejalashtiring (1 s → 2 s → 4 s → 8 s → maks 60 s). Agar xato nil bo‘lsa — qurilma odatdagidek uzilgan (masalan, foydalanuvchi qurilmadagi tugmani bosgan).

Xulosa

  • CBCentralManager — iOS da BLE skanerlash, ulash va ma’lumot uzatishni Central rolida boshqaruvchi Core Bluetooth ning asosiy sinifi.
  • Skanerlash energiya sarfini kamaytirish uchun ixtiyoriy xizmat UUID filtrlashi bilan scanForPeripherals orqali ishga tushiriladi.
  • Ulanish connect orqali amalga oshiriladi, muvaffaqiyat didConnect bilan, xato esa 30 soniya vaqt chegarasi bilan didFailToConnect bilan tasdiqlanadi.
  • Ulanishdan so‘ng discoverServices va discoverCharacteristics orqali xizmatlar va xususiyatlar kashf etilishi kerak.
  • Fonda skanerlash bluetooth-central Background Mode ni talab qiladi va cheklovlar bilan qo‘llab-quvvatlanadi (UUID filtrlash, mumkin bo‘lgan kechikishlar).
  • iOS BLE 5.0 qurilmalarida 7 tagacha bir vaqtda BLE ulanishini qo‘llab-quvvatlaydi, state restoration — qayta ishga tushirishdan so‘ng tiklash uchun.
  • Xatolarni boshqarish va exponential backoff bilan avtomatik qayta ulanish — iOS da ishonchli BLE ilovasining asosi.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing