Search code examples
androidbluetoothbluetooth-lowenergyandroid-bluetoothgatt

Android App: Connecting to GATT server using UUIDs


I'm trying to connect to Bleno Periphecal GATT server from my android app.

The GATT Server has Custom Service and Characteristic with unique UUIDs.

How can I pinpoint connect to this server and send some text?

The minimum SDK is 21, and target SDK is 24, so old BluetoothLE Scanning method is deprecated, and now I need to use BluetoothLEScanner.


Solution

  • For connecting Ble simply use this method pass mac address of your BTdevice.

     private boolean connectGatt(final String address) {
        if (mBluetoothAdapter == null || address == null) {
            Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
            return false;
        }
    
        if (mBluetoothGatt != null) {
            Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
            if (mBluetoothGatt.connect()) {
                return true;
            } else {
                return false;
            }
        }
    
        final BluetoothDevice device = mBluetoothAdapter
                .getRemoteDevice(address);
        if (device == null) {
            Log.w(TAG, "Device not found.  Unable to connect.");
            return false;
        }
    
        mBluetoothGatt = device.connectGatt(mContext, false, mGattCallback);
        Log.d(TAG, "Trying to create a new connection.");
        return mBluetoothGatt.connect();
    }
    

    and you should register a callback to know connection is success or not.

     private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
    
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                //bluetooth is connected so discover services
                mBluetoothGatt.discoverServices();
    
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                //Bluetooth is disconnected
            }
        }
    
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
              // services are discoverd 
            }
    
            
        }
    
        @Override
        public void onCharacteristicRead(BluetoothGatt gatt,
                                         BluetoothGattCharacteristic characteristic,
                                         int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                
            }
        }
    
        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {
    
        }
    
        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicWrite(gatt, characteristic, status);
           
        }
    };
    

    once services are discoverd you can write or read from the services.

    to write to a service use this method

     private boolean writeRXCharacteristic(byte[] value) {
        BluetoothGattService RxService = mBluetoothGatt.getService(/*Place service UUID*/);
        if (RxService == null) {
            //Service not supported
            return false;
        }
        BluetoothGattCharacteristic RxChar = RxService.getCharacteristic(/*RX_CHAR_UUID*/);
        if (RxChar == null) {
            // service not supported
            return false;
        }
         RxChar.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
            RxChar.setValue(arr);
            return mBluetoothGatt.writeCharacteristic(RxChar);
    }