CBCentralManager — iOS-da Core Bluetooth freymvorkunun mərkəzi sinifidir, BLE periferiya cihazlarının skan edilməsi, qoşulması və qarşılıqlı əlaqəsini idarə edir. Core Bluetooth (iOS 5+, 2011) BLE yığını üzərində GATT səviyyəsində yüksək səviyyəli abstraksiya təmin edir, tərtibatçıdan Link Layer və HCI detallarını gizlədir. CBCentralManager Central rolunu həyata keçirir: scanForPeripherals vasitəsilə efiri skan edir, connect ilə qoşulmanı başladır, discoverServices ilə xidmətləri aşkar edir və məlumat ötürülməsini idarə edir. Apple Developer Documentation (2024) məlumatına görə, CBCentralManager BLE 5.0 olan cihazlarda 7 eyni vaxtda BLE qoşulmasını dəstəkləyir.
Əsas məqamlar
CBCentralManager — iOS-da BLE arxitekturasında Central rolunu həyata keçirmək üçün Core Bluetooth-un əsas sinfidir. BLE bağlantısının bütün həyat dövrünü idarə edir: reklam edən cihazların skan edilməsindən məlumat ötürülməsi və ayrılmaya qədər. CBCentralManager CBCentralManagerDelegate delegatı vasitəsilə asinxron işləyir, Bluetooth yığınındakı hadisələr barədə tətbiqə məlumat verir.
CBCentralManager-ın işə salınması state restoration prosesini başladır: menecer cihazda Bluetooth vəziyyətini yoxlayır və tətbiq bağlanmışdısa əvvəlki bağlantıları bərpa edir. İşə salma prosesi Bluetooth vəziyyətindən asılı olaraq 50 ilə 500 ms arasında çəkə bilər. Tətbiq hər hansı BLE əməliyyatlarına başlamazdan əvvəl centralManagerDidUpdateState çağırışını gözləməlidir.
Core Bluetooth arxitekturası Delegation nümunəsinə əsaslanır: CBCentralManager hadisələrin işlənməsini (cihazların aşkarlanması, qoşulma, xətalar) CBCentralManagerDelegate protokoluna həvalə edir. Müəyyən bir Peripheral ilə işləmək üçün CBPeripheralDelegate protokolu istifadə olunur, xidmətlərin, xarakteristikaların aşkarlanması və məlumatların alınması barədə məlumat verir. Bu asinxron model UI-nin bloklanmadan işləməsini təmin edir.
CBCentralManager bir neçə vəziyyətdən keçir, BLE yığınının iş üçün əlçatan olub-olmadığını müəyyənləşdirir. Vəziyyət delegat vasitəsilə ötürülür: centralManagerDidUpdateState(_:). Tərtibatçı bütün vəziyyətləri idarə etməlidir — təkcə poweredOn deyil, həm də Bluetooth söndürüldükdə və ya əlçatan olmadıqda.
| Vəziyyət | Məna | Tərtibatçının hərəkəti |
|---|---|---|
| .poweredOn | Bluetooth açıq və hazırdır | Skan etməyə başla |
| .poweredOff | Bluetooth söndürülüb | İstifadəçiyə xəbərdarlıq göstər |
| .unauthorized | İcazə yoxdur | Parametrlərdə icazə tələb et |
| .unsupported | Cihaz BLE-ni dəstəkləmir | BLE funksiyalarını gizlət |
| .unknown | Vəziyyət müəyyən edilməyib | Növbəti yeniləməni gözlə |
| .resetting | Bluetooth yenidən başladılır | Bərpanı gözlə |
Unauthorized state iOS 13+ ilə getdikcə daha çox rast gəlinir. Bu versiyadan başlayaraq, tətbiq Info.plist-də NSBluetoothAlwaysUsageDescription icazəsinə malik olmalıdır. Olmazsa, mərkəzi menecer .unauthorized vəziyyətinə keçir və skan etmə mümkün olmur. İstifadəçi istənilən vaxt Parametrlər > Gizlilik > Bluetooth bölməsində icazəni dəyişə bilər.
scanForPeripherals(withServices:options:) — skan etməni işə salmaq üçün əsas metoddur. withServices parametri filtrasiya üçün xidmət UUID-ləri massivini qəbul edir: nil ötürülərsə, bütün cihazlar aşkarlanacaq, bu da enerji sərfiyyatını əhəmiyyətli dərəcədə artırır. Həmişə tətbiqə lazım olan xidmətlərin UUID-ləri ilə filtrasiya etmək tövsiyə olunur. Skan etmə seçimlərinə CBCentralManagerScanOptionAllowDuplicatesKey (eyni cihaz haqqında təkrar bildirişlər) daxildir.
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 Xidməti
centralManager.scanForPeripherals(
withServices: [serviceUUID],
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
Cihaz aşkar edildikdə centralManager(_:didDiscover:advertisementData:rssi:) çağırılır. advertisementData parametri reklam paketinin tam lüğətini ehtiva edir, cihazın adı (CBAdvertisementDataLocalNameKey), xidmət UUID-ləri (CBAdvertisementDataServiceUUIDsKey) və istehsalçı məlumatları (CBAdvertisementDataManufacturerDataKey) daxil olmaqla. RSSI — dBm ilə siqnal səviyyəsi, aşkarlanma anında mövcuddur.
connect(_:options:) — aşkar edilmiş Peripheral ilə BLE bağlantısı qurmaq üçün metoddur. connect çağırıldıqdan sonra iOS cihaza qoşulmağa çalışır. Uğurlu qoşulma centralManager(_:didConnect:) çağırışı ilə, xəta isə centralManager(_:didFailToConnect:error:) ilə təsdiqlənir. Qoşulma seçimlərinə fon bildirişləri üçün CBConnectPeripheralOptionNotifyOnConnectionKey, CBConnectPeripheralOptionNotifyOnDisconnectionKey və CBConnectPeripheralOptionNotifyOnNotificationKey daxildir.
// BLE cihazına qoşul
func connectToPeripheral(
_ peripheral: CBPeripheral
) {
centralManager.connect(peripheral, options: nil)
// Peripheral üçün delegat təyin et
peripheral.delegate = self
}
// Delegat: uğurlu qoşulma
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
print("Qoşuldu: " +
"\(peripheral.name ?? "unknown")")
// Xidmət aşkarlanmasına başla
peripheral.discoverServices(nil)
}
// Delegat: qoşulma xətası
func centralManager(
_ central: CBCentralManager,
didFailToConnect peripheral: CBPeripheral,
error: Error?
) {
print("Connection failed:
\(error?.localizedDescription ?? "")")
}
Qoşulma vaxt aşımı iOS-da 30 saniyədir. Bu müddət ərzində cihaz qoşulma sorğusuna cavab verməzsə, didFailToConnect çağırılır. Vaxt aşımına təsir edən amillər: cihaza qədər məsafə, müdaxilələr, cihazın hazırda reklam edib-etməməsi. Qoşulmadan əvvəl cihazın connectable advertising rejimində (ADV_IND, ADV_NONCONN_IND deyil) olduğuna əmin olun.
Qoşulduqdan sonra Peripheral-in xidmətlərini (discoverServices) və xarakteristikalarını (discoverCharacteristics) aşkar etmək lazımdır. Bu, məlumat oxumaq və ya yazmaqdan əvvəl məcburi addımdır. Proses asinxrondur: discoverServices nəticəni peripheral(_:didDiscoverServices:) vasitəsilə, discoverCharacteristics isə peripheral(_:didDiscoverCharacteristicsFor:error:) vasitəsilə qaytarır.
discoverServices-ə nil deyil, maraq doğuran UUID-lərin massivini ötürmək tövsiyə olunur. Filtrasiya aşkarlamanı sürətləndirir və enerjiyə qənaət edir. Xidmət tapılmazsa, iOS boş massiv bildirəcək. Xarakteristikalar aşkar edildikdən sonra onların dəyərlərini oxumaq (readValue), bildirişlərə abunə olmaq (setNotifyValue) və ya məlumat yazmaq (writeValue) mümkündür.
Vacib nüans: MTU avtomatik razılaşdırılır qoşulmadan sonra. Cari MTU-nu əldə etmək üçün peripheral.maximumWriteValueLength(for: .withResponse) və ya .withoutResponse istifadə edin. iOS-da maksimum MTU BLE 5.0 cihazları üçün 512 baytdır. MTU-dan böyük məlumat ötürmək lazımdırsa, tətbiq səviyyəsində fraqmentasiya tətbiq edin.
Fonda skan etmə BLE cihazlarının iOS-da xüsusi konfiqurasiya tələb edir. Core Bluetooth fon icrasını dəstəkləyir, lakin əhəmiyyətli məhdudiyyətlərlə. Fonda işləmək üçün tələb olunur: layihənin Capabilities bölməsində Background Modes-da bluetooth-central-ı aktivləşdirmək, state restoration üçün CBCentralManagerOptionRestoreIdentifierKey ilə CBCentralManager-ı işə salmaq və fona keçərkən mərkəzi menecer hadisələrini idarə etmək.
iOS-da fonda BLE məhdudiyyətləri: UUID ilə filtrasiya olmadan scanForPeripherals fonda işləmir. Tətbiq skan etmə üçün konkret xidmət UUID-lərini təyin etməlidir. iOS BLE hadisələrinin çatdırılmasını qeyri-müəyyən müddətə gecikdirə bilər. Core Bluetooth uyğun cihaz aşkar edildikdə avtomatik skan etməni bərpa edir, hətta tətbiq fonda olsa belə. Fonda skan etmə vaxt aşımı: iOS enerjiyə qənaət üçün 10-30 dəqiqədən sonra skan etməni dayandıra bilər.
State Restoration — Core Bluetooth mexanizmi, tətbiq yenidən başladıldıqda və ya iOS reboot edildikdə BLE bağlantılarını bərpa etməyə imkan verir. İstifadə üçün: işə salarkən CBCentralManagerOptionRestoreIdentifierKey təyin edin, delegatda centralManager(_:willRestoreState:) tətbiq edin və ötürülən lüğətdən qoşulmuş Peripheral siyahısını bərpa edin. State Restoration — fonda işləyən BLE tətbiqləri üçün kritik funksionallıqdır, məsələn fitnes izləyiciləri və ya tibbi cihazlar.
CBCentralManager xətalar yaradır bir neçə ssenaridə: qoşulma uğursuz oldu (didFailToConnect), bağlantı kəsildi (didDisconnectPeripheral), xarakteristika oxumaq/yazmaq üçün əlçatan deyil (didWriteValue error). Bütün Core Bluetooth xətaları CBErrorDomain domeni ilə Error obyekti vasitəsilə qaytarılır. Ən çox rast gəlinən kodlar: CBErrorConnectionTimeout (0x04), CBErrorPeripheralDisconnected (0x07), CBErrorOperationNotSupported (0x0A).
Bağlantı bərpa strategiyası: didDisconnectPeripheral qəbul edildikdə xəta kodunu yoxlayın. Xəta CBErrorConnectionTimeout və ya CBErrorPeripheralDisconnected-dirsə — 1-5 saniyə sonra avtomatik yenidən qoşulmanı planlaşdırın. Xəta CBErrorOperationNotSupported-dirsə — jurnala yazın və əməliyyatı təkrarlamağa çalışmayın. Kritik bağlantılar üçün (tibbi cihazlar) maksimum 60 saniyə intervalla exponential backoff istifadə edin.
// Avtomatik yenidən qoşulma ilə ayrılmanın idarə edilməsi
func centralManager(
_ central: CBCentralManager,
didDisconnectPeripheral peripheral: CBPeripheral,
error: Error?
) {
guard let error = error else {
return // Gözlənilən ayrılma
}
print("Disconnected: \(error.localizedDescription)")
// Avtomatik yenidən qoşulma
if shouldAutoReconnect {
DispatchQueue.main.asyncAfter(
deadline: .now() + reconnectDelay
) {
central.connect(peripheral)
}
}
}
iOS-da etibarlı BLE tətbiqi hazırlayarkən nəzərə alın: Core Bluetooth zəif siqnal olduqda bütün paketlərin çatdırılmasına zəmanət vermir. Etibarlı ötürmə üçün writeType .withResponse (təsdiqlənmiş yazma) istifadə edin və Peripheral-dən məlumat almaq üçün bildirişlərə (setNotifyValue) abunə olun. İstehsalatda bağlantı problemlərini diaqnoz etmək üçün xəta jurnalı aparın.
Tez-tez verilən suallar
Menecerin vəziyyətini centralManagerDidUpdateState vasitəsilə yoxlayın. NSBluetoothAlwaysUsageDescription icazəsinin Info.plist-də olduğuna, Bluetooth-un cihazda açıq olduğuna və periferiya cihazının düzgün tiplə (connectable advertising, non-connectable deyil) reklam etdiyinə əmin olun.
BLE 5.0 olan cihazlarda (iPhone 8 və daha yeniləri) — 7 eyni vaxtda qoşulmaya qədər. Köhnə cihazlarda — 3-5-ə qədər. Skan edilən cihazların sayı məhdud deyil, lakin aktiv bağlantılar Bluetooth Controller tərəfindən müəyyən edilmiş ciddi limitə malikdir.
UUID ilə filtrasiya ilə skan etmək və cihaz tapıldıqda skan etməni söndürmək tövsiyə olunur. Davamlı skan etmə batareyanı boşaldır: 1 saat fasiləsiz skan etmə iPhone batareyasının ~10-15%-ni sərf edir. Skan etməni dayandırmaq üçün taymerlərdən və şərtlərdən istifadə edin.
CBCentralManager — xarici BLE cihazlarını skan etmək və onlara qoşulmaq üçün (Central rol). CBPeripheralManager — iOS cihazınızın özünün BLE periferiyası kimi çıxış etməsi üçün (xidmətləri reklam etmək). Bir nüsxə yalnız bir rolda ola bilər.
centralManager(_:didDisconnectPeripheral:error:) tətbiq edin. Xəta nil deyilsə — exponential backoff ilə avtomatik yenidən qoşulmanı planlaşdırın (1 s → 2 s → 4 s → 8 s → maks 60 s). Xəta nil-dirsə — cihaz normal şəkildə ayrılıb (məsələn, istifadəçi cihazdakı düyməni basıb).
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun