CBCentralManager iOS میں Core Bluetooth فریم ورک کی مرکزی کلاس ہے جو BLE پیریفرل آلات کی اسکیننگ، کنکشن اور تعامل کو منظم کرتی ہے۔ Core Bluetooth (iOS 5+، 2011) GATT سطح پر BLE اسٹیک پر ایک اعلیٰ سطح کا تجرید فراہم کرتا ہے، جو Link Layer اور HCI کی تفصیلات کو ڈویلپر سے چھپاتا ہے۔ CBCentralManager Central کردار کو نافذ کرتا ہے: یہ scanForPeripherals کے ذریعے ہوا کو اسکین کرتا ہے، connect کے ذریعے کنکشن شروع کرتا ہے، discoverServices کے ذریعے سروسز دریافت کرتا ہے اور ڈیٹا کی منتقلی کا انتظام کرتا ہے۔ Apple Developer Documentation (2024) کے مطابق، CBCentralManager BLE 5.0 والے آلات پر BLE آلات سے 7 بیک وقت کنکشنز تک سپورٹ کرتا ہے۔
اہم نکات
CBCentralManager iOS پر BLE آرکیٹیکچر میں Central کردار کو نافذ کرنے کے لیے اہم Core Bluetooth کلاس ہے۔ یہ BLE کنکشن کے پورے لائف سائیکل کا انتظام کرتا ہے: اشتہار دینے والے آلات کی اسکیننگ سے لے کر ڈیٹا کی منتقلی اور منقطع ہونے تک۔ CBCentralManager CBCentralManagerDelegate کے ذریعے غیر متوازن طور پر کام کرتا ہے، بلوٹوتھ اسٹیک میں واقعات کے بارے میں ایپ کو مطلع کرتا ہے۔
CBCentralManager کو شروع کرنا state restoration کا عمل شروع کرتا ہے: مینیجر ڈیوائس پر بلوٹوتھ کی حالت چیک کرتا ہے اور اگر ایپ بند تھی تو پچھلے کنکشن بحال کرتا ہے۔ ابتدائی عمل بلوٹوتھ کی حالت کے لحاظ سے 50 سے 500 ms تک لگ سکتا ہے۔ کسی بھی BLE آپریشن کو شروع کرنے سے پہلے ایپ کو centralManagerDidUpdateState کال کا انتظار کرنا چاہیے۔
Core Bluetooth آرکیٹیکچر Delegation پیٹرن پر بنایا گیا ہے: CBCentralManager واقعہ کی پروسیسنگ (آلات کی دریافت، کنکشن، خرابیاں) CBCentralManagerDelegate پروٹوکول کو سونپتا ہے۔ کسی مخصوص پیریفرل کے ساتھ کام کرنے کے لیے، CBPeripheralDelegate پروٹوکول استعمال کیا جاتا ہے، جو دریافت شدہ سروسز، خصوصیات اور موصولہ ڈیٹا کے بارے میں مطلع کرتا ہے۔ یہ غیر متوازن ماڈل ایک نان بلاک کرنے والا یوزر انٹرفیس یقینی بناتا ہے۔
CBCentralManager کئی حالتوں سے گزرتا ہے جو اس بات کا تعین کرتی ہیں کہ BLE اسٹیک دستیاب ہے یا نہیں۔ حالت ڈیلیگیٹ کے ذریعے منتقل کی جاتی ہے: centralManagerDidUpdateState(_:)۔ ڈویلپر کو تمام حالتوں کو سنبھالنا چاہیے — نہ صرف poweredOn، بلکہ وہ معاملات بھی جب بلوٹوتھ بند یا ناقابل دستیاب ہو۔
| حالت | قدر | ڈویلپر کارروائی |
|---|---|---|
| .poweredOn | بلوٹوتھ آن اور تیار ہے | اسکیننگ شروع کریں |
| .poweredOff | بلوٹوتھ بند ہے | صارف کو الرٹ دکھائیں |
| .unauthorized | کوئی اجازت نہیں | ترتیبات میں اجازت کی درخواست کریں |
| .unsupported | ڈیوائس BLE کو سپورٹ نہیں کرتا | BLE خصوصیات چھپائیں |
| .unknown | حالت متعین نہیں | اگلی اپڈیٹ کا انتظار کریں |
| .resetting | بلوٹوتھ دوبارہ شروع ہو رہا ہے | بحالی کا انتظار کریں |
غیر مجاز حالت iOS 13+ سے زیادہ عام ہوتی جا رہی ہے۔ اس ورژن سے شروع کرتے ہوئے، ایپ میں Info.plist میں NSBluetoothAlwaysUsageDescription اجازت ہونی چاہیے۔ اس کے بغیر، مرکزی مینیجر .unauthorized حالت میں چلا جاتا ہے اور اسکیننگ ناممکن ہے۔ صارف ترتیبات > پرائیویسی > بلوٹوتھ میں کسی بھی وقت اجازت تبدیل کر سکتا ہے۔
scanForPeripherals(withServices:options:) اسکیننگ شروع کرنے کا اہم طریقہ ہے۔ withServices پیرامیٹر فلٹرنگ کے لیے سروس UUIDs کی ایک صف قبول کرتا ہے: اگر nil بھیجا جاتا ہے، تو تمام آلات دریافت ہو جائیں گے، جس سے بجلی کی کھپت میں نمایاں اضافہ ہوتا ہے۔ ہمیشہ ان سروس UUIDs کے ذریعے فلٹر کرنے کی سفارش کی جاتی ہے جن کی ایپ کو ضرورت ہے۔ اسکیننگ کے اختیارات میں CBCentralManagerScanOptionAllowDuplicatesKey (ایک ہی ڈیوائس کے بارے میں بار بار اطلاعات) شامل ہے۔
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") // بیٹری سروس
centralManager.scanForPeripherals(
withServices: [serviceUUID],
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
جب کوئی ڈیوائس دریافت ہوتی ہے، تو centralManager(_:didDiscover:advertisementData:rssi:) کال کیا جاتا ہے۔ advertisementData پیرامیٹر میں اشتہاری پیکٹ ڈیٹا کی مکمل لغت ہوتی ہے، جس میں ڈیوائس کا نام (CBAdvertisementDataLocalNameKey)، سروس UUIDs (CBAdvertisementDataServiceUUIDsKey) اور کارخانہ دار کا ڈیٹا (CBAdvertisementDataManufacturerDataKey) شامل ہے۔ RSSI دریافت کے وقت dBm میں سگنل کی سطح ہے۔
connect(_:options:) دریافت شدہ پیریفرل کے ساتھ BLE کنکشن قائم کرنے کا طریقہ ہے۔ connect کال کرنے کے بعد، iOS ڈیوائس سے جڑنے کی کوشش کرتا ہے۔ کامیاب کنکشن کی تصدیق centralManager(_:didConnect:) کے ذریعے کی جاتی ہے، خرابی — centralManager(_:didFailToConnect:error:) کے ذریعے۔ کنکشن کے اختیارات میں بیک گراؤنڈ اطلاعات کے لیے CBConnectPeripheralOptionNotifyOnConnectionKey، CBConnectPeripheralOptionNotifyOnDisconnectionKey اور CBConnectPeripheralOptionNotifyOnNotificationKey شامل ہیں۔
// BLE ڈیوائس سے کنیکٹ کریں
func connectToPeripheral(
_ peripheral: CBPeripheral
) {
centralManager.connect(peripheral, options: nil)
// پیریفرل کے لیے ڈیلیگیٹ سیٹ کریں
peripheral.delegate = self
}
// ڈیلیگیٹ: کامیاب کنکشن
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
print("سے منسلک: " +
"\(peripheral.name ?? "unknown")")
// سروس کی دریافت شروع کریں
peripheral.discoverServices(nil)
}
// ڈیلیگیٹ: کنکشن خرابی
func centralManager(
_ central: CBCentralManager,
didFailToConnect peripheral: CBPeripheral,
error: Error?
) {
print("Connection failed:
\(error?.localizedDescription ?? "")")
}
iOS پر کنکشن ٹائم آؤٹ 30 سیکنڈ ہے۔ اگر ڈیوائس نے اس وقت کے اندر کنکشن کی درخواست کا جواب نہیں دیا، تو didFailToConnect کال کیا جاتا ہے۔ ٹائم آؤٹ متاثر ہوتا ہے: ڈیوائس سے فاصلہ، مداخلت، اور ڈیوائس فی الحال اشتہار دے رہی ہے یا نہیں۔ کنیکٹ کرنے سے پہلے، یقینی بنائیں کہ ڈیوائس کنیکٹ ایبل اشتہاری موڈ (ADV_IND، ADV_NONCONN_IND نہیں) میں ہے۔
کنکشن کے بعد، آپ کو پیریفرل کی سروسز (discoverServices) اور خصوصیات (discoverCharacteristics) دریافت کرنی ہوں گی۔ ڈیٹا پڑھنے یا لکھنے سے پہلے یہ ایک لازمی مرحلہ ہے۔ عمل غیر متوازن ہے: discoverServices peripheral(_:didDiscoverServices:) کے ذریعے نتائج لوٹاتا ہے، اور discoverCharacteristics — peripheral(_:didDiscoverCharacteristicsFor:error:) کے ذریعے۔
discoverServices میں nil کے بجائے متعلقہ UUIDs کی ایک صف بھیجنے کی سفارش کی جاتی ہے۔ فلٹرنگ دریافت کو تیز کرتی ہے اور توانائی بچاتی ہے۔ اگر کوئی سروس نہیں ملتی ہے، تو iOS ایک خالی صف کی اطلاع دے گا۔ خصوصیات دریافت کرنے کے بعد، آپ ان کی قدریں پڑھ سکتے ہیں (readValue)، اطلاعات کو سبسکرائب کر سکتے ہیں (setNotifyValue) یا ڈیٹا لکھ سکتے ہیں (writeValue)۔
ایک اہم نکتہ: MTU کنکشن کے بعد خود بخود طے پاتا ہے۔ موجودہ MTU حاصل کرنے کے لیے، peripheral.maximumWriteValueLength(for: .withResponse) یا .withoutResponse استعمال کریں۔ iOS پر، BLE 5.0 آلات کے لیے زیادہ سے زیادہ MTU 512 بائٹس ہے۔ اگر آپ کو MTU سے بڑا ڈیٹا منتقل کرنے کی ضرورت ہے، تو ایپلیکیشن کی سطح پر فریگمنٹیشن نافذ کریں۔
iOS پر BLE آلات کی بیک گراؤنڈ اسکیننگ کے لیے خصوصی ترتیب کی ضرورت ہے۔ Core Bluetooth بیک گراؤنڈ ایگزیکیوشن کو سپورٹ کرتا ہے، لیکن اہم حدود کے ساتھ۔ بیک گراؤنڈ میں کام کرنے کے لیے، آپ کو ضرورت ہے: پروجیکٹ کی قابلیتوں میں Background Modes میں bluetooth-central کو فعال کریں، state restoration کے لیے CBCentralManagerOptionRestoreIdentifierKey آپشن کے ساتھ CBCentralManager شروع کریں اور بیک گراؤنڈ میں جانے پر مرکزی مینیجر کے واقعات کو ہینڈل کریں۔
iOS پر بیک گراؤنڈ BLE حدود: UUID فلٹرنگ کے بغیر scanForPeripherals بیک گراؤنڈ میں کام نہیں کرتا۔ ایپ کو اسکیننگ کے لیے مخصوص سروس UUIDs بتانے چاہئیں۔ iOS BLE واقعات کی ترسیل میں غیر معینہ مدت تک تاخیر کر سکتا ہے۔ Core Bluetooth خود بخود اسکیننگ دوبارہ شروع کرتا ہے جب کوئی مماثل ڈیوائس دریافت ہوتی ہے، چاہے ایپ بیک گراؤنڈ میں ہو۔ بیک گراؤنڈ اسکیننگ کا ٹائم آؤٹ: iOS توانائی بچانے کے لیے 10-30 منٹ کے بعد اسکیننگ روک سکتا ہے۔
State Restoration ایک Core Bluetooth میکانزم ہے جو ایپ کے دوبارہ شروع ہونے یا iOS ریبوٹ کے بعد BLE کنکشن بحال کرنے کی اجازت دیتا ہے۔ اسے استعمال کرنے کے لیے: ابتدا کے دوران CBCentralManagerOptionRestoreIdentifierKey بتائیں، ڈیلیگیٹ میں centralManager(_:willRestoreState:) نافذ کریں، اور منتقل کردہ لغت سے منسلک پیریفرلز کی فہرست بحال کریں۔ State Restoration بیک گراؤنڈ میں کام کرنے والی BLE ایپس کے لیے اہم فعالیت ہے، جیسے فٹنس ٹریکرز یا طبی آلات۔
CBCentralManager کئی منظرناموں میں خرابیاں پیدا کرتا ہے: کنکشن ناکام (didFailToConnect)، کنکشن منقطع (didDisconnectPeripheral)، خصوصیت پڑھنے/لکھنے کے لیے دستیاب نہیں (didWriteValue خرابی)۔ تمام Core Bluetooth خرابیاں CBErrorDomain ڈومین کے ساتھ Error آبجیکٹ کے ذریعے لوٹائی جاتی ہیں۔ سب سے عام کوڈز: CBErrorConnectionTimeout (0x04)، CBErrorPeripheralDisconnected (0x07)، CBErrorOperationNotSupported (0x0A)۔
کنکشن بحالی کی حکمت عملی: didDisconnectPeripheral موصول ہونے پر، خرابی کا کوڈ چیک کریں۔ اگر خرابی CBErrorConnectionTimeout یا CBErrorPeripheralDisconnected ہے — 1-5 سیکنڈ میں خودکار دوبارہ کنکشن طے کریں۔ اگر خرابی CBErrorOperationNotSupported ہے — اسے لاگ کریں اور آپریشن دوبارہ نہ آزمائیں۔ اہم کنکشنز (طبی آلات) کے لیے، زیادہ سے زیادہ 60 سیکنڈ کے وقفے کے ساتھ ایکسپونینشل بیک آف استعمال کریں۔
// خودکار دوبارہ کنکشن کے ساتھ منقطع ہونے کو ہینڈل کریں
func centralManager(
_ central: CBCentralManager,
didDisconnectPeripheral peripheral: CBPeripheral,
error: Error?
) {
guard let error = error else {
return // متوقع منقطع
}
print("Disconnected: \(error.localizedDescription)")
// خودکار دوبارہ کنکشن
if shouldAutoReconnect {
DispatchQueue.main.asyncAfter(
deadline: .now() + reconnectDelay
) {
central.connect(peripheral)
}
}
}
iOS پر ایک مضبوط BLE ایپ تیار کرتے وقت، ذہن میں رکھیں: Core Bluetooth کمزور سگنل پر تمام پیکٹوں کی ترسیل کی ضمانت نہیں دیتا۔ قابل اعتماد ترسیل کے لیے، writeType .withResponse (تصدیق شدہ تحریر) استعمال کریں اور پیریفرل سے ڈیٹا حاصل کرنے کے لیے اطلاعات (setNotifyValue) کو سبسکرائب کریں۔ پروڈکشن میں کنکشن کے مسائل کی تشخیص کے لیے خرابی کا لاگ رکھیں۔
اکثر پوچھے گئے سوالات
centralManagerDidUpdateState کے ذریعے مینیجر کی حالت چیک کریں۔ یقینی بنائیں کہ Info.plist میں NSBluetoothAlwaysUsageDescription اجازت موجود ہے، ڈیوائس پر بلوٹوتھ فعال ہے اور پیریفرل ڈیوائس صحیح قسم (کنیکٹ ایبل اشتہار، نان کنیکٹ ایبل نہیں) کے ساتھ اشتہار دے رہی ہے۔
BLE 5.0 والے آلات (iPhone 8 اور نئے) پر — 7 بیک وقت کنکشنز تک۔ پرانے آلات پر — 3-5 تک۔ اسکین کیے گئے آلات کی تعداد لامحدود ہے، لیکن فعال کنکشنز کی Bluetooth کنٹرولر کے ذریعے ایک سخت حد مقرر ہے۔
UUID فلٹرنگ کے ساتھ اسکین کرنے اور ڈیوائس ملنے پر اسکیننگ بند کرنے کی سفارش کی جاتی ہے۔ مسلسل اسکیننگ بیٹری ختم کرتی ہے: 1 گھنٹہ مسلسل اسکیننگ iPhone کی ~10-15% چارج استعمال کرتی ہے۔ اسکیننگ بند کرنے کے لیے ٹائمر اور شرائط استعمال کریں۔
CBCentralManager بیرونی BLE آلات (Central کردار) کو اسکین اور کنیکٹ کرنے کے لیے ہے۔ CBPeripheralManager آپ کے iOS ڈیوائس کو BLE پیریفرل کے طور پر کام کرنے (سروسز کا اشتہار دینے) کے لیے ہے۔ ایک مثال صرف ایک کردار میں ہو سکتی ہے۔
centralManager(_:didDisconnectPeripheral:error:) نافذ کریں۔ اگر خرابی nil نہیں ہے — ایکسپونینشل بیک آف (1 سیکنڈ → 2 سیکنڈ → 4 سیکنڈ → 8 سیکنڈ → زیادہ سے زیادہ 60 سیکنڈ) کے ساتھ خودکار دوبارہ کنکشن طے کریں۔ اگر خرابی nil ہے — ڈیوائس عام طور پر منقطع ہوئی (مثال کے طور پر، صارف نے ڈیوائس پر بٹن دبایا)۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں