GATT (Generic Attribute Profile) एक Bluetooth Low Energy (BLE) प्रोफ़ाइल है जो डेटा संरचना और BLE उपकरणों के बीच सूचना आदान-प्रदान के नियमों को परिभाषित करती है। GATT Attribute Protocol (ATT) के ऊपर बनाया गया है और डेटा को एक पदानुक्रम में व्यवस्थित करता है: सेवाएँ (services), विशेषताएँ (characteristics) और डिस्क्रिप्टर (descriptors)। Bluetooth SIG (2025) के अनुसार, GATT प्रोफ़ाइल का उपयोग सभी BLE अनुप्रयोगों में 98% में किया जाता है — फिटनेस ट्रैकर्स से लेकर स्मार्ट लॉक और मेडिकल सेंसर तक।
मुख्य बिंदु
GATT (Generic Attribute Profile) एक Bluetooth Low Energy (BLE) प्रोफ़ाइल है जो परिभाषित करती है कि दो BLE उपकरण Attribute Protocol (ATT) के माध्यम से डेटा का आदान-प्रदान कैसे करते हैं। GATT डेटा संरचना को मानकीकृत करता है: सभी डेटा “सेवा → विशेषता → डिस्क्रिप्टर” पदानुक्रम में व्यवस्थित होता है। यह प्रोफ़ाइल Bluetooth 4.0 विनिर्देश (2010) में BLE के साथ पेश की गई थी और तब से ऊर्जा-कुशल Bluetooth उपकरणों के लिए डेटा स्थानांतरण का प्राथमिक तंत्र बनी हुई है। क्लासिक Bluetooth के विपरीत, जहाँ डेटा एक सीरियल पोर्ट (SPP) के माध्यम से प्रेषित होता है, GATT पढ़ने, लिखने और सूचना संचालन के माध्यम से डेटा तक संरचित पहुँच प्रदान करता है।
BLE स्टैक में कई परतें होती हैं: भौतिक परत (रेडियो), लिंक परत (कनेक्शन प्रबंधन), L2CAP (तार्किक चैनल नियंत्रण), ATT (Attribute Protocol — विशेषताओं तक पहुँच) और GATT (ATT पर आधारित प्रोफ़ाइल)। GATT सबसे ऊपरी परत है जिसके साथ एप्लिकेशन डेवलपर काम करते हैं। अंतर्निहित ATT बुनियादी संचालन प्रदान करता है: विशेषताओं को पढ़ना, लिखना, सूचित करना और संकेत देना। GATT शब्दार्थ जोड़ता है: यह परिभाषित करता है कि सेवा और विशेषता क्या हैं, वे कैसे समूहित होते हैं, और उन्हें पढ़ने और लिखने पर कौन से नियम लागू होते हैं। Bluetooth Core Specification 5.4 (2023) के अनुसार, GATT एक उपकरण पर 65,535 विशेषताओं (सेवाएँ + विशेषताएँ + डिस्क्रिप्टर) तक का समर्थन करता है।
GATT पदानुक्रम में तीन स्तर होते हैं। सेवा (Service) विशेषताओं का एक तार्किक समूह है जो एक कार्य को हल करती है (उदाहरण के लिए, “बैटरी सेवा” या “हृदय गति सेवा”)। विशेषता (Characteristic) एक ज्ञात प्रकार वाली डेटा इकाई है: वर्तमान बैटरी स्तर, सेंसर रीडिंग, स्विच की स्थिति। प्रत्येक विशेषता का एक मान (value) और एक या अधिक डिस्क्रिप्टर (Descriptors) होते हैं जो मेटाडेटा का वर्णन करते हैं: माप की इकाइयाँ, सूचना सेटिंग्स, मानों की सीमा। UUID (यूनिवर्सली यूनीक आइडेंटिफ़ायर) प्रत्येक सेवा और प्रत्येक विशेषता की विशिष्ट रूप से पहचान करता है।
GATT विशेषताओं के साथ बातचीत के लिए चार प्रकार के संचालन का समर्थन करता है। Read — क्लाइंट सर्वर से विशेषता का वर्तमान मान अनुरोध करता है। Write — क्लाइंट सर्वर को एक नया मान भेजता है। Notify — सर्वर बिना पुष्टि के क्लाइंट को मान भेजता है (तेज़ लेकिन कम विश्वसनीय)। Indicate — सर्वर प्राप्ति की पुष्टि के साथ मान भेजता है (अधिक विश्वसनीय लेकिन धीमा)। डेवलपर परिदृश्य के आधार पर प्रकार चुनता है: हृदय गति सेंसर रीडिंग के लिए Notify पर्याप्त है; स्मार्ट लॉक कॉन्फ़िगरेशन लिखने के लिए पुष्टि के साथ Write की आवश्यकता होती है।
// Android कोड में GATT डेटा संरचना
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?
)
BLE विनिर्देश दो मुख्य प्रोफ़ाइल परिभाषित करता है: GAP (Generic Access Profile) और GATT (Generic Attribute Profile)। GAP उपकरणों की खोज, कनेक्शन स्थापना और दृश्यता प्रबंधन के लिए जिम्मेदार है — यह BLE की “नेटवर्क परत” है। GATT कनेक्शन स्थापित होने के बाद डेटा आदान-प्रदान के लिए जिम्मेदार है — “एप्लिकेशन परत”। डेवलपर स्कैन करने और डिवाइस से कनेक्ट करने के लिए GAP का उपयोग करता है, और कनेक्टेड डिवाइस से डेटा पढ़ने, लिखने और सूचनाएँ प्राप्त करने के लिए GATT का उपयोग करता है।
| विशेषता | GAP | GATT |
|---|---|---|
| उद्देश्य | खोज और कनेक्शन | डेटा आदान-प्रदान |
| भूमिकाएँ | केंद्रीय / परिधीय | क्लाइंट / सर्वर |
| प्रोटोकॉल | HCI, लिंक परत | ATT (Attribute Protocol) |
| चरण | कनेक्शन से पहले | कनेक्शन के बाद |
| मुख्य वर्ग | BluetoothAdapter | BluetoothGatt |
GATT दो भूमिकाएँ परिभाषित करता है: GATT सर्वर और GATT क्लाइंट। सर्वर एक ऐसा उपकरण है जो डेटा प्रदान करता है (उदाहरण के लिए, एक फिटनेस ट्रैकर जो हृदय गति रीडिंग भेजता है)। क्लाइंट एक ऐसा उपकरण है जो डेटा का अनुरोध करता है (उदाहरण के लिए, एक स्मार्टफ़ोन जो रीडिंग पढ़ता है)। अधिकांश परिदृश्यों में, Android ऐप GATT क्लाइंट के रूप में कार्य करता है, और BLE परिधीय GATT सर्वर के रूप में कार्य करता है। हालाँकि, Android GATT सर्वर भी हो सकता है — उदाहरण के लिए, जब कोई ऐप अन्य उपकरणों के लिए BLE डिवाइस का अनुकरण करता है। भूमिका GATT कनेक्शन सेटअप चरण में निर्धारित की जाती है और सत्र के दौरान नहीं बदलती है।
GATT संचार प्रक्रिया उपकरणों के बीच BLE कनेक्शन स्थापित होने के बाद शुरू होती है। पहले, GATT क्लाइंट सेवा खोज (Service Discovery) के माध्यम से GATT सर्वर पर सेवाओं का पता लगाता है — Android कनेक्ट होने पर BluetoothGatt.discoverServices() के माध्यम से स्वचालित रूप से ऐसा करता है। खोज के बाद, क्लाइंट को उपलब्ध सेवाओं, विशेषताओं और डिस्क्रिप्टर की एक सूची मिलती है। फिर क्लाइंट विशेषता मान पढ़ सकता है (Read), नए मान लिख सकता है (Write), या सूचनाओं की सदस्यता ले सकता है (Set Notify/Indicate)। GATT सर्वर कनेक्शन स्थापित होने के बाद किसी भी समय क्लाइंट को Notify/Indicate भेज सकता है।
डिफ़ॉल्ट रूप से, BLE में एकल GATT पैकेट (MTU) का आकार 23 बाइट है, जिसमें से 3 बाइट ATT हेडर और 20 बाइट पेलोड हैं। यदि एप्लिकेशन को अधिक डेटा संचारित करने की आवश्यकता है (उदाहरण के लिए, OTA फ़र्मवेयर अपडेट), तो Android में requestMtu() के माध्यम से MTU को 517 बाइट तक बढ़ाया जा सकता है। बढ़ा हुआ MTU एक डेटा ब्लॉक को संचारित करने के लिए आवश्यक पैकेटों की संख्या को कम करता है — 50 छोटे पैकेटों के बजाय, आप 2 बड़े पैकेट भेज सकते हैं, जिससे बिजली की खपत कम होती है और संचरण गति बढ़ती है। अधिकतम MTU BLE संस्करण और चिप की क्षमताओं पर निर्भर करता है — Bluetooth 5.0 517 बाइट तक का समर्थन करता है, पुराने संस्करण 247 बाइट तक।
// विशेषता सूचनाओं की सदस्यता लें
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)
}
}
Android पर GATT सर्वर से सूचनाएँ प्राप्त करने के लिए, आपको BluetoothGattCallback.onCharacteristicChanged() कॉलबैक लागू करना होगा। इस विधि में, ऐप हर बार जब सर्वर Notify या Indicate भेजता है, तो अद्यतन विशेषता मान प्राप्त करता है। रीयल-टाइम डेटा प्रोसेसिंग के लिए, बफ़र और Kotlin कोरूटीन का उपयोग करें — यह गहन सूचनाओं (उदाहरण के लिए, प्रति सेकंड 100+ हृदय गति रीडिंग) के दौरान UI थ्रेड को ब्लॉक होने से रोकता है। इंडिकेशन (Indicate) के लिए, आपको सर्वर पक्ष पर gatt.sendResponse() को कॉल करना होगा — Android क्लाइंट पर, यह स्वचालित रूप से संभाला जाता है।
Android पर, GATT के साथ काम android.bluetooth पैकेज के क्लास के माध्यम से लागू किया जाता है: BluetoothGatt (कनेक्शन), BluetoothGattService (सेवा), BluetoothGattCharacteristic (विशेषता), और BluetoothGattDescriptor (डिस्क्रिप्टर)। BLE डिवाइस से कनेक्शन BluetoothDevice.connectGatt() को कॉल करके शुरू होता है — यह विधि एक BluetoothGatt लौटाती है जिसके माध्यम से सभी आगे के संचालन किए जाते हैं। सभी GATT कॉलबैक BluetoothGattCallback में आते हैं — यह एक अतुल्यकालिक इंटरफ़ेस है जो उसी थ्रेड पर कॉल किया जाता है जहाँ BluetoothGatt बनाया गया था। महत्वपूर्ण: सभी GATT संचालन क्रमिक रूप से किए जाने चाहिए — एक ही BluetoothGatt पर एक साथ कई संचालन कॉल करने से त्रुटियाँ होती हैं।
GATT कनेक्शन जीवनचक्र का उचित प्रबंधन BLE ऐप स्थिरता के लिए महत्वपूर्ण है। connectGatt() को कॉल करने के बाद, ऐप STATE_CONNECTED स्थिति के साथ onConnectionStateChange() कॉलबैक की प्रतीक्षा करता है। फिर सिस्टम स्वचालित रूप से Service Discovery शुरू करता है, जिसके पूरा होने पर onServicesDiscovered() कॉल किया जाता है। इसके बाद ही आप पढ़ना, लिखना और सदस्यता ले सकते हैं। समाप्त होने पर, हमेशा onDestroy() या onPause() में gatt.close() कॉल करें — बंद न किए गए GATT कनेक्शन बैटरी खत्म करते हैं और Android पर उसी डिवाइस से पुनः कनेक्शन को अवरुद्ध कर सकते हैं।
// GATT के माध्यम से BLE डिवाइस से कनेक्ट करें
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 दर्जनों मानक GATT प्रोफ़ाइल और सेवाओं को निश्चित 16-बिट UUID के साथ परिभाषित करता है। सबसे आम हैं: 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 ऐप के साथ काम करना चाहिए जो इसका समर्थन करता है।
यदि मानक सेवाएँ कार्य को कवर नहीं करती हैं, तो डेवलपर 128-बिट UUID के साथ कस्टम GATT सेवाएँ बना सकता है। कस्टम सेवा डिज़ाइन करते समय, आपको चाहिए: विशेषताओं का एक तार्किक समूह परिभाषित करें (उदाहरण के लिए, “लॉक नियंत्रण सेवा”), प्रत्येक विशेषता को सही गुण (Read, Write, Notify) निर्दिष्ट करें, Characteristic Presentation Format डिस्क्रिप्टर के माध्यम से अनुमत मान और माप की इकाइयाँ परिभाषित करें। जटिल प्रोटोकॉल के लिए, Write गुण के साथ Command विशेषता और Notify के साथ Status विशेषता शामिल करने की अनुशंसा की जाती है — यह औद्योगिक BLE अनुप्रयोगों में अपनाए गए Command/Status पैटर्न का अनुसरण करता है।
// कस्टम GATT सेवा बनाएँ (GATT सर्वर के रूप में Android)
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 (Generic Attribute Profile) एक Bluetooth Low Energy प्रोफ़ाइल है जो उपकरणों के बीच डेटा आदान-प्रदान संरचना को परिभाषित करती है। इसकी आवश्यकता सूचना तक पहुँच को मानकीकृत करने के लिए है: सभी BLE उपकरण डेटा को सेवाओं और विशेषताओं में व्यवस्थित करते हैं, जिससे कोई भी क्लाइंट सेंसर रीडिंग पढ़ सकता है, उपकरणों को नियंत्रित कर सकता है और सूचनाएँ प्राप्त कर सकता है।
GAP BLE उपकरणों की खोज और कनेक्शन (स्कैनिंग, विज्ञापन, कनेक्शन सेटअप) के लिए जिम्मेदार है। GATT कनेक्शन के बाद डेटा आदान-प्रदान (पढ़ना, लिखना, सूचनाएँ) के लिए जिम्मेदार है। GAP कनेक्शन से पहले काम करता है, GATT बाद में। दोनों प्रोफ़ाइल BLE के लिए अनिवार्य हैं, लेकिन अलग-अलग कार्य करते हैं: GAP “नेटवर्क परत” है, GATT “एप्लिकेशन परत” है।
मानक सेवाओं में Battery Service (180F, बैटरी स्तर), Heart Rate (180D, नाड़ी), Device Information (180A, डिवाइस डेटा) शामिल हैं। प्रत्येक सेवा में 16-बिट UUID के साथ कई विशेषताएँ होती हैं। डेवलपर विशिष्ट कार्यों के लिए 128-बिट UUID के साथ कस्टम सेवाएँ बना सकते हैं — जैसे स्मार्ट लॉक नियंत्रण या फिटनेस ट्रैकर डेटा ट्रांसमिशन।
Android पर, GATT को BluetoothGatt (कनेक्शन), BluetoothGattService (सेवा), BluetoothGattCharacteristic (विशेषता), और BluetoothGattDescriptor (डिस्क्रिप्टर) के माध्यम से लागू किया जाता है। कनेक्शन connectGatt() के माध्यम से किया जाता है, जिसके बाद BluetoothGattCallback के माध्यम से ईवेंट आते हैं: onConnectionStateChange, onServicesDiscovered, onCharacteristicChanged (सूचनाओं के लिए)। सभी GATT संचालन क्रमिक रूप से किए जाने चाहिए।
UUID (यूनिवर्सली यूनीक आइडेंटिफ़ायर) एक 16-बिट या 128-बिट पहचानकर्ता है जो GATT में किसी सेवा या विशेषता की विशिष्ट रूप से पहचान करता है। मानक Bluetooth SIG सेवाएँ 16-बिट UUID का उपयोग करती हैं (उदाहरण के लिए, Heart Rate के लिए 180D)। डेवलपर की कस्टम सेवाएँ 128-बिट UUID का उपयोग करती हैं (उदाहरण के लिए, 12345678-1234-5678-1234-56789abcdef0)। UUID क्लाइंट को GATT सर्वर पर आवश्यक डेटा खोजने की अनुमति देता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें