CBCentralManager, iOS'ta BLE çevre birimlerini tarama, bağlanma ve etkileşimi yöneten Core Bluetooth framework'ünün merkezi sınıfıdır. Core Bluetooth (iOS 5+, 2011), GATT seviyesinde BLE yığını üzerinde yüksek seviyeli bir soyutlama sağlayarak Link Layer ve HCI ayrıntılarını geliştiriciden gizler. CBCentralManager, Central rolünü uygular: scanForPeripherals ile havayı tarar, connect ile bağlantı başlatır, discoverServices ile hizmetleri keşfeder ve veri aktarımını yönetir. Apple Developer Documentation'a (2024) göre CBCentralManager, BLE 5.0 destekli cihazlarda BLE cihazlarına kadar 7 eşzamanlı bağlantıyı destekler.
Önemli Noktalar
CBCentralManager, iOS'ta BLE mimarisinde Central rolünü uygulamak için ana Core Bluetooth sınıfıdır. BLE bağlantısının tüm yaşam döngüsünü yönetir: reklam veren cihazları taramaktan veri aktarımına ve bağlantı kesmeye kadar. CBCentralManager, CBCentralManagerDelegate aracılığıyla eşzamansız olarak çalışır ve Bluetooth yığınındaki olaylar hakkında uygulamayı bilgilendirir.
CBCentralManager'ı başlatmak, durum geri yükleme sürecini başlatır: yönetici, cihazdaki Bluetooth durumunu kontrol eder ve uygulama kapatıldıysa önceki bağlantıları geri yükler. Başlatma işlemi, Bluetooth durumuna bağlı olarak 50 ila 500 ms sürebilir. Uygulama, herhangi bir BLE işlemine başlamadan önce centralManagerDidUpdateState çağrısını beklemelidir.
Core Bluetooth mimarisi, Delegation desenine dayanır: CBCentralManager, olay işlemeyi (cihaz keşfi, bağlantı, hatalar) CBCentralManagerDelegate protokolüne devreder. Belirli bir çevre birimiyle çalışmak için, keşfedilen hizmetler, özellikler ve alınan veriler hakkında bildirimde bulunan CBPeripheralDelegate protokolü kullanılır. Bu eşzamansız model, bloke olmayan bir kullanıcı arayüzü sağlar.
CBCentralManager, BLE yığınının kullanılabilir olup olmadığını belirleyen birkaç durumdan geçer. Durum, temsilci aracılığıyla iletilir: centralManagerDidUpdateState(_:). Geliştirici, yalnızca poweredOn'ı değil, Bluetooth'un kapalı veya kullanılamadığı durumları da dahil olmak üzere tüm durumları işlemelidir.
| Durum | Değer | Geliştirici Eylemi |
|---|---|---|
| .poweredOn | Bluetooth açık ve hazır | Taramayı başlat |
| .poweredOff | Bluetooth kapalı | Kullanıcıya uyarı göster |
| .unauthorized | İzin yok | Ayarlar'dan izin iste |
| .unsupported | Cihaz BLE desteklemiyor | BLE özelliklerini gizle |
| .unknown | Durum tanımlı değil | Sonraki güncellemeyi bekle |
| .resetting | Bluetooth yeniden başlatılıyor | Kurtarmayı bekle |
Yetkisiz durum, iOS 13+'tan itibaren giderek daha yaygın hale geliyor. Bu sürümden itibaren uygulamanın Info.plist'te NSBluetoothAlwaysUsageDescription iznine sahip olması gerekir. Bu izin olmadan, merkezi yönetici .unauthorized durumuna geçer ve tarama imkansızdır. Kullanıcı, Ayarlar > Gizlilik > Bluetooth'tan izni istediği zaman değiştirebilir.
scanForPeripherals(withServices:options:), taramayı başlatmak için ana yöntemdir. withServices parametresi, filtreleme için bir hizmet UUID dizisi kabul eder: nil iletilirse tüm cihazlar keşfedilir ve bu da güç tüketimini önemli ölçüde artırır. Uygulama için gerekli hizmet UUID'lerine göre her zaman filtreleme yapılması önerilir. Tarama seçenekleri arasında CBCentralManagerScanOptionAllowDuplicatesKey (aynı cihaz hakkında tekrarlanan bildirimler) bulunur.
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") // Pil Servisi
centralManager.scanForPeripherals(
withServices: [serviceUUID],
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
Bir cihaz keşfedildiğinde, centralManager(_:didDiscover:advertisementData:rssi:) çağrılır. advertisementData parametresi, cihaz adı (CBAdvertisementDataLocalNameKey), hizmet UUID'leri (CBAdvertisementDataServiceUUIDsKey) ve üretici verileri (CBAdvertisementDataManufacturerDataKey) dahil olmak üzere reklam paketi verilerinin tam sözlüğünü içerir. RSSI, keşif anında kullanılabilen dBm cinsinden sinyal seviyesidir.
connect(_:options:), keşfedilen bir çevre birimiyle BLE bağlantısı kurma yöntemidir. connect çağrıldıktan sonra iOS, cihaza bağlanmayı dener. Başarılı bağlantı centralManager(_:didConnect:) ile onaylanır, hata centralManager(_:didFailToConnect:error:) ile bildirilir. Bağlantı seçenekleri arasında arka plan bildirimleri için CBConnectPeripheralOptionNotifyOnConnectionKey, CBConnectPeripheralOptionNotifyOnDisconnectionKey ve CBConnectPeripheralOptionNotifyOnNotificationKey bulunur.
// BLE cihazına bağlan
func connectToPeripheral(
_ peripheral: CBPeripheral
) {
centralManager.connect(peripheral, options: nil)
// Çevre birimi için temsilci ayarla
peripheral.delegate = self
}
// Temsilci: başarılı bağlantı
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
print("Bağlandı: " +
"\(peripheral.name ?? "unknown")")
// Hizmet keşfini başlat
peripheral.discoverServices(nil)
}
// Temsilci: bağlantı hatası
func centralManager(
_ central: CBCentralManager,
didFailToConnect peripheral: CBPeripheral,
error: Error?
) {
print("Connection failed:
\(error?.localizedDescription ?? "")")
}
iOS'ta bağlantı zaman aşımı 30 saniyedir. Cihaz bu süre içinde bağlantı isteğine yanıt vermezse didFailToConnect çağrılır. Zaman aşımı şunlardan etkilenir: cihaza olan mesafe, parazit ve cihazın şu anda reklam verip vermediği. Bağlanmadan önce cihazın bağlanabilir reklam modunda (ADV_IND, ADV_NONCONN_IND değil) olduğundan emin olun.
Bağlantıdan sonra, çevre biriminin hizmetlerini (discoverServices) ve özelliklerini (discoverCharacteristics) keşfetmelisiniz. Bu, veri okuma veya yazmadan önce zorunlu bir adımdır. Süreç eşzamansızdır: discoverServices sonuçları peripheral(_:didDiscoverServices:) aracılığıyla, discoverCharacteristics ise peripheral(_:didDiscoverCharacteristicsFor:error:) aracılığıyla döndürür.
discoverServices'a nil yerine ilgili UUID'lerden oluşan bir dizi iletilmesi önerilir. Filtreleme keşfi hızlandırır ve enerji tasarrufu sağlar. Bir hizmet bulunamazsa, iOS boş bir dizi bildirir. Özellikleri keşfettikten sonra değerlerini okuyabilir (readValue), bildirimlere abone olabilir (setNotifyValue) veya veri yazabilirsiniz (writeValue).
Önemli bir nüans: MTU, bağlantıdan sonra otomatik olarak müzakere edilir. Geçerli MTU'yu almak için peripheral.maximumWriteValueLength(for: .withResponse) veya .withoutResponse kullanın. iOS'ta BLE 5.0 cihazlar için maksimum MTU 512 bayttır. MTU'dan büyük veri aktarmanız gerekiyorsa, uygulama düzeyinde parçalama uygulayın.
iOS'ta BLE cihazlarının arka plan taraması özel yapılandırma gerektirir. Core Bluetooth, arka plan yürütmeyi destekler, ancak önemli sınırlamalarla. Arka planda çalışmak için şunları yapmanız gerekir: proje Yetenekleri'nde Background Modes'da bluetooth-central'ı etkinleştirin, durum geri yükleme için CBCentralManagerOptionRestoreIdentifierKey seçeneğiyle CBCentralManager'ı başlatın ve arka plana geçerken merkezi yönetici olaylarını işleyin.
iOS'ta arka plan BLE sınırlamaları: UUID filtrelemesi olmadan scanForPeripherals arka planda çalışmaz. Uygulama, tarama için somut hizmet UUID'leri belirtmelidir. iOS, BLE olaylarının teslimatını süresiz olarak geciktirebilir. Core Bluetooth, uygulama arka planda olsa bile eşleşen bir cihaz keşfedildiğinde taramayı otomatik olarak devam ettirir. Arka plan tarama zaman aşımı: iOS, enerji tasarrufu için 10-30 dakika sonra taramayı durdurabilir.
State Restoration, uygulama yeniden başlatma veya iOS yeniden başlatmasından sonra BLE bağlantılarını geri yüklemeye olanak tanıyan bir Core Bluetooth mekanizmasıdır. Kullanmak için: başlatma sırasında CBCentralManagerOptionRestoreIdentifierKey belirtin, temsilcide centralManager(_:willRestoreState:) uygulayın ve iletilen sözlükten bağlı çevre birimlerinin listesini geri yükleyin. State Restoration, fitness takip cihazları veya tıbbi cihazlar gibi arka planda çalışan BLE uygulamaları için kritik bir işlevdir.
CBCentralManager çeşitli senaryolarda hata oluşturur: bağlantı başarısız (didFailToConnect), bağlantı kesildi (didDisconnectPeripheral), özellik okuma/yazma için kullanılamıyor (didWriteValue hatası). Tüm Core Bluetooth hataları, CBErrorDomain alanına sahip Error nesnesi aracılığıyla döndürülür. En yaygın kodlar: CBErrorConnectionTimeout (0x04), CBErrorPeripheralDisconnected (0x07), CBErrorOperationNotSupported (0x0A).
Bağlantı kurtarma stratejisi: didDisconnectPeripheral alındığında hata kodunu kontrol edin. Hata CBErrorConnectionTimeout veya CBErrorPeripheralDisconnected ise — 1-5 saniye içinde otomatik yeniden bağlanma planlayın. Hata CBErrorOperationNotSupported ise — günlüğe kaydedin ve işlemi tekrar denemeyin. Kritik bağlantılar (tıbbi cihazlar) için maksimum 60 saniye aralıklı üstel geri alma kullanın.
// Otomatik yeniden bağlanmayla bağlantı kesmeyi yönet
func centralManager(
_ central: CBCentralManager,
didDisconnectPeripheral peripheral: CBPeripheral,
error: Error?
) {
guard let error = error else {
return // Beklenen bağlantı kesme
}
print("Disconnected: \(error.localizedDescription)")
// Otomatik yeniden bağlanma
if shouldAutoReconnect {
DispatchQueue.main.asyncAfter(
deadline: .now() + reconnectDelay
) {
central.connect(peripheral)
}
}
}
iOS'ta sağlam bir BLE uygulaması geliştirirken şunları unutmayın: Core Bluetooth, zayıf sinyalde tüm paketlerin teslimatını garanti etmez. Güvenilir iletim için writeType .withResponse (onaylı yazma) kullanın ve çevre biriminden veri almak için bildirimlere (setNotifyValue) abone olun. Üretimde bağlantı sorunlarını teşhis etmek için bir hata günlüğü tutun.
Sıkça Sorulan Sorular
centralManagerDidUpdateState aracılığıyla yönetici durumunu kontrol edin. Info.plist'te NSBluetoothAlwaysUsageDescription izninin olduğundan, cihazda Bluetooth'un etkin olduğundan ve çevre birimi cihazının doğru türde (bağlanabilir reklam, bağlanamaz değil) reklam verdiğinden emin olun.
BLE 5.0 destekli cihazlarda (iPhone 8 ve üzeri) — 7 eşzamanlı bağlantıya kadar. Daha eski cihazlarda — 3-5'e kadar. Taranan cihaz sayısı sınırsızdır, ancak aktif bağlantıların Bluetooth Denetleyicisi tarafından belirlenen katı bir sınırı vardır.
UUID filtrelemesiyle tarama yapmanız ve cihaz bulunduğunda taramayı durdurmanız önerilir. Sürekli tarama pili tüketir: 1 saat kesintisiz tarama, iPhone şarjının ~%10-15'ini tüketir. Taramayı durdurmak için zamanlayıcılar ve koşullar kullanın.
CBCentralManager, harici BLE cihazlarını (Central rolü) taramak ve bağlanmak içindir. CBPeripheralManager, iOS cihazınızın BLE çevre birimi olarak hareket etmesi (hizmetleri reklam vermesi) içindir. Bir örnek yalnızca bir rolde olabilir.
centralManager(_:didDisconnectPeripheral:error:) uygulayın. Hata nil değilse — üstel geri almayla (1 sn → 2 sn → 4 sn → 8 sn → maks 60 sn) otomatik yeniden bağlanma planlayın. Hata nil ise — cihaz normal şekilde bağlantıyı kesmiştir (örneğin, kullanıcı cihazdaki bir düğmeye bastı).
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun