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) — أهم واصف: من خلاله يشترك المركز في الإشعارات حول تغييرات الخاصية.
  • تشمل الواصفات القياسية User Description (0x2901) للاسم النصي وPresentation Format (0x2904) لتنسيق البيانات.
  • يمكن أن تحتوي كل خاصية على واصفات متعددة، ولكن ليس أكثر من واحد من كل نوع قياسي.
  • يقوم Core Bluetooth بإنشاء الواصفات تلقائياً، ولكن يمكن تخصيصها لبيانات وصفية محددة.

ما هو Descriptor في BLE؟

Descriptor هو سمة من سمات بروتوكول GATT تُلحق بالخاصية وتوفر معلومات إضافية عن قيمتها أو طريقة استخدامها. في مصطلحات GATT، الخاصية هي البيانات، والواصف هو البيانات الوصفية لتلك البيانات.

يمكن أن تحتوي كل خاصية على صفر أو أكثر من الواصفات. تُعرّف الواصفات كسمات منفصلة في جدول GATT ولها معرفات UUID خاصة بها بحجم 16 بت في مساحة Bluetooth SIG. لا يمكن للواصفات أن توجد بشكل مستقل — فهي مرتبطة دائماً بخاصية محددة.

وفقاً لـ Bluetooth Core Specification 5.4 (2023)، تنقسم الواصفات إلى فئتين: قياسية (محددة من قبل Bluetooth SIG) ومخصصة (يحددها المطور). الواصفات القياسية لها معرفات UUID في النطاق 0x2900–0x2908 وتؤدي وظائف محددة بدقة. تستخدم الواصفات المخصصة معرفات UUID بحجم 128 بت، على غرار الخدمات والخصائص المخصصة.

الواصفات هي آلية رئيسية لـ تكوين سلوك اتصال BLE. بدون CCCD (0x2902) يستحيل الاشتراك في الإشعارات، بدون Presentation Format (0x2904) لن يعرف المركز كيفية تفسير البايتات الأولية للخاصية.

Client Characteristic Configuration Descriptor (CCCD)

CCCD بمعرف UUID 0x2902 هو أهم وأوسع واصف استخداماً في BLE. يدير اشتراك المركز في إشعارات Notify و Indicate من الخاصية. بدون الكتابة في CCCD، لن ترسل الخاصية الإشعارات، حتى لو كانت تمتلك خاصية Notify.

CCCD هو قيمة بحجم 16 بت حيث البت الأقل أهمية (0x0001) يفعل Notify، والبت الثاني (0x0002) يفعل Indicate. يكتب المركز القيمة المطلوبة في CCCD، وبالتالي يشترك في الإشعارات. إذا كتب المركز 0x0000 — يتم إلغاء الاشتراك.

آلية عمل CCCD كما يلي: عندما يكتشف المركز خاصية تدعم Notify، يجد واصف CCCD الخاص بها ويكتب 0x0001. بعد ذلك، في كل مرة يقوم الطرف المحيط (Peripheral) بتحديث قيمة الخاصية، يتم إرسالها تلقائياً إلى المركز المشترك عبر Handle Value Notification (بدون طلب من المركز).

وفقاً لـ Apple Core Bluetooth Programming Guide، يتم إدارة CCCD تلقائياً بواسطة النظام عند استدعاء setNotifyValue لخاصية معينة. لا يحتاج المطور إلى البحث والكتابة يدوياً في CCCD — يقوم Core Bluetooth بذلك تلقائياً عند تفعيل الإشعارات.

الاشتراك البرمجي في الإشعارات

في iOS، يتم الاشتراك من خلال طريقة setNotifyValue على كائن CBPeripheral.

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. يجب على المطور أيضاً كتابة القيمة 0x0001 يدوياً في CCCD.

java
import android.bluetooth.*;

// تفعيل الإشعارات
bluetoothGatt.setCharacteristicNotification(characteristic, true);

// كتابة 0x0001 في CCCD
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 (min, max)
0x2907External Report Referenceمرجع تقرير خارجيuint16
0x2908Report Referenceمرجع تقرير داخليuint8 + uint16

Characteristic User Description (0x2901) مفيد بشكل خاص لواجهة المستخدم: يحتوي على اسم مقروء للخاصية يمكن عرضه في واجهة التطبيق. على سبيل المثال، خاصية Battery Level قد تحتوي على واصف User Description بالقيمة «مستوى شحن البطارية».

Characteristic Presentation Format (0x2904) يحتوي على معلومات حول كيفية تفسير قيمة الخاصية: التنسيق (uint8, uint16, float)، الأس، وحدة القياس (عبر UUID من سجل Bluetooth SIG)، مساحة الأسماء والوصف. على سبيل المثال، يمكن أن تكون درجة الحرارة int16 بأس -2 (قيمة التقسيم 0.01°م) ووحدة قياس «درجة مئوية».

كيفية استخدام Descriptor في iOS و Android

الوصول إلى الواصفات يختلف في iOS و Android. يدير Core Bluetooth تلقائياً CCCD عند تفعيل الإشعارات، بينما يتطلب Android كتابة يدوية للقيمة في الواصف. دعنا ننظر في كلا النهجين.

iOS: إدارة CCCD التلقائية

في iOS، لا يتفاعل المطور عادة مع الواصفات مباشرة. يجد Core Bluetooth تلقائياً CCCD ويكتب القيمة المطلوبة عند استدعاء setNotifyValue. لقراءة الواصفات يستخدم طريقة 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 كافية. على سبيل المثال، قد يضيف مصنع أجهزة استشعار طبية واصفاً بمعلومات معايرة المستشعر أو واصفاً بسجل الأخطاء.

يتم إنشاء واصف مخصص بمعرف UUID بحجم 128 بت، على غرار الخاصية المخصصة. على جانب Peripheral، يضيفه المطور إلى الخاصية عبر API المناسب. على جانب Central، يتم اكتشاف الواصف تلقائياً عند استدعاء discoverDescriptors.

عند إنشاء واصف مخصص، اتبع القواعد التالية: يجب أن يتطابق طول القيمة مع نوع البيانات المتوقع، ويجب تحديد حقوق الوصول (قراءة/كتابة) صراحة. لا تستخدم معرفات UUID من نطاق الواصفات القياسية لـ Bluetooth SIG (0x2900–0x2908) للأغراض المخصصة.

الفرق بين Descriptor و Characteristic

الخاصية والواصف هما مستويان مختلفان من سمات GATT. الخاصية هي نقطة بيانات، بينما الواصف هو بياناتها الوصفية أو تكوينها. يتجلى الفرق في عدة جوانب: الغرض، UUID، وقواعد الوصول.

الخاصية لها إعلان إلزامي موجود دائماً في جدول GATT. الواصف اختياري — قد لا تحتوي الخاصية على واصفات. يمكن قراءة الخاصية أو كتابتها أو إرسال إشعارات بشكل مستقل. الواصف مرتبط دائماً بخاصية ولا يوجد بشكل منفصل.

وفقاً لـ Bluetooth Core Specification 5.4، ترتيب السمات في جدول GATT هو كالتالي: إعلان الخدمة، إعلان الخاصية، قيمة الخاصية، واصفات الخاصية (إن وجدت)، ثم الخدمة التالية. هذا الترتيب إلزامي للتشغيل الصحيح لعملاء GATT.

الأسئلة الشائعة

لماذا نحتاج CCCD إذا كانت الخاصية تمتلك خاصية Notify بالفعل؟

CCCD ضروري لإدارة الاشتراك: خاصية Notify تشير فقط إلى أن الخاصية يمكنها إرسال الإشعارات، ولكنها لا تفعلها. يجب على المركز الاشتراك صراحة بكتابة 0x0001 في CCCD. هذا يمنع إرسال البيانات غير المرغوب فيها إلى مركز غير مستعد.

كم عدد الواصفات التي يمكن أن تحتويها خاصية واحدة؟

المواصفة لا تحد من عدد الواصفات. عملياً، تحتوي كل خاصية عادة على 1–3 واصفات: CCCD (للخصائص مع Notify/Indicate)، اختيارياً User Description و Presentation Format. كثرة الواصفات تزيد من حجم جدول GATT.

هل أحتاج إلى إنشاء واصفات يدوياً على Peripheral؟

في معظم الحالات، لا. يقوم Core Bluetooth على iOS و Android بإضافة CCCD تلقائياً إلى الخصائص التي تمتلك خصائص Notify أو Indicate. يتم إنشاء الواصفات المخصصة يدوياً فقط لبيانات وصفية محددة.

هل يمكنني كتابة بيانات مخصصة في CCCD؟

لا، CCCD له تنسيق محدد بدقة (uint16) وغرض — إدارة الإشعارات. كتابة قيم أخرى تخالف مواصفة Bluetooth وقد تؤدي إلى توقف الاشتراك عن العمل. للبيانات المخصصة، استخدم واصفات مخصصة بمعرفات UUID بحجم 128 بت.

كيف يفيد Characteristic User Description التطبيق؟

User Description يحتوي على اسم مقروء للخاصية — على سبيل المثال، «درجة حرارة الجهاز» بدلاً من UUID 0x2A6E. يمكن للتطبيق عرض هذا الاسم في الواجهة، مما يجعل التفاعل مع جهاز BLE مفهوماً للمستخدم دون سلاسل نصية مقننة.

الخلاصة

  • Descriptor — سمة GATT مساعدة ملحقة بخاصية لتخزين البيانات الوصفية أو التكوين.
  • CCCD (0x2902) — الواصف الرئيسي الذي يدير اشتراك المركز في إشعارات وتأكيدات الخاصية.
  • Bluetooth SIG حدد 8 واصفات قياسية (0x2900–0x2908) للمهام الشائعة — الوصف والتنسيق والتكوين.
  • في iOS، تتم إدارة CCCD تلقائياً؛ في Android، يلزم كتابة يدوية للقيمة 0x0001 لتفعيل الإشعارات.
  • يتم إنشاء الواصفات المخصصة بمعرف UUID بحجم 128 بت لبيانات وصفية فريدة غير مغطاة بالواصفات القياسية.
  • الواصفات لا توجد بشكل مستقل — فهي دائماً مرتبطة بخاصية وتتبعها في جدول GATT.
  • الاستخدام الصحيح للواصفات يضمن التكوين الصحيح لاتصال BLE ووضوح البيانات للتطبيق.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا