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 ক্লায়েন্ট সার্ভিস ডিসকভারির মাধ্যমে 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 থ্রেড ব্লক করা প্রতিরোধ করে। ইন্ডিকেশনের জন্য, আপনাকে সার্ভার পক্ষে 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন