BluetoothGatt — यह क्या है, विधियाँ और Android में GATT BLE प्रोटोकॉल

लेखक: IT Sectr प्रकाशित: 2026-07-16 पढ़ने का समय: 10 मिनट

BluetoothGatt — एक Android क्लास है जो BLE कनेक्शन पर GATT (Generic Attribute Profile) क्लाइंट संचालन के लिए API प्रदान करता है। BluetoothGatt एक रिमोट GATT सर्वर (परिधीय BLE डिवाइस) से कनेक्शन को एनकैप्सुलेट करता है और सभी प्रोफ़ाइल संचालन प्रबंधित करता है: सेवाओं की खोज, विशेषताओं को पढ़ना और लिखना, सूचनाओं और संकेतों की सदस्यता लेना। BluetoothGatt का इंस्टेंस BluetoothDevice.connectGatt() के माध्यम से BluetoothGattCallback के साथ प्राप्त किया जाता है। Android Developers, 2026 के अनुसार, BluetoothGatt द्विदिश BLE संचार के लिए केंद्रीय क्लास है, जो BLE 4.0 से BLE 5.4 तक GATT संचालन का समर्थन करता है।

मुख्य बातें

  • BluetoothGatt — GATT क्लाइंट के लिए Android क्लास जो परिधीय डिवाइस के साथ BLE कनेक्शन प्रबंधित करता है
  • connectGatt() — BluetoothGatt बनाने के लिए BluetoothDevice विधि; यह कॉन्टेक्स्ट, autoConnect, callback और ट्रांसपोर्ट स्वीकार करता है
  • discoverServices() — GATT पदानुक्रम प्राप्त करने के लिए विधि: सेवाएँ (BluetoothGattService), विशेषताएँ (BluetoothGattCharacteristic)
  • readCharacteristic/writeCharacteristic — BluetoothGattCallback के माध्यम से एसिंक्रोनस परिणाम के साथ पढ़ने और लिखने की विधियाँ
  • setCharacteristicNotification — अनिवार्य CCCD डिस्क्रिप्टर लेखन के साथ BLE सूचनाओं की सदस्यता लेने की विधि

BluetoothGatt क्या है: सार और कनेक्शन निर्माण

BluetoothGatt — एक प्रॉक्सी ऑब्जेक्ट है जो Android डिवाइस (केंद्रीय) और BLE परिधीय (सर्वर) के बीच GATT कनेक्शन का प्रतिनिधित्व करता है। प्रत्येक BluetoothGatt इंस्टेंस एक सक्रिय BLE कनेक्शन से मेल खाता है। सभी GATT प्रोफ़ाइल संचालन इसके माध्यम से किए जाते हैं: खोज, पढ़ना, लिखना, सूचनाएँ। BluetoothGatt सीधे नहीं बनाया जाता — यह BluetoothDevice.connectGatt() विधि द्वारा लौटाया जाता है।

BluetoothGatt बनाने के लिए चार पैरामीटर आवश्यक हैं। Context — एप्लिकेशन का कॉन्टेक्स्ट (Activity या Application)। autoConnect — यदि false है, Android तुरंत सीधा कनेक्शन शुरू करता है; यदि true है, Android डिवाइस का पता चलने पर स्वचालित रूप से कनेक्ट होता है (पृष्ठभूमि कनेक्शन के लिए उपयोगी)। BluetoothGattCallback — सभी GATT घटनाओं के लिए अनिवार्य कॉलबैक। transport — BluetoothDevice.TRANSPORT_LE (BLE) या TRANSPORT_BREDR (Classic)। BLE डिवाइसों पर हमेशा TRANSPORT_LE का उपयोग करें।

BluetoothGatt जीवनचक्र पाँच अवस्थाओं से बना है। DISCONNECTED — प्रारंभिक अवस्था। CONNECTING — connectGatt कॉल करने के बाद, पुष्टि से पहले। CONNECTED — STATE_CONNECTED के साथ onConnectionStateChange के बाद। कनेक्शन के बाद GATT पदानुक्रम प्राप्त करने के लिए discoverServices() कहा जाता है। काम पूरा होने के बाद — सिस्टम संसाधनों को मुक्त करने के लिए disconnect() और close()। close() कॉल किए बिना, एप्लिकेशन Android BLE कनेक्शन सीमा (आमतौर पर 4–8) समाप्त कर सकता है।

kotlin
// BluetoothGatt कनेक्शन बनाना
import android.bluetooth.*

class GattConnector(private val context: Context) {

    private var bluetoothGatt: BluetoothGatt? = null

    fun connect(device: BluetoothDevice): BluetoothGatt? {
        // यदि मौजूद है तो पिछला कनेक्शन बंद करें
        close()

        bluetoothGatt = device.connectGatt(
            context,
            false,  // autoConnect = false ( )
            object : BluetoothGattCallback() {
                override fun onConnectionStateChange(
                    gatt: BluetoothGatt, status: Int, newState: Int
                ) {
                    when (newState) {
                        BluetoothProfile.STATE_CONNECTED -> {
                            // 2. कनेक्शन स्थापित → खोज
                            gatt.discoverServices()
                        }
                        BluetoothProfile.STATE_DISCONNECTED -> {
                            // 3. कनेक्शन खो गया
                            close()
                        }
                    }
                }

                override fun onServicesDiscovered(
                    gatt: BluetoothGatt, status: Int
                ) {
                    if (status == BluetoothGatt.GATT_SUCCESS) {
                        // 4. GATT पदानुक्रम प्राप्त हुआ
                        onGattReady(gatt)
                    }
                }
            },
            BluetoothDevice.TRANSPORT_LE
        )
        return bluetoothGatt
    }

    private fun onGattReady(gatt: BluetoothGatt) {
        // GATT पढ़ने/लिखने के संचालन के लिए तैयार
    }

    fun close() {
        bluetoothGatt?.disconnect()
        bluetoothGatt?.close()
        bluetoothGatt = null
    }
}

GattConnector क्लास सही BluetoothGatt निर्माण प्रदर्शित करता है। autoConnect=false पैरामीटर का अर्थ सीधा कनेक्शन है (स्कैन किए गए डिवाइसों के लिए)। STATE_CONNECTED के साथ onConnectionStateChange पर, तुरंत discoverServices() कहा जाता है। onServicesDiscovered संकेत देता है कि GATT तैयार है। close() क्रमिक रूप से disconnect() और close() कहता है — close() के बिना सिस्टम संसाधन मुक्त नहीं होते, जिससे BLE कनेक्शन लीक होते हैं।

BluetoothGatt के माध्यम से सेवा और विशेषता खोज

discoverServices() — कनेक्शन के बाद बुलाई जाने वाली पहली GATT विधि है। यह BLE परिधीय पर सभी सेवाओं की एसिंक्रोनस खोज शुरू करती है। परिणाम onServicesDiscovered() में स्थिति कोड के साथ आता है: GATT_SUCCESS (0) — सफल, 133 — GATT_ERROR, 8 — GATT_CONNECTION_TIMEOUT। सफल खोज के बाद, BluetoothGatt getServices() के माध्यम से उपलब्ध सेवाओं की सूची भरता है।

प्रत्येक BluetoothGattService में BluetoothGattCharacteristic की सूची होती है। एक विशेषता में UUID, गुण (PROPERTY_READ, PROPERTY_WRITE, PROPERTY_NOTIFY) और वैकल्पिक डिस्क्रिप्टर होते हैं। गुण निर्धारित करते हैं कि कौन से संचालन अनुमत हैं: यदि किसी विशेषता में PROPERTY_READ नहीं है, तो readCharacteristic कॉल करने पर त्रुटि वापस आएगी। विशेषता डिस्क्रिप्टर प्राप्त करने के लिए getDescriptors() का उपयोग करें।

kotlin
// सेवा खोज और विशेषता खोज
class GattServiceExplorer {

    // UUID द्वारा सेवा खोजें
    fun findService(gatt: BluetoothGatt, uuid: UUID): BluetoothGattService? {
        return gatt.services?.firstOrNull { it.uuid == uuid }
    }

    // सेवा में विशेषता खोजें
    fun findCharacteristic(
        service: BluetoothGattService,
        uuid: UUID
    ): BluetoothGattCharacteristic? {
        return service.characteristics?.firstOrNull { it.uuid == uuid }
    }

    // सभी समर्थित विशेषता संचालन प्राप्त करें
    fun getCharacteristicProperties(chars: BluetoothGattCharacteristic): List<String> {
        val props = mutableListOf<String>()
        with(chars.properties) {
            if (and(BluetoothGattCharacteristic.PROPERTY_READ) != 0) props.add("READ")
            if (and(BluetoothGattCharacteristic.PROPERTY_WRITE) != 0) props.add("लिखें")
            if (and(BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) != 0) props.add("बिना_जवाब_लिखें")
            if (and(BluetoothGattCharacteristic.PROPERTY_NOTIFY) != 0) props.add("NOTIFY")
            if (and(BluetoothGattCharacteristic.PROPERTY_INDICATE) != 0) props.add("INDICATE")
        }
        return props
    }

    // पूरा GATT पदानुक्रम लॉग करें
    fun dumpGattTree(gatt: BluetoothGatt) {
        gatt.services?.forEach { service ->
            print("Service: ${service.uuid}")
            service.characteristics?.forEach { char ->
                print("  Characteristic: ${char.uuid}, properties: ${char.properties}")
                char.descriptors?.forEach { desc ->
                    print("    Descriptor: ${desc.uuid}")
                }
            }
        }
    }
}

GattServiceExplorer क्लास GATT पदानुक्रम में नेविगेशन के लिए उपयोगिताएँ प्रदान करता है। findService और findCharacteristic UUID द्वारा सेवाओं और विशेषताओं की खोज करते हैं। getCharacteristicProperties and() के माध्यम से गुणों की बिट मास्क जाँच करता है। dumpGattTree लॉग में पूरा पदानुक्रम प्रिंट करता है — BLE डिवाइसों को डीबग करते समय उपयोगी। BluetoothGatt पर सभी संचालन सफल onServicesDiscovered के बाद ही किए जाने चाहिए, अन्यथा getServices() खाली सूची लौटाएगा।

BLE विशेषताओं को पढ़ना: readCharacteristic और readDescriptor

readCharacteristic() — रिमोट BLE डिवाइस से विशेषता मान पढ़ने के लिए BluetoothGatt की एसिंक्रोनस विधि है। परिणाम BluetoothGattCallback के onCharacteristicRead() में आता है। यदि किसी डिवाइस में 2+ मेल खाने वाली विशेषताएँ हैं (असंभावित लेकिन संभव), readCharacteristic() गैर-लक्षित पढ़ सकता है — UUID के बजाय BluetoothGattCharacteristic इंस्टेंस पर readCharacteristic() कॉल करना अधिक सुरक्षित है।

readDescriptor() — विशेषता डिस्क्रिप्टर मान पढ़ने की विधि है। एक सामान्य डिस्क्रिप्टर CCCD (Client Characteristic Configuration Descriptor, UUID 0x2902) है, जो निर्धारित करता है कि सूचनाएँ सक्षम हैं या नहीं। परिणाम onDescriptorRead() में है। व्यवहार में शायद ही कभी डिस्क्रिप्टर पढ़ने की आवश्यकता होती है — CCCD setCharacteristicNotification() द्वारा प्रबंधित किया जाता है, लेकिन कस्टम डिस्क्रिप्टर (User Description 0x2901, Presentation Format 0x2904) के लिए readDescriptor() मेटाडेटा प्राप्त करने का एकमात्र तरीका है।

MTU और बड़ा डेटा पढ़ना — यदि विशेषता मान MTU (BLE 4.0 के लिए 23 बाइट) से अधिक है, Android स्वचालित रूप से BLE स्टैक के माध्यम से पढ़ने के अनुरोधों के अनुक्रम से डेटा को खंडित और पुनः एकत्रित करता है। BLE 5.0+ के लिए विस्तारित MTU (251 बाइट तक) के साथ, खंडन की आवश्यकता नहीं है — एक बार पढ़ने पर पूरा डेटा मिलता है। पढ़ने से पहले, आप अधिकतम MTU पर बातचीत करने के लिए requestMtu() कॉल कर सकते हैं।

kotlin
// BluetoothGatt के माध्यम से विशेषता और डिस्क्रिप्टर पढ़ें
class GattReader {

    fun readHeartRate(gatt: BluetoothGatt) {
        // हृदय गति सेवा UUID = 0x180D
        val service = gatt.getService(UUID.fromString("0000180D-0000-1000-8000-00805F9B34FB"))
            ?: return
        // हृदय गति माप UUID = 0x2A37
        val characteristic = service.getCharacteristic(
            UUID.fromString("00002A37-0000-1000-8000-00805F9B34FB")
        ) ?: return

        if (hasProperty(characteristic, BluetoothGattCharacteristic.PROPERTY_READ)) {
            gatt.readCharacteristic(characteristic)
        }
    }

    fun readDescriptor(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
        // CCCD (0x2902)
        val cccd = characteristic.getDescriptor(
            UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
        )
        cccd?.let { gatt.readDescriptor(it) }
    }

    // onCharacteristicRead कॉलबैक में डेटा संसाधित करें:
    fun parseHeartRate(value: ByteArray): Int {
        // BLE हृदय गति: bytes = flags, second = bpm
        return if (value.isNotEmpty()) value[1].toInt() and 0xFF else 0
    }

    private fun hasProperty(char: BluetoothGattCharacteristic, prop: Int): Boolean {
        return char.properties and prop != 0
    }
}

GattReader क्लास हृदय गति विशेषता पढ़ने का प्रदर्शन करता है। सेवा 0x180D में विशेषता 0x2A37 (Heart Rate Measurement) है — Bluetooth SIG का मानक BLE प्रोफ़ाइल। पढ़ने से पहले, hasProperty के माध्यम से PROPERTY_READ गुण की जाँच की जाती है। parseHeartRate BLE हृदय गति प्रारूप को पार्स करता है: पहला बाइट — flags (डेटा प्रारूप), दूसरा — bpm मान। CCCD डिस्क्रिप्टर (0x2902) सूचना स्थिति की जाँच के लिए पढ़ा जाता है।

विशेषताओं को लिखना: WriteType के साथ writeCharacteristic

writeCharacteristic() — BLE परिधीय पर डेटा लिखने के लिए BluetoothGatt विधि है। Android API 33+ पर, writeCharacteristic() को writeCharacteristic(request) से बदल दिया गया है, जहाँ BluetoothGattCharacteristicWriteRequest एक अनुरोध ऑब्जेक्ट है जिसमें विशेषता, बाइट सरणी और WriteType होता है। setValue() के साथ पुरानी writeCharacteristic(characteristic) विधि हटाई गई है। WriteType अनुरोध व्यवहार निर्धारित करता है: WRITE_TYPE_DEFAULT (विशेषता गुणों पर निर्भर), WRITE_TYPE_NO_RESPONSE (बिना प्रतिक्रिया) और WRITE_TYPE_SIGNED (प्राधिकरण)।

WriteType चुनना गति और विश्वसनीयता को प्रभावित करता है। WRITE_TYPE_DEFAULT आमतौर पर withResponse (यदि विशेषता में PROPERTY_WRITE है) या withoutResponse (यदि PROPERTY_WRITE_NO_RESPONSE है) से मेल खाता है। स्ट्रीमिंग डेटा (OTA अपडेट, लॉग) के लिए WRITE_TYPE_NO_RESPONSE का उपयोग करें — अधिकतम थ्रूपुट। डिलीवरी गारंटी वाले कमांड (सक्षम करना, कॉन्फ़िगर करना) के लिए — onCharacteristicWrite के माध्यम से पुष्टि के साथ WRITE_TYPE_DEFAULT।

kotlin
// Android API 33+ पर BLE विशेषता लेखन
class GattWriter {

    // प्रतिक्रिया के साथ लिखें (withResponse)
    fun writeWithResponse(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, data: ByteArray) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            // API 33+: writeCharacteristic
            val request = BluetoothGattCharacteristicWriteRequest(
                characteristic,
                data,
                BluetoothGattCharacteristicWriteRequest.WRITE_TYPE_DEFAULT,
                @android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
            )
            gatt.writeCharacteristic(request)
        } else {
            // API < 33:   (deprecated)
            characteristic.setValue(data)
            gatt.writeCharacteristic(characteristic)
        }
    }

    // बिना प्रतिक्रिया के लिखें (अधिकतम गति)
    fun writeWithoutResponse(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, data: ByteArray) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            val request = BluetoothGattCharacteristicWriteRequest(
                characteristic,
                data,
                BluetoothGattCharacteristicWriteRequest.WRITE_TYPE_NO_RESPONSE,
                @android.annotation.RequiresPermission(android.Manifest.permission.BLUETOOTH_CONNECT)
            )
            gatt.writeCharacteristic(request)
        } else {
            characteristic.setValue(data)
            characteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE
            gatt.writeCharacteristic(characteristic)
        }
    }

    // onCharacteristicWrite कॉलबैक (API 33+)
    private val writeCallback = object : BluetoothGattCallback() {
        override fun onCharacteristicWrite(
            gatt: BluetoothGatt,
            characteristic: BluetoothGattCharacteristic,
            value: ByteArray,
            status: Int,
            callbackType: Int
        ) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                print("Write success: ${value.size} bytes")
            }
        }
    }
}

GattWriter क्लास विभिन्न API स्तरों के लिए दोनों WriteTypes का समर्थन करता है। writeWithResponse WRITE_TYPE_DEFAULT का उपयोग करता है — BLE डिवाइस onCharacteristicWrite के माध्यम से लेखन की पुष्टि करता है। writeWithoutResponse WRITE_TYPE_NO_RESPONSE का उपयोग करता है — डेटा बिना पुष्टि के भेजा जाता है, अधिकतम थ्रूपुट। API 33+ पर, BluetoothGattCharacteristicWriteRequest के साथ नया writeCharacteristic(request) उपयोग किया जाता है। API < 33 पर — पुराना setValue() + writeCharacteristic().

सूचनाओं की सदस्यता: setCharacteristicNotification और CCCD

setCharacteristicNotification() — परिधीय पर विशेषता परिवर्तनों के बारे में सूचनाओं की सदस्यता लेने के लिए BluetoothGatt विधि है। सदस्यता सक्रिय करने के बाद, BLE डिवाइस onCharacteristicChanged() के माध्यम से नए मान भेजता है। हालाँकि, setCharacteristicNotification() केवल स्थानीय Android सूचना को सक्रिय करता है — BLE डिवाइस पर ही सूचनाएँ सक्षम करने के लिए, आपको CCCD डिस्क्रिप्टर (0x2902) में मान 0x0100 भी लिखना होगा।

CCCD (Client Characteristic Configuration Descriptor) — एक डिस्क्रिप्टर है जो BLE परिधीय से सूचनाएँ भेजने को नियंत्रित करता है। मान 0x0000 — सूचनाएँ अक्षम, 0x0100 — सूचनाएँ सक्षम, 0x0200 — संकेत सक्षम। CCCD में लेखन setCharacteristicNotification() कॉल करने के बाद BluetoothGatt पर writeDescriptor() के माध्यम से किया जाता है। Android स्वचालित रूप से CCCD नहीं लिखता — यह जिम्मेदारी डेवलपर की है।

kotlin
// सही BLE सूचना सदस्यता
class GattNotificationManager {

    // 1. सूचनाएँ सक्षम करें
    fun enableNotification(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
        // चरण 1: स्थानीय Android सदस्यता
        val success = gatt.setCharacteristicNotification(characteristic, true)
        if (!success) {
            print("सदस्यता विफल")
            return
        }

        // चरण 2: BLE डिवाइस पर CCCD (0x2902) लिखें
        val cccdDescriptor = characteristic.getDescriptor(
            UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
        ) ?: return

        // 0x0100 = सूचना, 0x0200 = संकेत
        val cccdValue = if (characteristic.properties
            and BluetoothGattCharacteristic.PROPERTY_NOTIFY != 0) {
            BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE  // [0x01, 0x00]
        } else {
            BluetoothGattDescriptor.ENABLE_INDICATION_VALUE     // [0x02, 0x00]
        }

        cccdDescriptor.setValue(cccdValue)
        gatt.writeDescriptor(cccdDescriptor)
    }

    // 2. विशेषता खोज
    fun disableNotification(gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic) {
        gatt.setCharacteristicNotification(characteristic, false)
        val cccdDescriptor = characteristic.getDescriptor(
            UUID.fromString("00002902-0000-1000-8000-00805F9B34FB")
        ) ?: return
        cccdDescriptor.setValue(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE)
        gatt.writeDescriptor(cccdDescriptor)
    }

    // 3. सूचना कॉलबैक
    private val notificationCallback = object : BluetoothGattCallback() {
        override fun onCharacteristicChanged(
            gatt: BluetoothGatt,
            characteristic: BluetoothGattCharacteristic,
            value: ByteArray,
            callbackType: Int
        ) {
            // BLE परिधीय से नया मान
            print("Notification: ${value.size} bytes")
        }
    }
}

GattNotificationManager क्लास सही दो-चरणीय BLE सूचना सदस्यता प्रोटोकॉल लागू करता है। enableNotification पहले Android पर setCharacteristicNotification(true) कॉल करता है, फिर writeDescriptor के माध्यम से CCCD डिस्क्रिप्टर में 0x0100 लिखता है। disableNotification उल्टे संचालन करता है। CCCD लेखन के बिना, BLE डिवाइस सूचनाएँ नहीं भेजता — Android पर BLE डेवलपर्स की यह सबसे आम गलती है।

BluetoothGattCallback के साथ Kotlin में GATT क्लाइंट उदाहरण

पूरा उदाहरण Kotlin में GATT क्लाइंट का जो एसिंक्रोनस प्रोसेसिंग के लिए कोरूटीन का उपयोग करके एकल प्रबंधक में BluetoothGatt निर्माण, खोज, पढ़ना और सूचना सदस्यता को जोड़ता है।

kotlin
// Kotlin में कोरूटीन के साथ पूर्ण GATT क्लाइंट
class GattClient(context: Context) {

    private val context = context.applicationContext
    private var gatt: BluetoothGatt? = null

    // कोरूटीन से कनेक्ट करें
    suspend fun connect(device: BluetoothDevice): Boolean =
        suspendCoroutine { continuation ->
            gatt = device.connectGatt(
                context, false,
                object : BluetoothGattCallback() {
                    override fun onConnectionStateChange(
                        gatt: BluetoothGatt, status: Int, newState: Int
                    ) {
                        if (newState == BluetoothProfile.STATE_CONNECTED) {
                            gatt.discoverServices()
                        } else {
                            continuation.resume(false)
                        }
                    }

                    override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
                        continuation.resume(status == BluetoothGatt.GATT_SUCCESS)
                    }
                },
                BluetoothDevice.TRANSPORT_LE
            )
        }

    // कोरूटीन के माध्यम से विशेषता पढ़ें
    suspend fun readCharacteristicValue(char: BluetoothGattCharacteristic): ByteArray? =
        suspendCoroutine { continuation ->
            gatt?.let { gatt ->
                // कॉलबैक पहचान के लिए विशेषता टैग सहेजें
                gatt.setCharacteristic(char, null)  // API के लिए < 33
                gatt.readCharacteristic(char)
            }
        }

    // कनेक्शन बंद करें
    fun release() {
        gatt?.disconnect()
        gatt?.close()
        gatt = null
    }
}

GATT क्लाइंट GattClient कॉलबैक-आधारित BluetoothGatt API को अनुक्रमिक कॉल में बदलने के लिए कोरूटीन (suspendCoroutine) का उपयोग करता है। connect() onServicesDiscovered की प्रतीक्षा करता है, जिसके बाद GATT पदानुक्रम उपलब्ध है। readCharacteristicValue() onCharacteristicRead की प्रतीक्षा करता है। यह दृष्टिकोण कॉलबैक नेस्टिंग को समाप्त करता है और BLE कोड को रैखिक बनाता है। release() संसाधन सफाई की गारंटी देता है — Activity के onDestroy या ViewModel.onCleared में अनिवार्य कॉल।

अक्सर पूछे जाने वाले प्रश्न

Android में BluetoothGatt क्या है?

BluetoothGatt — Android में GATT क्लाइंट के लिए क्लास है जो परिधीय डिवाइस के साथ BLE कनेक्शन प्रबंधित करता है। यह BluetoothDevice.connectGatt() के माध्यम से बनाया जाता है, जो discoverServices(), readCharacteristic(), writeCharacteristic(), setCharacteristicNotification() विधियाँ प्रदान करता है। सभी संचालनों के परिणाम BluetoothGattCallback के माध्यम से एसिंक्रोनस रूप से आते हैं। BluetoothGatt के बिना, Android पर द्विदिश BLE संचार असंभव है।

onServicesDiscovered स्थिति 133 क्यों लौटाता है?

स्थिति 133 (GATT_ERROR) Android BLE स्टैक की आंतरिक त्रुटि को इंगित करता है। कारण: खोज के दौरान डिवाइस डिस्कनेक्ट हो गया, MTU न्यूनतम (23 बाइट) से कम है, या BLE स्टैक ओवरलोड है। समाधान: 500 ms की देरी के साथ discoverServices() पुनः प्रयास करें, डिवाइस RSSI जाँचें और सुनिश्चित करें कि परिधीय अपनी वर्तमान स्थिति में GATT खोज का समर्थन करता है।

पुष्टि के साथ विशेषता कैसे लिखें?

पुष्टि के साथ लिखने के लिए, WRITE_TYPE_DEFAULT के साथ writeCharacteristic() कॉल करें (API 33+: BluetoothGattCharacteristicWriteRequest)। सफलता पर, BLE डिवाइस पुष्टि भेजता है और Android GATT_SUCCESS के साथ onCharacteristicWrite कॉल करता है। यदि डिवाइस 30 सेकंड (स्टैक टाइमआउट) के भीतर जवाब नहीं देता, कॉलबैक त्रुटि स्थिति लौटाता है। watchdog के लिए postDelayed के साथ Handler का उपयोग करें।

Android 33+ पर BLE के साथ कैसे काम करें?

Android 13+ (API 33) पर, BluetoothGatt विधियाँ बदल गई हैं: writeCharacteristic() अब BluetoothGattCharacteristicWriteRequest स्वीकार करता है, readCharacteristic() — BluetoothGattCharacteristicReadRequest। पुरानी setValue()/writeCharacteristic() हटाई गई है। BluetoothGattCallback भी बदल गया है: onCharacteristicRead(), onCharacteristicWrite(), onCharacteristicChanged() ByteArray value और callbackType प्राप्त करते हैं। शाखाकरण के लिए Build.VERSION.SDK_INT का उपयोग करें।

Android कितने BLE कनेक्शन का समर्थन करता है?

Android 4–8 एक साथ BLE GATT कनेक्शन का समर्थन करता है (निर्माता और Android संस्करण पर निर्भर करता है)। Pixel/Google: 7 तक, Samsung: 5 तक, Xiaomi: 4 तक। सीमा पार होने पर, connectGatt null या onConnectionStateChange त्रुटि के साथ लौटाता है। बड़ी संख्या में डिवाइसों के साथ काम करने के लिए, चक्रीय कनेक्शन या Bluetooth Mesh का उपयोग करें।

सारांश

  • BluetoothGatt — BLE कनेक्शन के लिए Android GATT क्लाइंट, BluetoothDevice.connectGatt() के माध्यम से BluetoothGattCallback के साथ बनाया गया
  • discoverServices() — BLE डिवाइस सेवाएँ, विशेषताएँ और डिस्क्रिप्टर प्राप्त करने के लिए कनेक्शन के बाद अनिवार्य चरण
  • पढ़ना — onCharacteristicRead() में एसिंक्रोनस परिणाम के साथ readCharacteristic(); बड़े डेटा के लिए MTU बातचीत आवश्यक
  • लिखना — WriteType के साथ writeCharacteristic(): DEFAULT (withResponse) या NO_RESPONSE (बिना पुष्टि)
  • सूचनाएँ — दो-चरणीय सक्रियण: setCharacteristicNotification() + मान 0x0100 के साथ CCCD (0x2902) लिखना
  • API 33+ — अनुरोध ऑब्जेक्ट के साथ नई विधियाँ writeCharacteristic(request) और readCharacteristic(request)
  • संसाधन जारी करें — BLE कनेक्शन लीक को रोकने के लिए disconnect() और close() का अनिवार्य कॉल

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें