Descriptor: यह क्या है, Client Characteristic Configuration और उदाहरण

लेखक: IT Sectr प्रकाशित: 2026-07-15 पढ़ने का समय: 8 मिनट

Descriptor BLE विशेषता की एक सहायक विशेषता है जो इसके मान के लिए मेटाडेटा या कॉन्फ़िगरेशन प्रदान करती है। Bluetooth Core Specification 5.4 डिस्क्रिप्टर को GATT प्रोफ़ाइल के अभिन्न अंग के रूप में परिभाषित करता है: वे माप की इकाइयों, मान श्रेणियों, टेक्स्ट नामों का वर्णन करते हैं और सूचनाओं की सदस्यता का प्रबंधन करते हैं। सबसे प्रसिद्ध डिस्क्रिप्टर Client Characteristic Configuration Descriptor (CCCD, 0x2902) है, जो Central को विशेषता से सूचनाओं की सदस्यता लेने की अनुमति देता है। Bluetooth SIG के अनुसार, 8 मानक डिस्क्रिप्टर निर्दिष्ट हैं, और कस्टम डिस्क्रिप्टर डेवलपर द्वारा किसी भी अतिरिक्त मेटाडेटा के लिए बनाए जा सकते हैं।

मुख्य बातें

  • Descriptor — विशेषता की एक सहायक विशेषता जिसमें मान का मेटाडेटा या कॉन्फ़िगरेशन होता है।
  • CCCD (0x2902) — सबसे महत्वपूर्ण डिस्क्रिप्टर: इसके माध्यम से Central विशेषता में परिवर्तनों के बारे में सूचनाओं की सदस्यता लेता है।
  • मानक डिस्क्रिप्टर में टेक्स्ट नाम के लिए User Description (0x2901) और डेटा प्रारूप के लिए Presentation Format (0x2904) शामिल हैं।
  • प्रत्येक विशेषता में एकाधिक डिस्क्रिप्टर हो सकते हैं, लेकिन प्रत्येक मानक प्रकार का एक से अधिक नहीं।
  • Core Bluetooth डिस्क्रिप्टर स्वचालित रूप से बनाता है, लेकिन विशिष्ट मेटाडेटा के लिए उन्हें अनुकूलित किया जा सकता है।

BLE में Descriptor क्या है?

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 यह नहीं जान पाएगा कि विशेषता के कच्चे बाइट्स की व्याख्या कैसे करें।

Client Characteristic Configuration Descriptor (CCCD)

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 विधि के माध्यम से की जाती है।

swift
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 लिखना होगा।

java
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 के मानक डिस्क्रिप्टर

Bluetooth SIG ने सामान्य विशेषता कॉन्फ़िगरेशन कार्यों के लिए 8 मानक डिस्क्रिप्टर परिभाषित किए हैं। प्रत्येक डिस्क्रिप्टर का सख्ती से परिभाषित UUID और मान प्रारूप है।

UUIDडिस्क्रिप्टर नामउद्देश्यमान प्रकार
0x2900Characteristic Extended Propertiesविशेषता के अतिरिक्त गुणuint16 (बिट मास्क)
0x2901Characteristic User Descriptionविशेषता का टेक्स्ट नामUTF-8 स्ट्रिंग
0x2902Client Characteristic Configurationसूचना प्रबंधनuint16
0x2903Server Characteristic Configurationप्रसारण के लिए सर्वर कॉन्फ़िगरेशनuint16
0x2904Characteristic Presentation Formatडेटा प्रस्तुति प्रारूपसंरचना (7 बाइट्स)
0x2905Characteristic Aggregate Formatएकाधिक विशेषताओं का संयोजनUUIDs की सूची
0x2906Valid Rangeमान्य मानों की श्रेणीuint16 × 2 (न्यूनतम, अधिकतम)
0x2907External Report Referenceबाहरी रिपोर्ट संदर्भuint16
0x2908Report 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 में Descriptor का उपयोग कैसे करें

डिस्क्रिप्टर तक पहुंच iOS और Android पर भिन्न होती है। Core Bluetooth सूचनाएं सक्षम होने पर CCCD को स्वचालित रूप से प्रबंधित करता है, जबकि Android को डिस्क्रिप्टर में मान की मैन्युअल लेखन की आवश्यकता होती है। आइए दोनों दृष्टिकोणों को देखें।

iOS: स्वचालित CCCD प्रबंधन

iOS में, डेवलपर आमतौर पर सीधे डिस्क्रिप्टर के साथ इंटरैक्ट नहीं करता है। setNotifyValue कॉल करने पर Core Bluetooth स्वचालित रूप से CCCD ढूंढता है और आवश्यक मान लिखता है। डिस्क्रिप्टर पढ़ने के लिए discoverDescriptors विधि का उपयोग किया जाता है।

swift
// डिस्क्रिप्टर खोजें
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 प्रबंधन

Android पर, डेवलपर को विशेषता का CCCD डिस्क्रिप्टर ढूंढना होगा और सूचनाएं सक्षम करने के लिए मान लिखना होगा। यह iOS की तुलना में एक अतिरिक्त कदम है।

java
// 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 का उपयोग न करें।

Descriptor और Characteristic में अंतर

विशेषता और डिस्क्रिप्टर GATT विशेषताओं के विभिन्न स्तर हैं। विशेषता एक डेटा बिंदु है, जबकि डिस्क्रिप्टर इसका मेटाडेटा या कॉन्फ़िगरेशन है। अंतर कई पहलुओं में प्रकट होता है: उद्देश्य, UUID और पहुंच नियम।

एक विशेषता का अनिवार्य घोषणा होती है जो हमेशा GATT तालिका में मौजूद रहती है। डिस्क्रिप्टर वैकल्पिक है — एक विशेषता में कोई डिस्क्रिप्टर नहीं हो सकता है। एक विशेषता को स्वतंत्र रूप से पढ़ा, लिखा या सूचनाएं भेजी जा सकती हैं। डिस्क्रिप्टर हमेशा एक विशेषता से बंधा होता है और अलग से मौजूद नहीं होता।

Bluetooth Core Specification 5.4 के अनुसार, GATT तालिका में विशेषताओं का क्रम इस प्रकार है: सेवा घोषणा, विशेषता घोषणा, विशेषता मान, विशेषता डिस्क्रिप्टर (यदि कोई हों), फिर अगली सेवा। यह क्रम GATT क्लाइंट के सही संचालन के लिए अनिवार्य है।

अक्सर पूछे जाने वाले प्रश्न

अगर विशेषता में पहले से Notify गुण है तो CCCD की आवश्यकता क्यों है?

CCCD सदस्यता प्रबंधन के लिए आवश्यक है: Notify गुण केवल इंगित करता है कि विशेषता सूचनाएं भेज सकती है, लेकिन उन्हें सक्षम नहीं करता। Central को CCCD में 0x0001 लिखकर स्पष्ट रूप से सदस्यता लेनी होती है। यह तैयार न होने वाले Central को अवांछित डेटा भेजने से रोकता है।

एक विशेषता में कितने डिस्क्रिप्टर हो सकते हैं?

विनिर्देश डिस्क्रिप्टर की संख्या को सीमित नहीं करता है। व्यवहार में, प्रत्येक विशेषता में आमतौर पर 1–3 डिस्क्रिप्टर होते हैं: CCCD (Notify/Indicate वाली विशेषताओं के लिए), वैकल्पिक रूप से User Description और Presentation Format। बहुत अधिक डिस्क्रिप्टर GATT तालिका का आकार बढ़ाते हैं।

क्या मुझे Peripheral पर मैन्युअल रूप से डिस्क्रिप्टर बनाने की आवश्यकता है?

अधिकांश मामलों में, नहीं। iOS और Android पर Core Bluetooth स्वचालित रूप से उन विशेषताओं में CCCD जोड़ता है जिनमें Notify या Indicate गुण होते हैं। कस्टम डिस्क्रिप्टर केवल विशिष्ट मेटाडेटा के लिए मैन्युअल रूप से बनाए जाते हैं।

क्या मैं CCCD में कस्टम डेटा लिख सकता हूं?

नहीं, CCCD का सख्ती से परिभाषित प्रारूप (uint16) और उद्देश्य है — सूचना प्रबंधन। अन्य मान लिखना Bluetooth विनिर्देश का उल्लंघन करता है और सदस्यता को काम करना बंद कर सकता है। कस्टम डेटा के लिए, 128-बिट UUID वाले कस्टम डिस्क्रिप्टर का उपयोग करें।

Characteristic User Description एप्लिकेशन के लिए कैसे उपयोगी है?

User Description में विशेषता का मानव-पठनीय नाम होता है — उदाहरण के लिए, UUID 0x2A6E के बजाय “डिवाइस का तापमान”। एप्लिकेशन इस नाम को इंटरफ़ेस में प्रदर्शित कर सकता है, जिससे बिना हार्डकोडेड स्ट्रिंग के उपयोगकर्ता के लिए BLE डिवाइस के साथ इंटरैक्शन समझ में आता है।

सारांश

  • Descriptor — मेटाडेटा या कॉन्फ़िगरेशन संग्रहीत करने के लिए विशेषता से जुड़ी एक सहायक GATT विशेषता।
  • CCCD (0x2902) — मुख्य डिस्क्रिप्टर जो विशेषता की सूचनाओं और संकेतों के लिए Central की सदस्यता का प्रबंधन करता है।
  • Bluetooth SIG ने सामान्य कार्यों — विवरण, स्वरूपण और कॉन्फ़िगरेशन के लिए 8 मानक डिस्क्रिप्टर (0x2900–0x2908) निर्दिष्ट किए हैं।
  • iOS में, CCCD स्वचालित रूप से प्रबंधित होता है; Android पर सूचनाएं सक्षम करने के लिए मैन्युअल रूप से मान 0x0001 लिखना आवश्यक है।
  • कस्टम डिस्क्रिप्टर मानक डिस्क्रिप्टर द्वारा कवर न किए गए अद्वितीय मेटाडेटा के लिए 128-बिट UUID के साथ बनाए जाते हैं।
  • डिस्क्रिप्टर स्वतंत्र रूप से मौजूद नहीं होते — वे हमेशा एक विशेषता से बंधे होते हैं और GATT तालिका में इसका अनुसरण करते हैं।
  • डिस्क्रिप्टर का उचित उपयोग सही BLE कनेक्शन कॉन्फ़िगरेशन और एप्लिकेशन के लिए डेटा स्पष्टता सुनिश्चित करता है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें