Reputation: 63
I've set the notification into android, It is not calling to method onCharacteristicRead()
????
It does not enter into the function. Why it is happening so??
Any help is appreciated
Request the solutions.
This is my code:
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status,
int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "Connected to GATT server.");
// Attempts to discover services after successful connection.
Log.i(TAG, "Attempting to start service discovery:"
+ mBluetoothGatt.discoverServices());
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.i(TAG, "Disconnected from GATT server.");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
gattServices = mBluetoothGatt
.getService(SampleGattAttributes.SERVICES_UUID);
if (gattServices != null) {
gattCharacteristics = gattServices
.getCharacteristic(SampleGattAttributes.CHARACTERISTIC_UUID);
System.out.println("character-->" + gattCharacteristics);
}
if (gattCharacteristics != null) {
System.out.println("Characteristic not null");
System.out.println("Characteristic Properties-->"
+ gattCharacteristics.getProperties());
mBluetoothGatt.setCharacteristicNotification(gattCharacteristics,
true);
}
} else {
Log.w(TAG, "onServicesDiscovered received: " + status);
}
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic, int status) {
System.out.println("in read");
if (status == BluetoothGatt.GATT_SUCCESS) {
byte[] data = characteristic.getValue();
System.out.println("reading");
System.out.println(new String(data));
}
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
//
System.out.println("change");
byte[] data = characteristic.getValue();
System.out.println(new String(data));
}
};
Thank you in advance!!
Upvotes: 6
Views: 11568
Reputation: 4742
First of all onCharacteristicRead
will fire if you have read a characteristic by:
mBluetoothGatt.readCharacteristic(characteristic);
Reading a characteristic and setting up notifications are two different things. What is the type of your characteristic you want to get data from?
Is it:
If it is read
you can read the characteristic using the mBluetoothGatt.readCharacteristic(characteristic);
method but if its notify
or indicate
first you will have to read the characteristic's descriptor
by calling:
mBluetoothGatt.readDescriptor(ccc);
Once you read it, it should return data by calling the onDescriptorRead
callback.
Here you can set up (subscribe) to the charactersitic through either notification or indication by calling:
mBluetoothGatt.setCharacteristicNotification(characteristic, true)
once it returns true
you will need to write to the descriptor again (the value of notification or indication)
BluetoothGattDescriptor clientConfig = characteristic.getDescriptor(CCC);
clientConfig.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
// or
//clientConfig.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
mBluetoothGatt.writeDescriptor(clientConfig);
Once this is done you will get notifications throuhg onCharacteristicChanged
callback every time the characteristic changes.
you can read more about Bluetooth connection on Android here
and about Bluetooth Characteristics here
Upvotes: 26