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 প্রোটোকল ব্যবহার করা হয়, যা আবিষ্কৃত সার্ভিস, ক্যারেক্টারিস্টিক এবং প্রাপ্ত ডেটা সম্পর্কে জানায়। এই অ্যাসিঙ্ক্রোনাস মডেল একটি নন-ব্লকিং UI নিশ্চিত করে।
CBCentralManager বেশ কয়েকটি অবস্থার মধ্য দিয়ে যায় যা নির্ধারণ করে যে BLE স্ট্যাক উপলব্ধ কিনা। অবস্থাটি ডেলিগেটের মাধ্যমে প্রেরণ করা হয়: centralManagerDidUpdateState(_:)। ডেভেলপারকে সব অবস্থা পরিচালনা করতে হবে — শুধু poweredOn নয়, বরং ব্লুটুথ বন্ধ বা অনুপলব্ধ হলে সেসব ক্ষেত্রেও।
| অবস্থা | মান | ডেভেলপারের কার্যক্রম |
|---|---|---|
| .poweredOn | ব্লুটুথ চালু এবং প্রস্তুত | স্ক্যানিং শুরু করুন |
| .poweredOff | ব্লুটুথ বন্ধ | ব্যবহারকারীকে সতর্কতা দেখান |
| .unauthorized | কোনো অনুমতি নেই | সেটিংসে অনুমতি অনুরোধ করুন |
| .unsupported | ডিভাইস BLE সমর্থন করে না | BLE বৈশিষ্ট্য লুকান |
| .unknown | অবস্থা নির্ধারিত নয় | পরবর্তী আপডেটের জন্য অপেক্ষা করুন |
| .resetting | ব্লুটুথ পুনরায় চালু হচ্ছে | পুনরুদ্ধারের জন্য অপেক্ষা করুন |
অননুমোদিত অবস্থা iOS 13+ থেকে আরও সাধারণ হয়ে উঠছে। এই সংস্করণ থেকে শুরু করে, অ্যাপের Info.plist-এ NSBluetoothAlwaysUsageDescription অনুমতি থাকতে হবে। এটি ছাড়া, কেন্দ্রীয় ম্যানেজার .unauthorized অবস্থায় চলে যায় এবং স্ক্যানিং অসম্ভব। ব্যবহারকারী যেকোনো সময় সেটিংস > প্রাইভেসি > ব্লুটুথ-এ অনুমতি পরিবর্তন করতে পারেন।
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 অনুমতি আছে, ডিভাইসে ব্লুটুথ সক্রিয় আছে এবং পেরিফেরাল ডিভাইস সঠিক ধরনে (কানেক্টেবল বিজ্ঞাপন, নন-কানেক্টেবল নয়) বিজ্ঞাপন দিচ্ছে।
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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন