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 | एकाधिक विशेषताओं का संयोजन | UUIDs की सूची |
| 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें