GATT — ما هو، Generic Attribute Profile والتطبيق في Android

المؤلف: IT Sectr نُشر: 2026-07-14 وقت القراءة: 10 دق

GATT (Generic Attribute Profile) هو ملف تعريف لتقنية Bluetooth Low Energy (BLE) يحدد بنية البيانات وقواعد تبادل المعلومات بين أجهزة BLE. تم بناء GATT فوق بروتوكول السمات (ATT) وينظم البيانات في تسلسل هرمي: الخدمات والخصائص والواصفات. وفقاً لـ Bluetooth SIG (2025)، يُستخدم ملف تعريف GATT في 98% من جميع تطبيقات BLE — من أجهزة تتبع اللياقة البدنية إلى الأقفال الذكية وأجهزة الاستشعار الطبية.

الملامح الرئيسية

  • GATT — ملف تعريف BLE يحدد هيكل نقل البيانات من خلال الخدمات والخصائص والواصفات
  • التسلسل الهرمي — الخدمة تحتوي على خصائص، كل خاصية لها قيمة واحدة مع واصفات اختيارية
  • UUID — يتم تعريف كل خدمة وخاصية بواسطة UUID 16 بت (قياسي) أو 128 بت (مخصص)
  • الأدوار — خادم GATT (يوفر البيانات) وعميل GATT (يقرأ/يكتب البيانات)
  • واجهة برمجة تطبيقات Android — BluetoothGatt و BluetoothGattService و BluetoothGattCharacteristic — الفئات الرئيسية للعمل مع GATT

ما هو GATT؟

GATT (Generic Attribute Profile) هو ملف تعريف Bluetooth Low Energy (BLE) يحدد كيفية تبادل جهازي BLE للبيانات عبر بروتوكول السمات (ATT). يقوم GATT بتوحيد بنية البيانات: يتم تنظيم جميع البيانات في تسلسل هرمي «خدمة → خاصية → واصف». تم تقديم الملف التعريفي في مواصفات Bluetooth 4.0 (2010) إلى جانب BLE، ومنذ ذلك الحين ظل الآلية الرئيسية لنقل البيانات لأجهزة Bluetooth الموفرة للطاقة. على عكس Bluetooth الكلاسيكي، حيث يتم نقل البيانات عبر منفذ تسلسلي (SPP)، يوفر GATT وصولاً منظماً إلى البيانات من خلال عمليات القراءة والكتابة والإشعارات.

دور GATT في مكدس BLE

يتكون مكدس BLE من عدة طبقات: الطبقة المادية (الراديو)، طبقة الارتباط (إدارة الاتصال)، L2CAP (التحكم في القناة المنطقية)، ATT (بروتوكول السمات — الوصول إلى السمات) و GATT (ملف تعريف قائم على ATT). GATT هو أعلى طبقة يعمل معها مطور التطبيق. يوفر ATT الأساسي عمليات أساسية: قراءة وكتابة وإخطار وإشارة للسمات. يضيف GATT دلالات: يحدد ما هي الخدمة والخاصية، وكيف يتم تجميعها، وما القواعد التي تنطبق عند قراءتها وكتابتها. وفقاً لـ Bluetooth Core Specification 5.4 (2023)، يدعم GATT ما يصل إلى 65,535 سمة (خدمات + خصائص + واصفات) على جهاز واحد.

هندسة GATT: الخدمات والخصائص والواصفات

يتكون التسلسل الهرمي GATT من ثلاثة مستويات. الخدمة هي مجموعة منطقية من الخصائص تحل مهمة واحدة (على سبيل المثال، «خدمة البطارية» أو «خدمة معدل ضربات القلب»). الخاصية هي وحدة بيانات بنوع معروف: مستوى البطارية الحالي، قراءة المستشعر، حالة المفتاح. كل خاصية لها قيمة وواصف واحد أو أكثر يصف البيانات الوصفية: وحدات القياس، إعدادات الإشعارات، نطاق القيم. UUID (المعرف الفريد العالمي) يحدد بشكل فريد كل خدمة وكل خاصية.

أنواع العمليات مع الخصائص

يدعم GATT أربعة أنواع من العمليات للتفاعل مع الخصائص. Read — يطلب العميل القيمة الحالية للخاصية من الخادم. Write — يرسل العميل قيمة جديدة إلى الخادم. Notify — يرسل الخادم قيمة إلى العميل دون تأكيد (أسرع لكن أقل موثوقية). Indicate — يرسل الخادم قيمة مع تأكيد الاستلام (أكثر موثوقية لكن أبطأ). يختار المطور النوع بناءً على السيناريو: لقراءات مستشعر معدل ضربات القلب، يكفي Notify؛ لكتابة تكوين قفل ذكي، يلزم Write مع التأكيد.

kotlin
// هيكل بيانات GATT في كود Android
data class BleService(
    val uuid: UUID,
    val characteristics: List<BleCharacteristic>
)

data class BleCharacteristic(
    val uuid: UUID,
    val properties: Int, // READ, WRITE, NOTIFY, INDICATE
    val descriptors: List<BleDescriptor>,
    var value: ByteArray?
)

GATT و GAP: الفروق بين ملفات تعريف BLE

تحدد مواصفات BLE ملفي تعريف رئيسيين: GAP (Generic Access Profile) و GATT (Generic Attribute Profile). GAP مسؤول عن اكتشاف الأجهزة وإنشاء الاتصال وإدارة الرؤية — إنها «طبقة الشبكة» في BLE. GATT مسؤول عن تبادل البيانات بعد إنشاء الاتصال — «طبقة التطبيق». يستخدم المطور GAP لمسح الأجهزة والاتصال بها، و GATT لقراءة البيانات وكتابتها وتلقي الإشعارات من الجهاز المتصل.

الخاصيةGAPGATT
الغرضالاكتشاف والاتصالتبادل البيانات
الأدوارمركزي / طرفيعميل / خادم
البروتوكولHCI، طبقة الارتباطATT (بروتوكول السمات)
المرحلةقبل الاتصالبعد الاتصال
الفئة الرئيسيةBluetoothAdapterBluetoothGatt

الأدوار في GATT

يحدد GATT دورين: خادم GATT و عميل GATT. الخادم هو جهاز يوفر البيانات (على سبيل المثال، جهاز تتبع اللياقة البدنية الذي يرسل قراءات معدل ضربات القلب). العميل هو جهاز يطلب البيانات (على سبيل المثال، هاتف ذكي يقرأ القراءات). في معظم السيناريوهات، يعمل تطبيق Android كعميل GATT، ويعمل الطرفي BLE كخادم GATT. ومع ذلك، يمكن أن يكون Android أيضاً خادم GATT — على سبيل المثال، عندما يحاكي التطبيق جهاز BLE لأجهزة أخرى. يتم تحديد الدور في مرحلة إعداد اتصال GATT ولا يتغير خلال الجلسة.

كيف يعمل اتصال GATT في BLE

تبدأ عملية اتصال GATT بعد إنشاء اتصال BLE بين الأجهزة. أولاً، يكتشف عميل GATT الخدمات على خادم GATT من خلال اكتشاف الخدمة — يقوم Android بذلك تلقائياً عند الاتصال عبر BluetoothGatt.discoverServices(). بعد الاكتشاف، يحصل العميل على قائمة بالخدمات والخصائص والواصفات المتاحة. ثم يمكن للعميل قراءة قيم الخصائص (Read)، أو كتابة قيم جديدة (Write)، أو الاشتراك في الإشعارات (Set Notify/Indicate). يمكن لخادم GATT إرسال Notify/Indicate إلى العميل في أي وقت بعد إنشاء الاتصال.

MTU — الوحدة القصوى للإرسال

افتراضياً، حجم حزمة GATT واحدة (MTU) في BLE هو 23 بايت، منها 3 بايت رأس ATT و 20 بايت بيانات مفيدة. إذا احتاج التطبيق إلى نقل المزيد من البيانات (على سبيل المثال، تحديث OTA للبرامج الثابتة)، يمكن طلب زيادة MTU إلى 517 بايت عبر requestMtu() في Android. يؤدي زيادة MTU إلى تقليل عدد الحزم اللازمة لنقل كتلة بيانات واحدة — بدلاً من 50 حزمة صغيرة، يمكن إرسال حزمتين كبيرتين، مما يقلل استهلاك الطاقة ويسرع النقل. يعتمد الحد الأقصى لـ MTU على إصدار BLE وإمكانيات الرقاقة — يدعم Bluetooth 5.0 حتى 517 بايت، والإصدارات الأقدم حتى 247 بايت.

kotlin
// الاشتراك في إشعارات الخصائص
fun enableNotifications(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
    gatt.setCharacteristicNotification(characteristic, true)

    // تمكين CCCD (واصف تكوين خاصية العميل)
    val cccdUuid = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")
    val descriptor = characteristic.getDescriptor(cccdUuid)
    descriptor?.let {
        it.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE)
        gatt.writeDescriptor(it)
    }
}

معالجة الإشعارات

لتلقي الإشعارات من خادم GATT على Android، تحتاج إلى تنفيذ رد الاتصال BluetoothGattCallback.onCharacteristicChanged(). في هذه الطريقة، يتلقى التطبيق القيمة المحدثة للخاصية في كل مرة يرسل فيها الخادم Notify أو Indicate. لمعالجة البيانات في الوقت الفعلي، استخدم مخزناً و coroutines في Kotlin — هذا يمنع حظر سلسلة واجهة المستخدم أثناء الإشعارات المكثفة (على سبيل المثال، أكثر من 100 قراءة لمعدل ضربات القلب في الثانية). للإشارات (Indicate)، يجب عليك استدعاء gatt.sendResponse() على جانب الخادم — على عميل Android، يتم معالجة هذا تلقائياً.

تنفيذ GATT على Android

على Android، يتم تنفيذ العمل مع GATT من خلال فئات حزمة android.bluetooth: BluetoothGatt (الاتصال)، BluetoothGattService (الخدمة)، BluetoothGattCharacteristic (الخاصية)، و BluetoothGattDescriptor (الواصف). يبدأ الاتصال بجهاز BLE باستدعاء BluetoothDevice.connectGatt() — تقوم هذه الطريقة بإرجاع BluetoothGatt الذي تتم من خلاله جميع العمليات اللاحقة. تصل جميع استدعاءات GATT إلى BluetoothGattCallback — وهي واجهة غير متزامنة يتم استدعاؤها في نفس الخيط حيث تم إنشاء BluetoothGatt. مهم: يجب تنفيذ جميع عمليات GATT بشكل تسلسلي — استدعاء عمليات متعددة في وقت واحد على نفس BluetoothGatt يؤدي إلى أخطاء.

دورة حياة اتصال GATT

إدارة دورة حياة اتصال GATT بشكل صحيح أمر بالغ الأهمية لاستقرار تطبيق BLE. بعد استدعاء connectGatt()، ينتظر التطبيق رد الاتصال onConnectionStateChange() مع الحالة STATE_CONNECTED. ثم يبدأ النظام تلقائياً اكتشاف الخدمة، وبعد اكتماله يتم استدعاء onServicesDiscovered(). فقط بعد ذلك يمكن إجراء القراءة والكتابة والاشتراك. عند الانتهاء، اتصل دائماً بـ gatt.close() في onDestroy() أو onPause() — اتصالات GATT غير المغلقة تستهلك البطارية وقد تمنع إعادة الاتصال بنفس الجهاز على Android.

kotlin
// الاتصال بجهاز BLE عبر GATT
private val gattCallback = object : BluetoothGattCallback() {
    override fun onConnectionStateChange(
        gatt: BluetoothGatt, status: Int, newState: Int
    ) {
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            gatt.discoverServices()
        }
    }

    override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
        val service = gatt.getService(UUID.fromString("180D"))
        val characteristic = service?.getCharacteristic(
            UUID.fromString("2A37")
        )
        characteristic?.let { enableNotifications(gatt, it) }
    }
}

ملفات تعريف وخدمات GATT القياسية

يحدد Bluetooth SIG العشرات من ملفات تعريف وخدمات GATT القياسية مع UUID ثابت 16 بت. الأكثر شيوعاً: Battery Service (UUID 180F، خاصية Battery Level 2A19)، خدمة Heart Rate (UUID 180D، خاصية Heart Rate Measurement 2A37)، خدمة Device Information (UUID 180A، خاصيتا Manufacturer Name و Serial Number). استخدام الخدمات القياسية يضمن التوافق بين أجهزة من شركات مصنعة مختلفة — أي سوار لياقة بدنية مع خدمة Heart Rate يجب أن يعمل مع أي تطبيق Android يدعمها.

تصميم خدمات GATT مخصصة

إذا كانت الخدمات القياسية لا تغطي المهمة، يمكن للمطور إنشاء خدمات GATT مخصصة مع UUID 128 بت. عند تصميم خدمة مخصصة، تحتاج إلى: تحديد مجموعة منطقية من الخصائص (على سبيل المثال، «خدمة التحكم في القفل»)، وتعيين لكل خاصية الخصائص الصحيحة (Read, Write, Notify)، وتحديد القيم المسموح بها ووحدات القياس من خلال واصف Characteristic Presentation Format. للبروتوكولات المعقدة، يوصى بتضمين خاصية Command مع خاصية Write وخاصية Status مع Notify — وهذا يتبع نمط Command/Status المعتمد في تطبيقات BLE الصناعية.

kotlin
// إنشاء خدمة GATT مخصصة (Android كخادم GATT)
private fun createCustomService(): BluetoothGattService {
    val serviceUuid = UUID.fromString("12345678-1234-5678-1234-56789abcdef0")
    val service = BluetoothGattService(
        serviceUuid, BluetoothGattService.SERVICE_TYPE_PRIMARY
    )

    val charUuid = UUID.fromString("12345678-1234-5678-1234-56789abcdef1")
    val characteristic = BluetoothGattCharacteristic(
        charUuid,
        BluetoothGattCharacteristic.PROPERTY_READ or
        BluetoothGattCharacteristic.PROPERTY_NOTIFY,
        BluetoothGattCharacteristic.PERMISSION_READ
    )
    service.addCharacteristic(characteristic)
    return service
}

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

ما هو GATT في BLE ولماذا هو مطلوب؟

GATT (Generic Attribute Profile) هو ملف تعريف Bluetooth Low Energy يحدد هيكل تبادل البيانات بين الأجهزة. هو مطلوب لتوحيد الوصول إلى المعلومات: جميع أجهزة BLE تنظم البيانات في خدمات وخصائص، مما يسمح لأي عميل بقراءة قراءات المستشعرات والتحكم في الأجهزة وتلقي الإشعارات.

كيف يختلف GATT عن GAP؟

GAP مسؤول عن اكتشاف أجهزة BLE والاتصال بها (المسح، الإعلان، إنشاء الاتصال). GATT مسؤول عن تبادل البيانات بعد الاتصال (القراءة، الكتابة، الإشعارات). GAP يعمل قبل الاتصال، GATT يعمل بعده. كلا الملفين إلزاميان لـ BLE، لكنهما يؤديان وظائف مختلفة: GAP هو «طبقة الشبكة»، GATT هو «طبقة التطبيق».

ما هي خدمات وخصائص GATT الموجودة؟

تشمل الخدمات القياسية Battery Service (180F، مستوى البطارية)، Heart Rate (180D، النبض)، Device Information (180A، بيانات الجهاز). تحتوي كل خدمة على عدة خصائص مع UUID 16 بت. يمكن للمطورين إنشاء خدمات مخصصة مع UUID 128 بت لمهام محددة — مثل التحكم في القفل الذكي أو نقل بيانات جهاز تتبع اللياقة البدنية.

كيف يعمل GATT على Android؟

على Android، يتم تنفيذ GATT من خلال BluetoothGatt (الاتصال)، BluetoothGattService (الخدمة)، BluetoothGattCharacteristic (الخاصية)، و BluetoothGattDescriptor (الواصف). يتم الاتصال عبر connectGatt()، وبعد ذلك تصل الأحداث من خلال BluetoothGattCallback: onConnectionStateChange، onServicesDiscovered، onCharacteristicChanged (للإشعارات). يجب تنفيذ جميع عمليات GATT بشكل تسلسلي.

ما هو UUID في GATT؟

UUID (المعرف الفريد العالمي) هو معرف 16 بت أو 128 بت يحدد بشكل فريد خدمة أو خاصية في GATT. تستخدم خدمات Bluetooth SIG القياسية UUID 16 بت (على سبيل المثال، 180D لـ Heart Rate). تستخدم خدمات المطورين المخصصة UUID 128 بت (على سبيل المثال، 12345678-1234-5678-1234-56789abcdef0). يسمح UUID للعميل بالعثور على البيانات المطلوبة على خادم GATT.

الخلاصة

  • GATT — ملف تعريف BLE لتبادل البيانات المنظم من خلال تسلسل هرمي للخدمات والخصائص والواصفات، استناداً إلى بروتوكول السمات (ATT)
  • التسلسل الهرمي للبيانات — خدمة (مجموعة منطقية)، خاصية (قيمة محددة بنوع)، واصف (بيانات وصفية — وحدات، إعدادات إشعارات)
  • أدوار GATT — خادم (يوفر البيانات، عادة طرفي BLE) وعميل (يقرأ/يكتب، عادة هاتف Android)
  • العمليات — Read، Write، Notify (بدون تأكيد، أسرع) و Indicate (مع تأكيد، أكثر موثوقية)؛ يعتمد الاختيار على السيناريو
  • واجهة برمجة تطبيقات Android — BluetoothGatt، BluetoothGattCallback، BluetoothGattService، BluetoothGattCharacteristic؛ استدعاءات غير متزامنة متسلسلة عبر عمليات الاستدعاء
  • الملفات القياسية — Battery Service، Heart Rate، Device Information — تضمن التوافق بين أجهزة من شركات مصنعة مختلفة
  • الخدمات المخصصة — UUID 128 بت للمهام الفريدة؛ تُصمم باستخدام نمط Command/Status مع الخصائص الصحيحة (Read، Write، Notify، Indicate)

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

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

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

اقرأ أيضًا