GATT — bu nima, Generic Attribute Profile va Androidda tatbiq etish

Muallif: IT Sectr Nashr etilgan: 2026-07-14 O'qish vaqti: 10 daq

GATT (Generic Attribute Profile) — Bluetooth Low Energy (BLE) profili, ma'lumotlar tuzilmasini va BLE qurilmalari o'rtasida axborot almashish qoidalarini belgilaydi. GATT Attribute Protocol (ATT) ustiga qurilgan va ma'lumotlarni ierarxiyada tashkil qiladi: xizmatlar (services), xarakteristikalar (characteristics) va deskriptorlar (descriptors). Bluetooth SIG (2025) ma'lumotlariga ko'ra, GATT profili barcha BLE ilovalarining 98 foizida qo'llaniladi — fitnes kuzatuvchilardan tortib aqlli qulflar va tibbiy sensorlargacha.

Asosiy fikrlar

  • GATT — xizmatlar, xarakteristikalar va deskriptorlar orqali ma'lumot uzatish tuzilmasini belgilaydigan BLE profili
  • Ierarxiya — xizmat xarakteristikalarni o'z ichiga oladi, har bir xarakteristika ixtiyoriy deskriptorlar bilan bitta qiymatdir
  • UUID — har bir xizmat va xarakteristika 16-bitli (standart) yoki 128-bitli (maxsus) UUID bilan identifikatsiya qilinadi
  • Rollar — GATT Server (ma'lumot taqdim etadi) va GATT Client (ma'lumotni o'qiydi/yozadi)
  • Android API — BluetoothGatt, BluetoothGattService, BluetoothGattCharacteristic — GATT bilan ishlash uchun asosiy sinflar

GATT nima?

GATT (Generic Attribute Profile) — bu ikkita BLE qurilmasi Attribute Protocol (ATT) orqali ma'lumot almashish usulini belgilaydigan Bluetooth Low Energy (BLE) profilidir. GATT ma'lumotlar tuzilmasini standartlashtiradi: barcha ma'lumotlar “xizmat → xarakteristika → deskriptor” ierarxiyasida tashkil qilingan. Profil Bluetooth 4.0 spetsifikatsiyasida (2010) BLE bilan birga taqdim etilgan va shundan beri energiya tejamkor Bluetooth qurilmalari uchun asosiy ma'lumot uzatish mexanizmi bo'lib qolmoqda. Klassik Bluetoothdan farqli o'laroq, ma'lumotlar ketma-ket port (SPP) orqali uzatiladigan joyda, GATT o'qish, yozish va bildirishnomalar operatsiyalari orqali ma'lumotlarga tuzilgan kirishni ta'minlaydi.

GATTning BLE stekidagi roli

BLE steki bir necha qatlamlardan iborat: Physical Layer (radio), Link Layer (ulanishni boshqarish), L2CAP (mantiqiy kanal uzatish), ATT (Attribute Protocol — atributlarga kirish) va GATT (ATTga asoslangan profil). GATT dastur ishlab chiqaruvchisi ishlaydigan eng yuqori qatlamdir. Quyidagi ATT asosiy operatsiyalarni ta'minlaydi: atributlarni o'qish, yozish, bildirish va ko'rsatish. GATT esa semantika qo'shadi: xizmat nima, xarakteristika nima, ular qanday guruhlanadi va ularni o'qish/yozishda qanday qoidalar amal qilishini belgilaydi. Bluetooth Core Specification 5.4 (2023) ma'lumotlariga ko'ra, GATT bitta qurilmada 65 535 atributgacha (xizmatlar + xarakteristikalar + deskriptorlar) qo'llab-quvvatlaydi.

GATT arxitekturasi: xizmatlar, xarakteristikalar va deskriptorlar

GATT ierarxiyasi uch darajadan iborat. Xizmat (Service) — bitta vazifani hal qiladigan xarakteristikalarning mantiqiy guruhi (masalan, “Batareya xizmati” yoki “Yurak urishi xizmati”). Xarakteristika (Characteristic) — ma'lum turdagi ma'lumot birligi: joriy zaryad darajasi, sensor ko'rsatkichlari, kalit holati. Har bir xarakteristika qiymatga (value) va metama'lumotlarni tavsiflovchi bir yoki bir nechta deskriptorga (Descriptors) ega: o'lchov birliklari, bildirishnoma sozlamalari, qiymat diapazoni. UUID (Universally Unique Identifier) har bir xizmatni va har bir xarakteristikani noyob tarzda identifikatsiya qiladi.

Xarakteristikalar bilan operatsiya turlari

GATT xarakteristikalar bilan o'zaro aloqa qilishning to'rt turini qo'llab-quvvatlaydi. Read — klient serverdan xarakteristikaning joriy qiymatini so'raydi. Write — klient serverga yangi qiymat yuboradi. Notify — server tasdiqsiz qiymatni klientga yuboradi (tezroq, ammo kamroq ishonchli). Indicate — server qabulni tasdiqlash bilan qiymat yuboradi (ishonchliroq, ammo sekinroq). Dasturchi stsenariyga qarab turni tanlaydi: puls sensori ko'rsatkichlari uchun Notify yetarli, aqlli qulf konfiguratsiyasini yozish uchun — tasdiq bilan Write.

kotlin
// Android kodida GATT ma'lumotlar tuzilmasi
data class BleService(
    val uuid: UUID,
    val characteristics: List<BleCharacteristic>
)

data class BleCharacteristic(
    val uuid: UUID,
    val properties: Int, // O'QISH, YOZISH, BILDIRISH, KO'RSATISH
    val descriptors: List<BleDescriptor>,
    var value: ByteArray?
)

GATT va GAP: BLE profillarining farqlari

BLE spetsifikatsiyasida ikkita asosiy profil belgilangan: GAP (Generic Access Profile) va GATT (Generic Attribute Profile). GAP qurilmalarni aniqlash, ulanishni o'rnatish va ko'rinishni boshqarish uchun javobgardir — bu BLEning “tarmoq qatlami”. GATT — ulanish o'rnatilgandan keyin ma'lumot almashish uchun, ya'ni “ilova qatlami”. Dasturchi GAPdan qurilmani skanerlash va ulanish uchun, GATTdan esa ulangan qurilmadan ma'lumot o'qish, yozish va bildirishnomalar olish uchun foydalanadi.

XususiyatGAPGATT
MaqsadAniqlash va ulanishMa'lumot almashish
RollarCentral / PeripheralClient / Server
ProtokolHCI, Link LayerATT (Attribute Protocol)
BosqichUlanishdan oldinUlanishdan keyin
Asosiy sinfBluetoothAdapterBluetoothGatt

GATT rollari

GATT ikkita rolni belgilaydi: GATT Server va GATT Client. Server — ma'lumot taqdim etadigan qurilma (masalan, puls ko'rsatkichlarini uzatuvchi fitnes kuzatuvchi). Klient — ma'lumot so'raydigan qurilma (masalan, o'lchovlarni o'qiyotgan smartfon). Aksariyat stsenariylarda Android ilovasi GATT Client, BLE periferiyasi esa GATT Server rolini o'ynaydi. Biroq, Android ham GATT Server bo'lishi mumkin — masalan, ilova boshqa qurilmalar uchun BLE qurilmasini emulyatsiya qilsa. Rol GATT ulanishini o'rnatish bosqichida aniqlanadi va sessiya davomida o'zgarmaydi.

GATT kommunikatsiyasi BLEda qanday ishlaydi

GATT kommunikatsiyasi jarayoni qurilmalar o'rtasida BLE ulanishi o'rnatilgandan keyin boshlanadi. Avval GATT Client Service Discovery operatsiyasi orqali GATT Serverda xizmatlarni aniqlaydi — Android buni BluetoothGatt.discoverServices() orqali ulanishda avtomatik bajaradi. Aniqlashdan so'ng klient mavjud xizmatlar, xarakteristikalar va deskriptorlar ro'yxatini oladi. Keyin klient xarakteristika qiymatlarini o'qishi (Read), yangi qiymatlarni yozishi (Write) yoki bildirishnomalarga obuna bo'lishi mumkin (Set Notify/Indicate). GATT Server ulanish o'rnatilgandan keyin istalgan vaqtda klientga Notify/Indicate yuborishi mumkin.

MTU — maksimal paket hajmi

Odatiy bo'lib, BLEda bitta GATT paketining hajmi (MTU, Maximum Transmission Unit) 23 baytni tashkil qiladi, shundan 3 bayti ATT sarlavhasi va 20 bayti foydali ma'lumotdir. Ilova ko'proq ma'lumot uzatishi kerak bo'lsa (masalan, OTA proshivka yangilanishi), Androidda requestMtu() orqali MTUni 517 baytgacha oshirishni so'rash mumkin. Oshirilgan MTU bitta ma'lumot blokini uzatish uchun zarur bo'lgan paketlar sonini kamaytiradi — 50 kichik paket o'rniga 2 katta paket yuborish mumkin, bu energiya sarfini kamaytiradi va uzatishni tezlashtiradi. Maksimal MTU BLE versiyasiga va chip imkoniyatlariga bog'liq — Bluetooth 5.0 517 baytgacha, eski versiyalar esa 247 baytgacha qo'llab-quvvatlaydi.

kotlin
// Xarakteristika bildirishnomalariga obuna bo'ling
fun enableNotifications(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
    gatt.setCharacteristicNotification(characteristic, true)

    // CCCD ni faollashtiring (Client Characteristic Configuration Descriptor)
    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)
    }
}

Bildirishnomalarni qayta ishlash

Androidda GATT Serverdan bildirishnomalarni olish uchun BluetoothGattCallback.onCharacteristicChanged() kolbekni amalga oshirish kerak. Bu usulda ilova server har safar Notify yoki Indicate yuborganda xarakteristikaning yangilangan qiymatini oladi. Real vaqt rejimida ma'lumotlarni qayta ishlash uchun bufer va Kotlin korutinlaridan foydalaning — bu intensiv bildirishnomalar paytida (masalan, sekundiga 100+ puls ko'rsatkichi) UI oqimini bloklamaslikka imkon beradi. Indikatsiyalarda (Indicate) server tomonida albatta gatt.sendResponse() ni chaqiring — Android klientida bu avtomatik ishlanadi.

GATTni Androidda tatbiq etish

Androidda GATT bilan ishlash android.bluetooth paketi sinflari orqali amalga oshiriladi: BluetoothGatt (ulanish), BluetoothGattService (xizmat), BluetoothGattCharacteristic (xarakteristika) va BluetoothGattDescriptor (deskriptor). BLE qurilmasiga ulanish BluetoothDevice.connectGatt() chaqiruvi bilan boshlanadi — bu usul keyingi barcha operatsiyalar bajariladigan BluetoothGattni qaytaradi. Barcha GATT kolbeklari BluetoothGattCallback ga keladi — bu BluetoothGatt yaratilgan bir xil oqimda chaqiriladigan asinxron interfeysdir. Muhim: barcha GATT operatsiyalari ketma-ket bajarilishi kerak — bir BluetoothGattda bir nechta operatsiyani bir vaqtda chaqirish xatolarga olib keladi.

GATT ulanishining hayot aylanishi

GATT ulanishining hayot aylanishini to'g'ri boshqarish BLE ilovasining barqarorligi uchun juda muhimdir. connectGatt() chaqiruvidan so'ng ilova STATE_CONNECTED holati bilan onConnectionStateChange() kolbekini kutadi. Keyin tizim avtomatik ravishda Service Discovery ni ishga tushiradi, tugagandan so'ng onServicesDiscovered() chaqiriladi. Faqat shundan keyin o'qish, yozish va obuna bajarilishi mumkin. Ish tugagach, onDestroy() yoki onPause() ichida albatta gatt.close() ni chaqiring — yopilmagan GATT ulanishlari batareyani sarflaydi va Androidda bir xil qurilmaga qayta ulanishni bloklashi mumkin.

kotlin
// BLE qurilmasiga GATT orqali ulaning
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) }
    }
}

Standart GATT profillari va xizmatlari

Bluetooth SIG (Special Interest Group) o'zgarmas 16-bitli UUIDlar bilan o'nlab standart GATT profillari va xizmatlarini belgilaydi. Eng keng tarqalganlari: Battery Service xizmati (UUID 180F, Battery Level xarakteristikasi 2A19), Heart Rate xizmati (UUID 180D, Heart Rate Measurement xarakteristikasi 2A37), Device Information xizmati (UUID 180A, Manufacturer Name, Serial Number xarakteristikalari). Standart xizmatlardan foydalanish turli ishlab chiqaruvchilarning qurilmalari o'rtasida moslikni kafolatlaydi — Heart Rate xizmatiga ega har qanday fitnes bilaguzuk uni qo'llab-quvvatlaydigan har qanday Android ilovasi bilan ishlashi kerak.

Maxsus GATT xizmatlarini loyihalash

Agar standart xizmatlar vazifani qamrab olmasa, dasturchi 128-bitli UUIDlar bilan (maxsus UUID) o'zining GATT xizmatlarini yaratishi mumkin. Maxsus xizmatni loyihalashda: xarakteristikalarning mantiqiy guruhini aniqlash (masalan, “Qulfni boshqarish xizmati”), har bir xarakteristikaga to'g'ri xususiyatlarni belgilash (Read, Write, Notify), Characteristic Presentation Format deskriptori orqali ruxsat etilgan qiymatlar va o'lchov birliklarini aniqlash kerak. Murakkab protokollar uchun xizmatga Write xususiyatli Command xarakteristikasi va Notify bilan Status xarakteristikasini kiritish tavsiya etiladi — bu sanoat BLE ilovalarida qabul qilingan Command/Status namunasiga mos keladi.

