GATT (Generic Attribute Profile) — Bluetooth Low Energy (BLE) profili, məlumat strukturu və BLE cihazları arasında məlumat mübadiləsi qaydalarını müəyyən edir. GATT Attribute Protocol (ATT) üzərində qurulub və məlumatları iyerarxiyada təşkil edir: xidmətlər (services), xarakteristikalar (characteristics) və deskriptorlar (descriptors). Bluetooth SIG (2025) məlumatlarına görə, GATT profili bütün BLE tətbiqlərinin 98%-də istifadə olunur — fitnes izləyicilərindən tutmuş ağıllı qıfıllar və tibbi sensorlara qədər.
Əsas məqamlar
GATT (Generic Attribute Profile) — iki BLE cihazının Attribute Protocol (ATT) vasitəsilə məlumat mübadiləsini müəyyən edən Bluetooth Low Energy (BLE) profilidir. GATT məlumat strukturunu standartlaşdırır: bütün məlumatlar “xidmət → xarakteristika → deskriptor” iyerarxiyasında təşkil olunur. Profil Bluetooth 4.0 spesifikasiyasında (2010) BLE ilə birlikdə təqdim edilib və o vaxtdan bəri enerjiyə qənaət edən Bluetooth cihazları üçün əsas məlumat ötürmə mexanizmi olaraq qalır. Klassik Bluetooth-dan fərqli olaraq, məlumatların serial port (SPP) vasitəsilə ötürüldüyü yerdə, GATT oxu, yazı və bildiriş əməliyyatları vasitəsilə məlumatlara strukturlaşdırılmış giriş təmin edir.
BLE stack bir neçə təbəqədən ibarətdir: Physical Layer (radio), Link Layer (əlaqə idarəetməsi), L2CAP (məntiqi kanal ötürmə), ATT (Attribute Protocol — atributlara giriş) və GATT (ATT əsasında profil). GATT tətbiq proqramçısının işlədiyi ən yuxarı təbəqədir. Aşağıdakı ATT əsas əməliyyatları təmin edir: atributların oxunması, yazılması, bildirilməsi və göstərilməsi. GATT isə semantika əlavə edir: xidmətin, xarakteristikanın nə olduğunu, onların necə qruplaşdırıldığını və oxu/yazı zamanı hansı qaydaların tətbiq olunduğunu müəyyən edir. Bluetooth Core Specification 5.4 (2023) məlumatlarına görə, GATT bir cihazda 65 535 atributa (xidmətlər + xarakteristikalar + deskriptorlar) qədər dəstəkləyir.
GATT iyerarxiyası üç səviyyədən ibarətdir. Xidmət (Service) — bir tapşırığı həll edən xarakteristikaların məntiqi qrupu (məsələn, “Batareya xidməti” və ya “Ürək döyüntüsü xidməti”). Xarakteristika (Characteristic) — məlum tipli məlumat vahidi: cari doldurma səviyyəsi, sensor göstəriciləri, açarın vəziyyəti. Hər bir xarakteristikanın dəyəri (value) və metadata təsvir edən bir və ya bir neçə deskriptoru (Descriptors) var: ölçü vahidləri, bildiriş parametrləri, dəyər diapazonu. UUID (Universally Unique Identifier) hər bir xidməti və hər bir xarakteristikanı unikal şəkildə identifikasiya edir.
GATT xarakteristikalarla qarşılıqlı əlaqə üçün dörd növ əməliyyat dəstəkləyir. Read — klient serverdən xarakteristikanın cari dəyərini tələb edir. Write — klient serverə yeni dəyər göndərir. Notify — server təsdiq olmadan dəyəri klientə göndərir (daha sürətli, lakin daha az etibarlı). Indicate — server qəbul təsdiqi ilə dəyər göndərir (daha etibarlı, lakin daha yavaş). Proqramçı ssenaridən asılı olaraq növü seçir: nəbzsensoru göstəriciləri üçün Notify kifayətdir, ağıllı qıfıl konfiqurasiyasını yazmaq üçün təsdiqlə Write.
// Android kodunda GATT məlumat strukturu
data class BleService(
val uuid: UUID,
val characteristics: List<BleCharacteristic>
)
data class BleCharacteristic(
val uuid: UUID,
val properties: Int, // OXU, YAZ, BİLDİR, GÖSTƏR
val descriptors: List<BleDescriptor>,
var value: ByteArray?
)
BLE spesifikasiyasında iki əsas profil müəyyən edilmişdir: GAP (Generic Access Profile) və GATT (Generic Attribute Profile). GAP cihazların aşkarlanması, əlaqənin qurulması və görünürlüyün idarə edilməsi üçün cavabdehdir — bu BLE-nin “şəbəkə təbəqəsi”dir. GATT — əlaqə qurulduqdan sonra məlumat mübadiləsi üçün, yəni “tətbiq təbəqəsi”. Proqramçı GAP-dan cihazı skan etmək və qoşulmaq üçün, GATT-dan isə qoşulmuş cihazdan məlumat oxumaq, yazmaq və bildiriş almaq üçün istifadə edir.
| Xüsusiyyət | GAP | GATT |
|---|---|---|
| Məqsəd | Aşkarlama və qoşulma | Məlumat mübadiləsi |
| Rollar | Central / Peripheral | Client / Server |
| Protokol | HCI, Link Layer | ATT (Attribute Protocol) |
| Mərhələ | Qoşulmadan əvvəl | Qoşulduqdan sonra |
| Əsas sinif | BluetoothAdapter | BluetoothGatt |
GATT iki rol müəyyən edir: GATT Server və GATT Client. Server — məlumat təqdim edən cihaz (məsələn, nəbzgöstəricilərini ötürən fitnes izləyicisi). Client — məlumat tələb edən cihaz (məsələn, göstəriciləri oxuyan smartfon). Əksər ssenarilərdə Android tətbiqi GATT Client, BLE periferiyası isə GATT Server rolunu oynayır. Lakin Android həm də GATT Server ola bilər — məsələn, tətbiq digər cihazlar üçün BLE cihazını emulyasiya edərsə. Rol GATT əlaqəsinin qurulması mərhələsində müəyyən edilir və sessiya ərzində dəyişmir.
GATT kommunikasiyası prosesi cihazlar arasında BLE əlaqəsi qurulduqdan sonra başlayır. Əvvəlcə GATT Client Service Discovery əməliyyatı vasitəsilə GATT Server-də xidmətləri aşkarlayır — Android bunu BluetoothGatt.discoverServices() vasitəsilə qoşulduqdan sonra avtomatik yerinə yetirir. Aşkarlamadan sonra klient mövcud xidmətlərin, xarakteristikaların və deskriptorların siyahısını alır. Sonra klient xarakteristika dəyərlərini oxuya (Read), yeni dəyərlər yaza (Write) və ya bildirişlərə abunə ola bilər (Set Notify/Indicate). GATT Server əlaqə qurulduqdan sonra istənilən vaxt klientə Notify/Indicate göndərə bilər.
Defolt olaraq BLE-də bir GATT paketinin ölçüsü (MTU, Maximum Transmission Unit) 23 baytdır, bunun 3 baytı ATT başlığı, 20 baytı isə faydalı məlumatdır. Tətbiq daha çox məlumat ötürməlidirsə (məsələn, OTA proşivka yeniləməsi), Android-də requestMtu() vasitəsilə MTU-nu 517 bayta qədər artırmaq tələb edilə bilər. Artırılmış MTU bir məlumat blokunu ötürmək üçün lazım olan paket sayını azaldır — 50 kiçik paket əvəzinə 2 böyük paket göndərilə bilər, bu da enerji istehlakını azaldır və ötürməni sürətləndirir. Maksimum MTU BLE versiyasından və çipin imkanlarından asılıdır — Bluetooth 5.0 517 bayta qədər, köhnə versiyalar isə 247 bayta qədər dəstəkləyir.
// Xarakteristika bildirişlərinə abunə ol
fun enableNotifications(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
gatt.setCharacteristicNotification(characteristic, true)
// CCCD-ni aktivləşdir (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)
}
}
Android-də GATT Server-dən bildiriş almaq üçün BluetoothGattCallback.onCharacteristicChanged() callback-ni tətbiq etmək lazımdır. Bu metoddakı tətbiq server hər dəfə Notify və ya Indicate göndərdikdə xarakteristikanın yenilənmiş dəyərini alır. Real vaxt rejimində məlumatların işlənməsi üçün bufer və Kotlin korutinlərindən istifadə edin — bu, intensiv bildirişlər zamanı (məsələn, saniyədə 100+ nəbz göstəricisi) UI thread-ni bloklamamağa imkan verir. İndikasiyalarda (Indicate) server tərəfində mütləq gatt.sendResponse() çağırın — Android client-də bu avtomatik işlənir.
Android-də GATT ilə iş android.bluetooth paketinin sinifləri vasitəsilə həyata keçirilir: BluetoothGatt (əlaqə), BluetoothGattService (xidmət), BluetoothGattCharacteristic (xarakteristika) və BluetoothGattDescriptor (deskriptor). BLE cihazına qoşulma BluetoothDevice.connectGatt() çağırışı ilə başlayır — bu metod bütün sonrakı əməliyyatların yerinə yetirildiyi BluetoothGatt qaytarır. Bütün GATT callback-lər BluetoothGattCallback-də gəlir — bu, BluetoothGatt-ın yaradıldığı eyni thread-də çağırılan asinxron interfeysdir. Vacibdir: bütün GATT əməliyyatları ardıcıl yerinə yetirilməlidir — eyni BluetoothGatt-da bir neçə əməliyyatın eyni vaxtda çağırılması səhvlərə səbəb olur.
GATT əlaqəsinin həyat dövrünün düzgün idarə edilməsi BLE tətbiqinin sabitliyi üçün kritikdir. connectGatt() çağırışından sonra tətbiq STATE_CONNECTED vəziyyəti ilə onConnectionStateChange() callback-ni gözləyir. Sonra sistem avtomatik olaraq Service Discovery-ni işə salır, tamamlandıqdan sonra onServicesDiscovered() çağırılır. Yalnız bundan sonra oxu, yazı və abunə yerinə yetirilə bilər. İş bitdikdən sonra mütləq onDestroy() və ya onPause() daxilində gatt.close() çağırın — bağlanmamış GATT əlaqələri batareyanı tükəndirir və Android-də eyni cihaza yenidən qoşulmanı bloklaya bilər.
// BLE cihazına GATT vasitəsilə qoşul
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) sabit 16-bit UUID-lərlə onlarla standart GATT profili və xidməti müəyyən edir. Ən çox yayılmışlar: Battery Service xidməti (UUID 180F, Battery Level xarakteristikası 2A19), Heart Rate xidməti (UUID 180D, Heart Rate Measurement xarakteristikası 2A37), Device Information xidməti (UUID 180A, Manufacturer Name, Serial Number xarakteristikaları). Standart xidmətlərdən istifadə müxtəlif istehsalçıların cihazları arasında uyğunluğu təmin edir — Heart Rate xidməti olan istənilən fitnes bilərziyi onu dəstəkləyən istənilən Android tətbiqi ilə işləməlidir.
Standart xidmətlər tapşırığı əhatə etmirsə, proqramçı 128-bit UUID ilə (fərdi UUID) öz GATT xidmətlərini yarada bilər. Fərdi xidmət layihələndirilərkən: xarakteristikaların məntiqi qrupunu müəyyən etmək (məsələn, “Qıfıl idarəetmə xidməti”), hər bir xarakteristikaya düzgün xüsusiyyətlər təyin etmək (Read, Write, Notify), Characteristic Presentation Format deskriptoru vasitəsilə icazə verilən dəyərləri və ölçü vahidlərini müəyyən etmək lazımdır. Mürəkkəb protokollar üçün xidmətə Write xüsusiyyətli Command xarakteristikası və Notify ilə Status xarakteristikası daxil etmək tövsiyə olunur — bu, sənaye BLE tətbiqlərində qəbul edilmiş Command/Status nümunəsinə uyğundur.
// Fərdi GATT xidməti yarat (Android GATT Server kimi)
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 verilən suallar
GATT (Generic Attribute Profile) — cihazlar arasında məlumat mübadiləsi strukturunu müəyyən edən Bluetooth Low Energy profilidir. Məlumata girişi standartlaşdırmaq üçün lazımdır: bütün BLE cihazları məlumatları xidmətlər və xarakteristikalar şəklində təşkil edir ki, bu da istənilən klientə sensor göstəricilərini oxumağa, cihazları idarə etməyə və bildirişlər almağa imkan verir.
GAP BLE cihazlarının aşkarlanması və qoşulması üçün cavabdehdir (skan etmə, reklam, əlaqənin qurulması). GATT — qoşulduqdan sonra məlumat mübadiləsi üçün (oxu, yazı, bildirişlər). GAP qoşulmadan əvvəl, GATT isə sonra işləyir. Hər iki profil BLE üçün məcburidir, lakin müxtəlif funksiyaları yerinə yetirir: GAP “şəbəkə təbəqəsi”, GATT isə “tətbiq təbəqəsi”dir.
Standart xidmətlərə Battery Service (180F, doldurma səviyyəsi), Heart Rate (180D, nəbz), Device Information (180A, cihaz məlumatları) daxildir. Hər bir xidmət 16-bit UUID ilə bir neçə xarakteristika ehtiva edir. Proqramçılar spesifik tapşırıqlar üçün 128-bit UUID ilə fərdi xidmətlər yarada bilərlər — məsələn, ağıllı qıfılı idarə etmək və ya fitnes izləyicisi məlumatlarını ötürmək.
Android-də GATT BluetoothGatt (əlaqə), BluetoothGattService (xidmət), BluetoothGattCharacteristic (xarakteristika) və BluetoothGattDescriptor (deskriptor) vasitəsilə tətbiq olunur. Qoşulma connectGatt() vasitəsilə yerinə yetirilir, bundan sonra BluetoothGattCallback callback-də hadisələr gəlir: onConnectionStateChange, onServicesDiscovered, onCharacteristicChanged (bildirişlər üçün). Bütün GATT əməliyyatları ardıcıl yerinə yetirilməlidir.
UUID (Universally Unique Identifier) — GATT-də xidməti və ya xarakteristikanı unikal şəkildə müəyyən edən 16-bit və ya 128-bit identifikatordur. Bluetooth SIG standart xidmətləri 16-bit UUID-lərdən istifadə edir (məsələn, Heart Rate üçün 180D). Proqramçıların fərdi xidmətləri — 128-bit UUID-lər (məsələn, 12345678-1234-5678-1234-56789abcdef0). UUID klientə GATT Server-də lazımi məlumatları tapmağa imkan verir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun