CBCentralManager — adalah kelas utama dari framework Core Bluetooth di iOS yang mengelola pemindaian, koneksi, dan interaksi dengan perangkat periferal BLE. Core Bluetooth (iOS 5+, 2011) menyediakan abstraksi tingkat tinggi di atas tumpukan BLE pada level GATT, menyembunyikan detail Link Layer dan HCI dari pengembang. CBCentralManager menjalankan peran Central: ia memindai eter melalui scanForPeripherals, memulai koneksi melalui connect, menemukan layanan melalui discoverServices, dan mengelola transfer data. Menurut Apple Developer Documentation (2024), CBCentralManager mendukung hingga 7 koneksi BLE simultan pada perangkat dengan BLE 5.0.
Poin Penting
CBCentralManager — adalah kelas utama Core Bluetooth untuk mengimplementasikan peran Central dalam arsitektur BLE di iOS. Kelas ini mengelola seluruh siklus hidup koneksi BLE: dari memindai perangkat yang mengiklankan hingga transfer data dan pemutusan koneksi. CBCentralManager bekerja secara asinkron melalui delegasi CBCentralManagerDelegate, memberitahu aplikasi tentang peristiwa di tumpukan Bluetooth.
Inisialisasi CBCentralManager memulai proses state restoration: manajer memeriksa status Bluetooth pada perangkat dan memulihkan koneksi sebelumnya jika aplikasi ditutup. Proses inisialisasi dapat memakan waktu 50 hingga 500 ms tergantung pada status Bluetooth. Aplikasi harus menunggu panggilan centralManagerDidUpdateState sebelum memulai operasi BLE apa pun.
Arsitektur Core Bluetooth dibangun di atas pola Delegation: CBCentralManager mendelegasikan penanganan peristiwa (penemuan perangkat, koneksi, kesalahan) ke protokol CBCentralManagerDelegate. Untuk bekerja dengan Peripheral tertentu, digunakan protokol CBPeripheralDelegate yang memberitahu tentang penemuan layanan, karakteristik, dan penerimaan data. Model asinkron ini memastikan UI tidak terblokir.
CBCentralManager melewati beberapa status yang menentukan apakah tumpukan BLE tersedia untuk digunakan. Status ditransmisikan melalui delegasi: centralManagerDidUpdateState(_:). Pengembang harus menangani semua status — tidak hanya poweredOn, tetapi juga kasus ketika Bluetooth dimatikan atau tidak tersedia.
| Status | Arti | Tindakan pengembang |
|---|---|---|
| .poweredOn | Bluetooth menyala dan siap | Mulai pemindaian |
| .poweredOff | Bluetooth dimatikan | Tampilkan peringatan ke pengguna |
| .unauthorized | Tidak ada izin | Minta izin di Pengaturan |
| .unsupported | Perangkat tidak mendukung BLE | Sembunyikan fungsi BLE |
| .unknown | Status tidak ditentukan | Tunggu pembaruan berikutnya |
| .resetting | Bluetooth sedang diatur ulang | Tunggu pemulihan |
Unauthorized state menjadi semakin umum sejak iOS 13+. Mulai dari versi ini, aplikasi harus memiliki izin NSBluetoothAlwaysUsageDescription di Info.plist. Tanpa itu, manajer pusat beralih ke status .unauthorized dan pemindaian tidak mungkin dilakukan. Pengguna dapat mengubah izin kapan saja di Pengaturan > Privasi > Bluetooth.
scanForPeripherals(withServices:options:) — metode utama untuk memulai pemindaian. Parameter withServices menerima array UUID layanan untuk penyaringan: jika nil dikirimkan, semua perangkat akan ditemukan, yang secara signifikan meningkatkan konsumsi energi. Disarankan untuk selalu memfilter berdasarkan UUID layanan yang dibutuhkan aplikasi. Opsi pemindaian termasuk CBCentralManagerScanOptionAllowDuplicatesKey (pemberitahuan berulang tentang perangkat yang sama).
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") // Layanan Baterai
centralManager.scanForPeripherals(
withServices: [serviceUUID],
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
Saat perangkat ditemukan, centralManager(_:didDiscover:advertisementData:rssi:) dipanggil. Parameter advertisementData berisi kamus lengkap data paket iklan, termasuk nama perangkat (CBAdvertisementDataLocalNameKey), UUID layanan (CBAdvertisementDataServiceUUIDsKey) dan data pabrikan (CBAdvertisementDataManufacturerDataKey). RSSI — tingkat sinyal dalam dBm, tersedia pada saat penemuan.
connect(_:options:) — metode untuk menjalin koneksi BLE dengan Peripheral yang ditemukan. Setelah panggilan connect, iOS mencoba terhubung ke perangkat. Koneksi berhasil dikonfirmasi oleh panggilan centralManager(_:didConnect:), kesalahan oleh centralManager(_:didFailToConnect:error:). Opsi koneksi termasuk CBConnectPeripheralOptionNotifyOnConnectionKey, CBConnectPeripheralOptionNotifyOnDisconnectionKey dan CBConnectPeripheralOptionNotifyOnNotificationKey untuk pemberitahuan latar belakang.
// Hubungkan ke perangkat BLE
func connectToPeripheral(
_ peripheral: CBPeripheral
) {
centralManager.connect(peripheral, options: nil)
// Atur delegasi untuk Peripheral
peripheral.delegate = self
}
// Delegasi: koneksi berhasil
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
print("Terhubung ke " +
"\(peripheral.name ?? "unknown")")
// Mulai penemuan layanan
peripheral.discoverServices(nil)
}
// Delegasi: kesalahan koneksi
func centralManager(
_ central: CBCentralManager,
didFailToConnect peripheral: CBPeripheral,
error: Error?
) {
print("Connection failed:
\(error?.localizedDescription ?? "")")
}
Batas waktu koneksi di iOS adalah 30 detik. Jika perangkat tidak merespons permintaan koneksi dalam waktu ini, didFailToConnect dipanggil. Faktor yang mempengaruhi batas waktu: jarak ke perangkat, interferensi, apakah perangkat saat ini mengiklankan. Sebelum terhubung, pastikan perangkat dalam mode connectable advertising (ADV_IND, bukan ADV_NONCONN_IND).
Setelah terhubung perlu ditemukan layanan (discoverServices) dan karakteristik (discoverCharacteristics) dari Peripheral. Ini adalah langkah wajib sebelum membaca atau menulis data. Prosesnya asinkron: discoverServices mengembalikan hasil melalui peripheral(_:didDiscoverServices:), dan discoverCharacteristics melalui peripheral(_:didDiscoverCharacteristicsFor:error:).
Disarankan untuk mengirimkan array UUID yang diminati ke discoverServices, bukan nil. Penyaringan mempercepat penemuan dan menghemat energi. Jika layanan tidak ditemukan, iOS akan melaporkan array kosong. Setelah karakteristik ditemukan, nilainya dapat dibaca (readValue), berlangganan pemberitahuan (setNotifyValue) atau menulis data (writeValue).
Nuansa penting: MTU dinegosiasikan secara otomatis setelah koneksi. Untuk mendapatkan MTU saat ini, gunakan peripheral.maximumWriteValueLength(for: .withResponse) atau .withoutResponse. Di iOS, MTU maksimum adalah 512 byte untuk perangkat BLE 5.0. Jika perlu mentransfer data yang lebih besar dari MTU, terapkan fragmentasi di tingkat aplikasi.
Pemindaian latar belakang perangkat BLE di iOS memerlukan konfigurasi khusus. Core Bluetooth mendukung eksekusi latar belakang, tetapi dengan batasan yang signifikan. Untuk bekerja di latar belakang, diperlukan: aktifkan bluetooth-central di Background Modes di Capabilities proyek, inisialisasi CBCentralManager dengan opsi CBCentralManagerOptionRestoreIdentifierKey untuk state restoration, dan tangani peristiwa manajer pusat saat beralih ke latar belakang.
Batasan BLE latar belakang di iOS: scanForPeripherals tanpa penyaringan UUID tidak berfungsi di latar belakang. Aplikasi harus menentukan UUID layanan tertentu untuk pemindaian. iOS dapat menunda pengiriman peristiwa BLE untuk waktu yang tidak ditentukan. Core Bluetooth secara otomatis melanjutkan pemindaian saat menemukan perangkat yang cocok, bahkan jika aplikasi berada di latar belakang. Batas waktu pemindaian latar belakang: iOS dapat menghentikan pemindaian setelah 10–30 menit untuk menghemat energi.
State Restoration — mekanisme Core Bluetooth yang memungkinkan pemulihan koneksi BLE setelah restart aplikasi atau reboot iOS. Untuk penggunaan: tentukan CBCentralManagerOptionRestoreIdentifierKey saat inisialisasi, implementasikan centralManager(_:willRestoreState:) di delegasi dan pulihkan daftar Peripheral yang terhubung dari kamus yang dikirimkan. State Restoration adalah fungsi penting untuk aplikasi BLE yang bekerja di latar belakang, seperti pelacak kebugaran atau perangkat medis.
CBCentralManager menghasilkan kesalahan dalam beberapa skenario: koneksi gagal (didFailToConnect), koneksi terputus (didDisconnectPeripheral), karakteristik tidak tersedia untuk baca/tulis (didWriteValue error). Semua kesalahan Core Bluetooth dikembalikan melalui objek Error dengan domain CBErrorDomain. Kode yang paling umum: CBErrorConnectionTimeout (0x04), CBErrorPeripheralDisconnected (0x07), CBErrorOperationNotSupported (0x0A).
Strategi pemulihan koneksi: saat menerima didDisconnectPeripheral, periksa kode kesalahan. Jika kesalahan adalah CBErrorConnectionTimeout atau CBErrorPeripheralDisconnected — jadwalkan koneksi ulang otomatis setelah 1–5 detik. Jika kesalahan adalah CBErrorOperationNotSupported — catat dan jangan coba mengulangi operasi. Untuk koneksi kritis (perangkat medis) gunakan exponential backoff dengan interval maksimum 60 detik.
// Tangani pemutusan dengan koneksi ulang otomatis
func centralManager(
_ central: CBCentralManager,
didDisconnectPeripheral peripheral: CBPeripheral,
error: Error?
) {
guard let error = error else {
return // Pemutusan yang diharapkan
}
print("Disconnected: \(error.localizedDescription)")
// Koneksi ulang otomatis
if shouldAutoReconnect {
DispatchQueue.main.asyncAfter(
deadline: .now() + reconnectDelay
) {
central.connect(peripheral)
}
}
}
Saat mengembangkan aplikasi BLE yang andal di iOS, pertimbangkan: Core Bluetooth tidak menjamin pengiriman semua paket saat sinyal lemah. Untuk transfer yang andal, gunakan writeType .withResponse (penulisan terkonfirmasi) dan berlangganan pemberitahuan (setNotifyValue) untuk menerima data dari Peripheral. Simpan log kesalahan untuk mendiagnosis masalah koneksi di produksi.
Pertanyaan Umum
Periksa status manajer melalui centralManagerDidUpdateState. Pastikan izin NSBluetoothAlwaysUsageDescription ada di Info.plist, Bluetooth aktif di perangkat, dan perangkat periferal mengiklankan dengan tipe yang benar (connectable advertising, bukan non-connectable).
Pada perangkat dengan BLE 5.0 (iPhone 8 dan lebih baru) — hingga 7 koneksi simultan. Pada perangkat yang lebih lama — hingga 3–5. Jumlah perangkat yang dipindai tidak terbatas, tetapi koneksi aktif memiliki batas ketat yang ditetapkan oleh Bluetooth Controller.
Disarankan memindai dengan filter UUID dan mematikan pemindaian saat perangkat ditemukan. Pemindaian terus-menerus menghabiskan baterai: 1 jam pemindaian terus-menerus mengkonsumsi ~10–15% baterai iPhone. Gunakan timer dan kondisi untuk menghentikan pemindaian.
CBCentralManager — untuk memindai dan terhubung ke perangkat BLE eksternal (peran Central). CBPeripheralManager — agar perangkat iOS Anda sendiri bertindak sebagai periferal BLE (mengiklankan layanan). Satu instance hanya dapat berada dalam satu peran.
Implementasikan centralManager(_:didDisconnectPeripheral:error:). Jika kesalahan tidak nil — jadwalkan koneksi ulang otomatis dengan exponential backoff (1 detik → 2 → 4 → 8 → maks 60). Jika kesalahan nil — perangkat terputus secara normal (misalnya, pengguna menekan tombol pada perangkat).
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga