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 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 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.
| Holat | Ma’nosi | Dasturchining harakati |
|---|---|---|
| .poweredOn | Bluetooth yoqilgan va tayyor | Skanerlashni boshlash |
| .poweredOff | Bluetooth o‘chirilgan | Foydalanuvchiga ogohlantirish ko‘rsatish |
| .unauthorized | Ruxsat yo‘q | Sozlamalarda ruxsat so‘rash |
| .unsupported | Qurilma BLE ni qo‘llab-quvvatlamaydi | BLE funksiyalarini yashirish |
| .unknown | Holat aniqlanmagan | Keyingi yangilanishni kutish |
| .resetting | Bluetooth qayta ishga tushirilmoqda | Tiklanishni 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.
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.
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.
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.
// 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.
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 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.
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.
// 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
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.
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.
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 — 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.
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
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.