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 के माध्यम से एसिंक्रोनस रूप से काम करता है, जो Bluetooth स्टैक में घटनाओं के बारे में ऐप को सूचित करता है।
CBCentralManager को इनिशियलाइज़ करना state restoration प्रक्रिया शुरू करता है: प्रबंधक डिवाइस पर Bluetooth स्थिति की जाँच करता है और यदि ऐप बंद किया गया था तो पिछले कनेक्शन पुनर्स्थापित करता है। इनिशियलाइज़ेशन प्रक्रिया Bluetooth स्थिति के आधार पर 50 से 500 ms तक ले सकती है। किसी भी BLE ऑपरेशन को शुरू करने से पहले ऐप को centralManagerDidUpdateState कॉल की प्रतीक्षा करनी चाहिए।
Core Bluetooth आर्किटेक्चर Delegation पैटर्न पर बनाया गया है: CBCentralManager ईवेंट हैंडलिंग (डिवाइस खोज, कनेक्शन, त्रुटियाँ) को CBCentralManagerDelegate प्रोटोकॉल को सौंपता है। किसी विशिष्ट परिधीय के साथ काम करने के लिए, CBPeripheralDelegate प्रोटोकॉल का उपयोग किया जाता है, जो खोजी गई सेवाओं, विशेषताओं और प्राप्त डेटा के बारे में सूचित करता है। यह एसिंक्रोनस मॉडल एक नॉन-ब्लॉकिंग UI सुनिश्चित करता है।
CBCentralManager कई स्थितियों से गुज़रता है जो यह निर्धारित करती हैं कि BLE स्टैक उपलब्ध है या नहीं। स्थिति डेलीगेट के माध्यम से भेजी जाती है: centralManagerDidUpdateState(_:). डेवलपर को सभी स्थितियों को संभालना चाहिए — न केवल poweredOn, बल्कि वे मामले भी जब Bluetooth बंद या अनुपलब्ध हो।
| स्थिति | मान | डेवलपर कार्रवाई |
|---|---|---|
| .poweredOn | Bluetooth चालू और तैयार है | स्कैनिंग शुरू करें |
| .poweredOff | Bluetooth बंद है | उपयोगकर्ता को अलर्ट दिखाएँ |
| .unauthorized | कोई अनुमति नहीं | सेटिंग्स में अनुमति का अनुरोध करें |
| .unsupported | डिवाइस BLE का समर्थन नहीं करता | BLE सुविधाएँ छिपाएँ |
| .unknown | स्थिति परिभाषित नहीं है | अगले अपडेट की प्रतीक्षा करें |
| .resetting | Bluetooth पुनः प्रारंभ हो रहा है | पुनर्प्राप्ति की प्रतीक्षा करें |
अनधिकृत स्थिति iOS 13+ से अधिक सामान्य होती जा रही है। इस संस्करण से शुरू करके, ऐप में Info.plist में NSBluetoothAlwaysUsageDescription अनुमति होनी चाहिए। इसके बिना, केंद्रीय प्रबंधक .unauthorized स्थिति में चला जाता है और स्कैनिंग असंभव है। उपयोगकर्ता किसी भी समय सेटिंग्स > प्राइवेसी > Bluetooth में अनुमति बदल सकता है।
scanForPeripherals(withServices:options:) स्कैनिंग शुरू करने की मुख्य विधि है। withServices पैरामीटर फ़िल्टरिंग के लिए सेवा UUID की एक सरणी स्वीकार करता है: यदि nil पास किया जाता है, तो सभी डिवाइस खोजे जाएँगे, जिससे बिजली की खपत काफी बढ़ जाती है। हमेशा ऐप के लिए आवश्यक सेवा UUID द्वारा फ़िल्टर करने की अनुशंसा की जाती है। स्कैनिंग विकल्पों में 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), सेवा UUID (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 के बजाय प्रासंगिक UUID की एक सरणी पास करने की अनुशंसा की जाती है। फ़िल्टरिंग खोज को गति देती है और ऊर्जा बचाती है। यदि कोई सेवा नहीं मिलती है, तो 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 बैकग्राउंड में काम नहीं करता है। ऐप को स्कैनिंग के लिए विशिष्ट सेवा UUID निर्दिष्ट करनी चाहिए। 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 अनुमति है, डिवाइस पर Bluetooth सक्षम है और परिधीय डिवाइस सही प्रकार (कनेक्टेबल विज्ञापन, नॉन-कनेक्टेबल नहीं) के साथ विज्ञापन कर रहा है।
BLE 5.0 वाले डिवाइस (iPhone 8 और नए) पर — 7 समवर्ती कनेक्शन तक। पुराने डिवाइस पर — 3–5 तक। स्कैन किए गए डिवाइसों की संख्या असीमित है, लेकिन सक्रिय कनेक्शनों की Bluetooth Controller द्वारा निर्धारित सख्त सीमा है।
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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें