iOS এ CBCentralManager — এটি কী, BLE ব্যবস্থাপনা এবং Core Bluetooth

লেখক: IT Sectr প্রকাশিত: 2026-07-16 পড়ার সময়: 11 মিনিট

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 হলো Central ভূমিকায় BLE স্ক্যানিং, সংযোগ এবং ডেটা ট্রান্সফার পরিচালনার জন্য iOS ক্লাস।
  • স্ক্যানিং scanForPeripherals এর মাধ্যমে সার্ভিস UUID ফিল্টারিং সহ শুরু করা হয় যা শক্তি সাশ্রয় করে।
  • সংযোগ connect(peripheral:options:) এর মাধ্যমে ডেলিগেটের মাধ্যমে অবস্থা ট্র্যাকিং সহ সম্পাদিত হয়।
  • iOS BLE 5.0 সমর্থিত ডিভাইসে 7টি পর্যন্ত সমবর্তী BLE সংযোগ সমর্থন করে।
  • ব্যাকগ্রাউন্ড স্ক্যানিংয়ের জন্য Background Modes-এ bluetooth-central সক্ষম করা এবং CBCentralManagerScanOptionAllowDuplicatesKey ব্যবহার করা প্রয়োজন।

CBCentralManager কী?

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-এর অবস্থা

CBCentralManager বেশ কয়েকটি অবস্থার মধ্য দিয়ে যায় যা নির্ধারণ করে যে BLE স্ট্যাক উপলব্ধ কিনা। অবস্থাটি ডেলিগেটের মাধ্যমে প্রেরণ করা হয়: centralManagerDidUpdateState(_:)। ডেভেলপারকে সব অবস্থা পরিচালনা করতে হবে — শুধু poweredOn নয়, বরং ব্লুটুথ বন্ধ বা অনুপলব্ধ হলে সেসব ক্ষেত্রেও।

অবস্থামানডেভেলপারের কার্যক্রম
.poweredOnব্লুটুথ চালু এবং প্রস্তুতস্ক্যানিং শুরু করুন
.poweredOffব্লুটুথ বন্ধব্যবহারকারীকে সতর্কতা দেখান
.unauthorizedকোনো অনুমতি নেইসেটিংসে অনুমতি অনুরোধ করুন
.unsupportedডিভাইস BLE সমর্থন করে নাBLE বৈশিষ্ট্য লুকান
.unknownঅবস্থা নির্ধারিত নয়পরবর্তী আপডেটের জন্য অপেক্ষা করুন
.resettingব্লুটুথ পুনরায় চালু হচ্ছেপুনরুদ্ধারের জন্য অপেক্ষা করুন

অননুমোদিত অবস্থা iOS 13+ থেকে আরও সাধারণ হয়ে উঠছে। এই সংস্করণ থেকে শুরু করে, অ্যাপের Info.plist-এ NSBluetoothAlwaysUsageDescription অনুমতি থাকতে হবে। এটি ছাড়া, কেন্দ্রীয় ম্যানেজার .unauthorized অবস্থায় চলে যায় এবং স্ক্যানিং অসম্ভব। ব্যবহারকারী যেকোনো সময় সেটিংস > প্রাইভেসি > ব্লুটুথ-এ অনুমতি পরিবর্তন করতে পারেন।

BLE ডিভাইস স্ক্যানিং

scanForPeripherals(withServices:options:) হলো স্ক্যানিং শুরু করার প্রধান পদ্ধতি। withServices প্যারামিটার ফিল্টারিংয়ের জন্য সার্ভিস UUID-এর একটি অ্যারে গ্রহণ করে: যদি nil পাঠানো হয়, তাহলে সব ডিভাইস আবিষ্কৃত হবে, যা বিদ্যুৎ খরচ উল্লেখযোগ্যভাবে বাড়িয়ে দেয়। অ্যাপের জন্য প্রয়োজনীয় সার্ভিস UUID দ্বারা সর্বদা ফিল্টার করার পরামর্শ দেওয়া হয়। স্ক্যানিং অপশনের মধ্যে CBCentralManagerScanOptionAllowDuplicatesKey (একই ডিভাইস সম্পর্কে পুনরাবৃত্ত বিজ্ঞপ্তি) অন্তর্ভুক্ত।

swift
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 অন্তর্ভুক্ত।

swift
// 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 সীমাবদ্ধতা

ব্যাকগ্রাউন্ড স্ক্যানিং 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 সেকেন্ডের ব্যবধানে এক্সপোনেনশিয়াল ব্যাকঅফ ব্যবহার করুন।

swift
// স্বয়ংক্রিয় পুনঃসংযোগ সহ সংযোগ বিচ্ছিন্ন পরিচালনা
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) সাবস্ক্রাইব করুন। প্রোডাকশনে সংযোগ সমস্যা নির্ণয়ের জন্য ত্রুটি লগ রাখুন।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

CBCentralManager কেন ডিভাইস সনাক্ত করে না?

centralManagerDidUpdateState-এর মাধ্যমে ম্যানেজারের অবস্থা পরীক্ষা করুন। নিশ্চিত করুন যে Info.plist-এ NSBluetoothAlwaysUsageDescription অনুমতি আছে, ডিভাইসে ব্লুটুথ সক্রিয় আছে এবং পেরিফেরাল ডিভাইস সঠিক ধরনে (কানেক্টেবল বিজ্ঞাপন, নন-কানেক্টেবল নয়) বিজ্ঞাপন দিচ্ছে।

একসঙ্গে কতটি BLE ডিভাইস iOS-এর সাথে সংযুক্ত হতে পারে?

BLE 5.0 সমর্থিত ডিভাইসে (iPhone 8 এবং নতুন) — 7টি পর্যন্ত সমবর্তী সংযোগ। পুরোনো ডিভাইসে — 3–5টি পর্যন্ত। স্ক্যান করা ডিভাইসের সংখ্যা সীমাহীন, তবে সক্রিয় সংযোগের Bluetooth Controller দ্বারা নির্ধারিত কঠোর সীমা রয়েছে।

ব্যাটারি শেষ না করে আমি কতবার iOS-এ BLE স্ক্যান করতে পারি?

UUID ফিল্টারিং সহ স্ক্যান করার এবং ডিভাইস পাওয়া গেলে স্ক্যানিং বন্ধ করার পরামর্শ দেওয়া হয়। ক্রমাগত স্ক্যানিং ব্যাটারি শেষ করে: 1 ঘণ্টা নিরবচ্ছিন্ন স্ক্যানিং iPhone-এর ~10–15% চার্জ খরচ করে। স্ক্যানিং বন্ধ করতে টাইমার এবং শর্ত ব্যবহার করুন।

CBCentralManager এবং CBPeripheralManager-এর মধ্যে পার্থক্য কী?

CBCentralManager বাহ্যিক BLE ডিভাইস (Central ভূমিকা) স্ক্যান এবং সংযোগ করার জন্য। CBPeripheralManager আপনার iOS ডিভাইসকে BLE পেরিফেরাল হিসাবে কাজ করতে (সার্ভিস বিজ্ঞাপন) দেওয়ার জন্য। একটি ইনস্ট্যান্স শুধুমাত্র একটি ভূমিকায় থাকতে পারে।

BLE ডিভাইসের সাথে সংযোগ হারানো কীভাবে সামলাবেন?

centralManager(_:didDisconnectPeripheral:error:) বাস্তবায়ন করুন। যদি ত্রুটি nil না হয় — এক্সপোনেনশিয়াল ব্যাকঅফ (1 সে → 2 সে → 4 সে → 8 সে → সর্বোচ্চ 60 সে) সহ স্বয়ংক্রীয় পুনঃসংযোগ নির্ধারণ করুন। যদি ত্রুটি nil হয় — ডিভাইস স্বাভাবিকভাবে সংযোগ বিচ্ছিন্ন হয়েছে (যেমন, ব্যবহারকারী ডিভাইসের বোতাম টিপেছেন)।

সারাংশ

  • CBCentralManager হলো iOS-এ Central ভূমিকায় BLE স্ক্যানিং, সংযোগ এবং ডেটা ট্রান্সফার পরিচালনার জন্য প্রধান Core Bluetooth ক্লাস।
  • স্ক্যানিং scanForPeripherals-এর মাধ্যমে বিদ্যুৎ খরচ কমানোর জন্য ঐচ্ছিক সার্ভিস UUID ফিল্টারিং সহ শুরু করা হয়।
  • সংযোগ connect-এর মাধ্যমে করা হয়, সাফল্য didConnect দ্বারা, ত্রুটি 30 সেকেন্ড টাইমআউট সহ didFailToConnect দ্বারা নিশ্চিত করা হয়।
  • সংযোগের পরে, discoverServices এবং discoverCharacteristics-এর মাধ্যমে সার্ভিস এবং ক্যারেক্টারিস্টিক আবিষ্কার করতে হবে।
  • ব্যাকগ্রাউন্ড স্ক্যানিংয়ের জন্য bluetooth-central Background Mode প্রয়োজন এবং সীমাবদ্ধতা (UUID ফিল্টারিং, সম্ভাব্য বিলম্ব) সহ সমর্থিত।
  • iOS BLE 5.0 সমর্থিত ডিভাইসে 7টি পর্যন্ত সমবর্তী BLE সংযোগ সমর্থন করে, পুনরায় চালুর পরে পুনরুদ্ধারের জন্য state restoration।
  • ত্রুটি ব্যবস্থাপনা এবং এক্সপোনেনশিয়াল ব্যাকঅফ সহ স্বয়ংক্রিয় পুনঃসংযোগ iOS-এ একটি নির্ভরযোগ্য BLE অ্যাপের ভিত্তি।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন