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 ڈیٹا کی ساخت کو معیاری بناتا ہے: تمام ڈیٹا «خدمت → خصوصیت → واصف» کے درجہ بندی میں ترتیب دیا جاتا ہے۔ یہ پروفائل BLE کے ساتھ Bluetooth 4.0 تصریح (2010) میں متعارف کرایا گیا تھا اور اس کے بعد سے توانائی کی بچت کرنے والے Bluetooth آلات کے لیے ڈیٹا کی منتقلی کا بنیادی طریقہ کار بنا ہوا ہے۔ کلاسک Bluetooth کے برعکس، جہاں ڈیٹا سیریل پورٹ (SPP) کے ذریعے منتقل کیا جاتا ہے، GATT پڑھنے، لکھنے اور اطلاع کے عمل کے ذریعے ڈیٹا تک ساختی رسائی فراہم کرتا ہے۔
BLE اسٹیک کئی تہوں پر مشتمل ہے: طبعی تہ (ریڈیو)، ربط تہ (کنیکشن مینجمنٹ)، L2CAP (منطقی چینل کنٹرول)، ATT (Attribute Protocol — صفات تک رسائی) اور GATT (ATT پر مبنی پروفائل)۔ GATT سب سے اوپر کی تہہ ہے جس کے ساتھ ایپلیکیشن ڈویلپر کام کرتے ہیں۔ نیچے کا ATT بنیادی کارروائیاں فراہم کرتا ہے: صفات کو پڑھنا، لکھنا، اطلاع دینا اور اشارہ کرنا۔ GATT معنی شامل کرتا ہے: یہ طے کرتا ہے کہ خدمت اور خصوصیت کیا ہیں، وہ کیسے گروپ کی جاتی ہیں، اور انہیں پڑھنے اور لکھنے پر کون سے قوانین لاگو ہوتے ہیں۔ Bluetooth Core Specification 5.4 (2023) کے مطابق، GATT ایک آلے پر 65,535 تک صفات (خدمات + خصوصیات + وضافت) کو سپورٹ کرتا ہے۔
GATT درجہ بندی تین سطحوں پر مشتمل ہے۔ خدمت خصوصیات کا ایک منطقی گروپ ہے جو ایک کام حل کرتی ہے (مثال کے طور پر، «بیٹری سروس» یا «دل کی دھڑکن کی سروس»)۔ خصوصیت ایک معروف قسم کے ساتھ ڈیٹا کی اکائی ہے: موجودہ بیٹری کی سطح، سینسر ریڈنگ، سوئچ کی حالت۔ ہر خصوصیت کی ایک قدر ہوتی ہے اور ایک یا زیادہ وضافت جو میٹا ڈیٹا بیان کرتے ہیں: پیمائش کی اکائیاں، اطلاع کی ترتیبات، قدروں کی حد۔ 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 کلائنٹ سروس ڈسکوری کے ذریعے 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 coroutines استعمال کریں — یہ شدید اطلاعات کے دوران (مثال کے طور پر، فی سیکنڈ 100+ دل کی دھڑکن کی ریڈنگ) UI تھریڈ کو مسدود ہونے سے روکتا ہے۔ Indication کے لیے، آپ کو سرور کی طرف 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() کال بیک کا انتظار کرتی ہے۔ پھر سسٹم خود بخود سروس ڈسکوری شروع کرتا ہے، جس کے مکمل ہونے پر 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں