Descriptor হল একটি BLE ক্যারেক্টারিস্টিকের সহায়ক অ্যাট্রিবিউট যা এর মানের জন্য মেটাডেটা বা কনফিগারেশন প্রদান করে। Bluetooth Core Specification 5.4 ডেস্ক্রিপ্টরকে GATT প্রোফাইলের একটি অবিচ্ছেদ্য অংশ হিসেবে সংজ্ঞায়িত করে: এরা পরিমাপের একক, মানের পরিসর, টেক্সট নাম বর্ণনা করে এবং বিজ্ঞপ্তিতে সাবস্ক্রিপশন পরিচালনা করে। সবচেয়ে পরিচিত ডেস্ক্রিপ্টর হল Client Characteristic Configuration Descriptor (CCCD, 0x2902), যা Central-কে ক্যারেক্টারিস্টিক থেকে বিজ্ঞপ্তিতে সাবস্ক্রাইব করার অনুমতি দেয়। Bluetooth SIG-এর মতে, 8টি স্ট্যান্ডার্ড ডেস্ক্রিপ্টর নির্দিষ্ট করা আছে, এবং কাস্টম ডেস্ক্রিপ্টর ডেভেলপার দ্বারা যেকোনো অতিরিক্ত মেটাডেটার জন্য তৈরি করা যেতে পারে।
মূল বিষয়
Descriptor হল GATT প্রোটোকলের একটি অ্যাট্রিবিউট যা Characteristic-এর সাথে সংযুক্ত হয় এবং এর মান বা ব্যবহারের পদ্ধতি সম্পর্কে অতিরিক্ত তথ্য প্রদান করে। GATT পরিভাষায়, ক্যারেক্টারিস্টিক হল ডেটা, এবং ডেস্ক্রিপ্টর হল সেই ডেটার মেটাডেটা।
প্রতিটি Characteristic-এ শূন্য বা আরও বেশি ডেস্ক্রিপ্টর থাকতে পারে। ডেস্ক্রিপ্টর GATT টেবিলে পৃথক অ্যাট্রিবিউট হিসেবে সংজ্ঞায়িত হয় এবং Bluetooth SIG স্পেসে তাদের নিজস্ব 16-বিট UUID থাকে। ডেস্ক্রিপ্টর স্বাধীনভাবে বিদ্যমান থাকতে পারে না — এরা সর্বদা একটি নির্দিষ্ট ক্যারেক্টারিস্টিকের সাথে আবদ্ধ থাকে।
Bluetooth Core Specification 5.4 (2023) অনুসারে, ডেস্ক্রিপ্টর দুটি বিভাগে বিভক্ত: স্ট্যান্ডার্ড (Bluetooth SIG দ্বারা সংজ্ঞায়িত) এবং কাস্টম (ডেভেলপার দ্বারা সংজ্ঞায়িত)। স্ট্যান্ডার্ড ডেস্ক্রিপ্টরের UUID 0x2900–0x2908 রেঞ্জে থাকে এবং কঠোরভাবে সংজ্ঞায়িত কার্য সম্পাদন করে। কাস্টম ডেস্ক্রিপ্টর 128-বিট UUID ব্যবহার করে, কাস্টম সার্ভিস এবং ক্যারেক্টারিস্টিকের মতো।
ডেস্ক্রিপ্টর BLE সংযোগের আচরণ কনফিগার করার জন্য একটি মূল প্রক্রিয়া। CCCD (0x2902) ছাড়া বিজ্ঞপ্তিতে সাবস্ক্রাইব করা অসম্ভব, Presentation Format (0x2904) ছাড়া Central জানবে না কীভাবে ক্যারেক্টারিস্টিকের র বাইট ব্যাখ্যা করতে হবে।
CCCD UUID 0x2902 সহ BLE-তে সবচেয়ে গুরুত্বপূর্ণ এবং ব্যাপকভাবে ব্যবহৃত ডেস্ক্রিপ্টর। এটি ক্যারেক্টারিস্টিক থেকে Notify এবং Indicate-এ Central-এর সাবস্ক্রিপশন পরিচালনা করে। CCCD-তে না লিখলে, ক্যারেক্টারিস্টিক বিজ্ঞপ্তি পাঠাবে না, এমনকি যদি এর Notify প্রপার্টি থাকে।
CCCD হল একটি 16-বিট মান যেখানে সর্বনিম্ন গুরুত্বপূর্ণ বিট (0x0001) Notify সক্ষম করে, এবং দ্বিতীয় বিট (0x0002) Indicate সক্ষম করে। Central CCCD-তে পছন্দসই মান লিখে, এর মাধ্যমে বিজ্ঞপ্তিতে সাবস্ক্রাইব করে। যদি Central 0x0000 লেখে — সাবস্ক্রিপশন বাতিল হয়।
CCCD প্রক্রিয়াটি এইভাবে কাজ করে: যখন Central Notify সমর্থন করে এমন একটি ক্যারেক্টারিস্টিক আবিষ্কার করে, এটি তার CCCD ডেস্ক্রিপ্টর খুঁজে পায় এবং 0x0001 লেখে। এর পরে, প্রতিবার যখন Peripheral ক্যারেক্টারিস্টিক মান আপডেট করে, এটি Handle Value Notification-এর মাধ্যমে স্বয়ংক্রিয়ভাবে সাবস্ক্রাইবড Central-কে পাঠানো হয় (Central-এর অনুরোধ ছাড়া)।
Apple Core Bluetooth Programming Guide অনুসারে, একটি ক্যারেক্টারিস্টিকের জন্য setNotifyValue কল করলে CCCD স্বয়ংক্রিয়ভাবে সিস্টেম দ্বারা পরিচালিত হয়। ডেভেলপারকে ম্যানুয়ালি CCCD খুঁজে লিখতে হবে না — Core Bluetooth বিজ্ঞপ্তি সক্রিয় হলে এটি স্বয়ংক্রিয়ভাবে করে।
iOS-এ, সাবস্ক্রিপশন CBPeripheral অবজেক্টে setNotifyValue পদ্ধতির মাধ্যমে করা হয়।
import CoreBluetooth
// ক্যারেক্টারিস্টিক বিজ্ঞপ্তিতে সাবস্ক্রাইব করুন
peripheral.setNotifyValue(true, for: characteristic)
// ডেলিগেট আপডেট করা মান গ্রহণ করে
func peripheral(
_ peripheral: CBPeripheral,
didUpdateValueFor characteristic: CBCharacteristic,
error: Error?
) {
// characteristic.value-তে নতুন ডেটা আছে
guard let data = characteristic.value else { return }
}
Android-এ, বিজ্ঞপ্তিতে সাবস্ক্রিপশন BluetoothGatt.setCharacteristicNotification-এর মাধ্যমে করা হয়। ডেভেলপারকে ম্যানুয়ালি CCCD-তে মান 0x0001 লিখতে হবে।
import android.bluetooth.*;
// বিজ্ঞপ্তি সক্ষম করুন
bluetoothGatt.setCharacteristicNotification(characteristic, true);
// CCCD-তে 0x0001 লিখুন
BluetoothGattDescriptor descriptor = characteristic
.getDescriptor(
UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
);
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);
Bluetooth SIG সাধারণ ক্যারেক্টারিস্টিক কনফিগারেশন কাজের জন্য 8টি স্ট্যান্ডার্ড ডেস্ক্রিপ্টর সংজ্ঞায়িত করেছে। প্রতিটি ডেস্ক্রিপ্টরের কঠোরভাবে সংজ্ঞায়িত UUID এবং মান ফরম্যাট রয়েছে।
| UUID | ডেস্ক্রিপ্টরের নাম | উদ্দেশ্য | মানের ধরন |
|---|---|---|---|
| 0x2900 | Characteristic Extended Properties | ক্যারেক্টারিস্টিকের অতিরিক্ত বৈশিষ্ট্য | uint16 (বিট মাস্ক) |
| 0x2901 | Characteristic User Description | ক্যারেক্টারিস্টিকের টেক্সট নাম | UTF-8 স্ট্রিং |
| 0x2902 | Client Characteristic Configuration | বিজ্ঞপ্তি ব্যবস্থাপনা | uint16 |
| 0x2903 | Server Characteristic Configuration | সম্প্রচারের জন্য সার্ভার কনফিগারেশন | uint16 |
| 0x2904 | Characteristic Presentation Format | ডেটা উপস্থাপন ফরম্যাট | গঠন (7 বাইট) |
| 0x2905 | Characteristic Aggregate Format | একাধিক ক্যারেক্টারিস্টিক একত্রিতকরণ | UUID-এর তালিকা |
| 0x2906 | Valid Range | বৈধ মানের পরিসর | uint16 × 2 (সর্বনিম্ন, সর্বোচ্চ) |
| 0x2907 | External Report Reference | বাহ্যিক রিপোর্ট রেফারেন্স | uint16 |
| 0x2908 | Report Reference | অভ্যন্তরীণ রিপোর্ট রেফারেন্স | uint8 + uint16 |
Characteristic User Description (0x2901) UI-এর জন্য বিশেষভাবে উপযোগী: এটি ক্যারেক্টারিস্টিকের একটি মানব-পাঠযোগ্য নাম ধারণ করে যা অ্যাপ্লিকেশন ইন্টারফেসে প্রদর্শন করা যেতে পারে। উদাহরণস্বরূপ, Battery Level ক্যারেক্টারিস্টিকের “ব্যাটারি চার্জ লেভেল” মান সহ User Description ডেস্ক্রিপ্টর থাকতে পারে।
Characteristic Presentation Format (0x2904) ক্যারেক্টারিস্টিক মান কীভাবে ব্যাখ্যা করতে হবে সে সম্পর্কে তথ্য ধারণ করে: ফরম্যাট (uint8, uint16, float), সূচক, পরিমাপের একক (Bluetooth SIG রেজিস্ট্রি থেকে UUID-এর মাধ্যমে), নামস্থান এবং বিবরণ। উদাহরণস্বরূপ, তাপমাত্রা সূচক -2 (বিভাজন মান 0.01°C) এবং পরিমাপের একক “ডিগ্রি সেলসিয়াস” সহ int16 হতে পারে।
ডেস্ক্রিপ্টরে অ্যাক্সেস iOS এবং Android-এ ভিন্ন। Core Bluetooth বিজ্ঞপ্তি সক্রিয় হলে স্বয়ংক্রিয়ভাবে CCCD পরিচালনা করে, যখন Android-এ ডেস্ক্রিপ্টরে মান ম্যানুয়ালি লিখতে হয়। আসুন উভয় পদ্ধতি দেখি।
iOS-এ, ডেভেলপার সাধারণত সরাসরি ডেস্ক্রিপ্টরের সাথে ইন্টারঅ্যাক্ট করে না। setNotifyValue কল করলে Core Bluetooth স্বয়ংক্রিয়ভাবে CCCD খুঁজে পায় এবং প্রয়োজনীয় মান লেখে। ডেস্ক্রিপ্টর পড়ার জন্য discoverDescriptors পদ্ধতি ব্যবহার করা হয়।
// ডেস্ক্রিপ্টর আবিষ্কার করুন
peripheral.discoverDescriptors(for: characteristic)
// User Description মান পড়ুন
func peripheral(
_ peripheral: CBPeripheral,
didDiscoverDescriptorsFor characteristic: CBCharacteristic,
error: Error?
) {
for descriptor in characteristic.descriptors ?? [] {
if descriptor.uuid == CBUUID("2901") {
peripheral.readValue(for: descriptor)
}
}
}
Android-এ, ডেভেলপারকে ক্যারেক্টারিস্টিকের CCCD ডেস্ক্রিপ্টর খুঁজে বের করতে হবে এবং বিজ্ঞপ্তি সক্রিয় করতে মান লিখতে হবে। এটি iOS-এর তুলনায় একটি অতিরিক্ত ধাপ।
// User Description ডেস্ক্রিপ্টর মান পড়ুন
BluetoothGattDescriptor userDesc = characteristic
.getDescriptor(
UUID.fromString("00002901-0000-1000-8000-00805F9B34FB")
);
if (userDesc != null) {
bluetoothGatt.readDescriptor(userDesc);
}
কাস্টম ডেস্ক্রিপ্টর ব্যবহার করা হয় যখন Bluetooth SIG-এর স্ট্যান্ডার্ড ডেস্ক্রিপ্টর যথেষ্ট নয়। উদাহরণস্বরূপ, একটি মেডিকেল সেন্সর প্রস্তুতকারক সেন্সর ক্যালিব্রেশন তথ্য সহ একটি ডেস্ক্রিপ্টর বা ত্রুটি লগ সহ একটি ডেস্ক্রিপ্টর যোগ করতে পারে।
একটি কাস্টম ডেস্ক্রিপ্টর 128-বিট UUID দিয়ে তৈরি করা হয়, কাস্টম ক্যারেক্টারিস্টিকের মতো। Peripheral পাশে, ডেভেলপার এটি উপযুক্ত API-এর মাধ্যমে ক্যারেক্টারিস্টিকে যোগ করে। Central পাশে, discoverDescriptors কল করলে ডেস্ক্রিপ্টর স্বয়ংক্রিয়ভাবে আবিষ্কৃত হয়।
কাস্টম ডেস্ক্রিপ্টর তৈরি করার সময়, এই নিয়মগুলি অনুসরণ করুন: মানের দৈর্ঘ্য প্রত্যাশিত ডেটা টাইপের সাথে মিলতে হবে, এবং অ্যাক্সেস অধিকার (পড়া/লেখা) স্পষ্টভাবে উল্লেখ করতে হবে। কাস্টম উদ্দেশ্যে Bluetooth SIG-এর স্ট্যান্ডার্ড ডেস্ক্রিপ্টর রেঞ্জের (0x2900–0x2908) UUID ব্যবহার করবেন না।
ক্যারেক্টারিস্টিক এবং ডেস্ক্রিপ্টর GATT অ্যাট্রিবিউটের বিভিন্ন স্তর। ক্যারেক্টারিস্টিক একটি ডেটা পয়েন্ট, যখন ডেস্ক্রিপ্টর হল তার মেটাডেটা বা কনফিগারেশন। পার্থক্যটি বিভিন্ন দিক থেকে প্রকাশ পায়: উদ্দেশ্য, UUID এবং অ্যাক্সেসের নিয়ম।
একটি ক্যারেক্টারিস্টিকের বাধ্যতামূলক ঘোষণা থাকে যা সর্বদা GATT টেবিলে উপস্থিত থাকে। ডেস্ক্রিপ্টর ঐচ্ছিক — একটি ক্যারেক্টারিস্টিকে কোনো ডেস্ক্রিপ্টর নাও থাকতে পারে। একটি ক্যারেক্টারিস্টিক স্বাধীনভাবে পড়া, লেখা বা বিজ্ঞপ্তি পাঠানো যেতে পারে। ডেস্ক্রিপ্টর সর্বদা একটি ক্যারেক্টারিস্টিকের সাথে আবদ্ধ থাকে এবং আলাদাভাবে বিদ্যমান থাকে না।
Bluetooth Core Specification 5.4 অনুসারে, GATT টেবিলে অ্যাট্রিবিউটের ক্রম হল: সার্ভিস ঘোষণা, ক্যারেক্টারিস্টিক ঘোষণা, ক্যারেক্টারিস্টিক মান, ক্যারেক্টারিস্টিক ডেস্ক্রিপ্টর (যদি থাকে), তারপর পরবর্তী সার্ভিস। GATT ক্লায়েন্টের সঠিক অপারেশনের জন্য এই ক্রম বাধ্যতামূলক।
সচরাচর জিজ্ঞাসা
CCCD সাবস্ক্রিপশন পরিচালনার জন্য প্রয়োজন: Notify প্রপার্টি শুধু নির্দেশ করে যে ক্যারেক্টারিস্টিক বিজ্ঞপ্তি পাঠাতে পারে, কিন্তু সেগুলি সক্রিয় করে না। Central-কে CCCD-তে 0x0001 লিখে স্পষ্টভাবে সাবস্ক্রাইব করতে হয়। এটি অপ্রস্তুত Central-এ অবাঞ্ছিত ডেটা প্রেরণ প্রতিরোধ করে।
স্পেসিফিকেশন ডেস্ক্রিপ্টরের সংখ্যা সীমাবদ্ধ করে না। বাস্তবে, প্রতিটি ক্যারেক্টারিস্টিকে সাধারণত 1–3টি ডেস্ক্রিপ্টর থাকে: CCCD (Notify/Indicate সহ ক্যারেক্টারিস্টিকের জন্য), ঐচ্ছিকভাবে User Description এবং Presentation Format। অনেক বেশি ডেস্ক্রিপ্টর GATT টেবিলের আকার বাড়ায়।
বেশিরভাগ ক্ষেত্রে, না। iOS এবং Android-এ Core Bluetooth স্বয়ংক্রিয়ভাবে সেই ক্যারেক্টারিস্টিকগুলিতে CCCD যোগ করে যাদের Notify বা Indicate প্রপার্টি রয়েছে। কাস্টম ডেস্ক্রিপ্টর শুধুমাত্র নির্দিষ্ট মেটাডেটার জন্য ম্যানুয়ালি তৈরি করা হয়।
না, CCCD-র কঠোরভাবে সংজ্ঞায়িত ফরম্যাট (uint16) এবং উদ্দেশ্য রয়েছে — বিজ্ঞপ্তি ব্যবস্থাপনা। অন্যান্য মান লেখা Bluetooth স্পেসিফিকেশন লঙ্ঘন করে এবং সাবস্ক্রিপশন কাজ বন্ধ করতে পারে। কাস্টম ডেটার জন্য, 128-বিট UUID সহ কাস্টম ডেস্ক্রিপ্টর ব্যবহার করুন।
User Description-এ ক্যারেক্টারিস্টিকের একটি মানব-পাঠযোগ্য নাম থাকে — উদাহরণস্বরূপ, UUID 0x2A6E-এর পরিবর্তে “ডিভাইসের তাপমাত্রা”। অ্যাপ্লিকেশন ইন্টারফেসে এই নামটি প্রদর্শন করতে পারে, যা ব্যবহারকারীর জন্য BLE ডিভাইসের সাথে মিথস্ক্রিয়াকে হার্ডকোডেড স্ট্রিং ছাড়াই বোধগম্য করে তোলে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন