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 بٹ UUIDs ہوتے ہیں۔ ڈسکرپٹرز آزادانہ طور پر موجود نہیں ہو سکتے — وہ ہمیشہ ایک مخصوص خصوصیت سے منسلک ہوتے ہیں۔
Bluetooth Core Specification 5.4 (2023) کے مطابق، ڈسکرپٹرز دو حصوں میں تقسیم ہیں: معیاری (Bluetooth SIG کے بیان کردہ) اور کسٹم (ڈویلپر کے بیان کردہ)۔ معیاری ڈسکرپٹرز کے UUIDs 0x2900–0x2908 کی حد میں ہوتے ہیں اور سختی سے بیان کردہ افعال انجام دیتے ہیں۔ کسٹم ڈسکرپٹرز 128 بٹ UUIDs استعمال کرتے ہیں، جیسے کسٹم سروسز اور خصوصیات۔
ڈسکرپٹرز 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) یوزر انٹرفیس کے لیے خاص طور پر مفید ہے: اس میں خصوصیت کا انسانی پڑھنے کے قابل نام ہوتا ہے جسے ایپلیکیشن انٹرفیس میں دکھایا جا سکتا ہے۔ مثال کے طور پر، 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) کے UUIDs استعمال نہ کریں۔
خصوصیت اور ڈسکرپٹر 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں