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 (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.
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 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.
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.
// 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?
)
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.
| Xususiyat | GAP | GATT |
|---|---|---|
| Maqsad | Aniqlash va ulanish | Ma'lumot almashish |
| Rollar | Central / Peripheral | Client / Server |
| Protokol | HCI, Link Layer | ATT (Attribute Protocol) |
| Bosqich | Ulanishdan oldin | Ulanishdan keyin |
| Asosiy sinf | BluetoothAdapter | BluetoothGatt |
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 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.
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.
// 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)
}
}
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.
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 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.
// 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) }
}
}
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.
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.
// 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
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.
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.
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 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.
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
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.
Shuningdek o'qing