kotlin
// Maxsus GATT xizmatini yarating (Android GATT Server sifatida)
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
}

Tez-tez so'raladigan savollar

BLEda GATT nima va u nima uchun kerak?

GATT (Generic Attribute Profile) — qurilmalar o'rtasida ma'lumot almashish tuzilmasini belgilaydigan Bluetooth Low Energy profilidir. Axborotga kirishni standartlashtirish uchun kerak: barcha BLE qurilmalari ma'lumotlarni xizmatlar va xarakteristikalar shaklida tashkil qiladi, bu har qanday klientga sensor ko'rsatkichlarini o'qish, qurilmalarni boshqarish va bildirishnomalar olish imkonini beradi.

GATT GAPdan qanday farq qiladi?

GAP BLE qurilmalarini aniqlash va ulanish uchun javobgardir (skanerlash, reklama, ulanishni o'rnatish). GATT — ulanishdan keyin ma'lumot almashish uchun (o'qish, yozish, bildirishnomalar). GAP ulanishdan oldin, GATT esa keyin ishlaydi. Ikkala profil BLE uchun majburiy, ammo turli funktsiyalarni bajaradi: GAP “tarmoq qatlami”, GATT “ilova qatlami”dir.

Qanday GATT xizmatlari va xarakteristikalari mavjud?

Standart xizmatlarga Battery Service (180F, zaryad darajasi), Heart Rate (180D, puls), Device Information (180A, qurilma ma'lumotlari) kiradi. Har bir xizmat 16-bitli UUIDlar bilan bir nechta xarakteristikani o'z ichiga oladi. Dasturchilar maxsus vazifalar uchun 128-bitli UUIDlar bilan maxsus xizmatlar yaratishi mumkin — masalan, aqlli qulfni boshqarish yoki fitnes kuzatuvchi ma'lumotlarini uzatish.

Androidda GATT qanday ishlaydi?

Androidda GATT BluetoothGatt (ulanish), BluetoothGattService (xizmat), BluetoothGattCharacteristic (xarakteristika) va BluetoothGattDescriptor (deskriptor) orqali amalga oshiriladi. Ulanish connectGatt() orqali bajariladi, shundan so'ng BluetoothGattCallback kolbekida hodisalar keladi: onConnectionStateChange, onServicesDiscovered, onCharacteristicChanged (bildirishnomalar uchun). Barcha GATT operatsiyalari ketma-ket bajarilishi kerak.

GATTda UUID nima?

UUID (Universally Unique Identifier) — GATTda xizmatni yoki xarakteristikani noyob tarzda aniqlaydigan 16-bitli yoki 128-bitli identifikator. Bluetooth SIG standart xizmatlari 16-bitli UUIDlardan foydalanadi (masalan, Heart Rate uchun 180D). Dasturchilarning maxsus xizmatlari — 128-bitli UUIDlar (masalan, 12345678-1234-5678-1234-56789abcdef0). UUID klientga GATT Serverda kerakli ma'lumotlarni topishga imkon beradi.

Xulosa

  • GATT — Attribute Protocol (ATT) asosida xizmatlar, xarakteristikalar va deskriptorlar ierarxiyasi orqali tuzilgan ma'lumot almashish uchun BLE profili
  • Ma'lumot ierarxiyasi — xizmat (mantiqiy guruh), xarakteristika (turli aniq qiymat), deskriptor (metama'lumotlar — birliklar, bildirishnoma sozlamalari)
  • GATT rollari — Server (ma'lumot taqdim etadi, odatda BLE periferiyasi) va Client (o'qiydi/yozadi, odatda Android smartfon)
  • Operatsiyalar — Read, Write, Notify (tasdiqsiz, tezroq) va Indicate (tasdiq bilan, ishonchliroq); tanlov stsenariyga bog'liq
  • Android API — BluetoothGatt, BluetoothGattCallback, BluetoothGattService, BluetoothGattCharacteristic; kolbeklar orqali ketma-ket asinxron chaqiruvlar
  • Standart profillar — Battery Service, Heart Rate, Device Information — turli ishlab chiqaruvchilar qurilmalari o'rtasida moslikni ta'minlaydi
  • Maxsus xizmatlar — noyob vazifalar uchun 128-bitli UUID; to'g'ri xususiyatlar bilan (Read, Write, Notify, Indicate) Command/Status namunasi bo'yicha loyihalanadi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing