I am trying to read the characteristics from a BLE device continously .
I have created a Runnable in my service class:
private class BackgroundRunnableForRead implements Runnable { private volatile boolean isRunning = true ; @Override public void run() { try { BluetoothLeService.this.backgroundRunID = Thread.currentThread().getId(); while( isRunning) { List<BluetoothGattService> gattServices = BluetoothLeService.this.getSupportedGattServices(); if (gattServices != null && gattServices.size() > 0) { BluetoothGattCharacteristic characteristic = getCharacteristic(gattServices); if (characteristic != null && (characteristic.getProperties() & 2) > 0) { BluetoothLeService.this.readCharacteristic(characteristic); } } } } catch(Exception e) { isRunning= false; e.printStackTrace(); } } public void kill() { this.isRunning = false; } }
And on successful discovery of services i am calling:
public void startReadingCharacteristics() { System.out.println("BluetoothLeService.startReadingCharacteristics"); this.mBackgroundRunnable = new BackgroundRunnableForRead(); mReadThread = new Thread(mBackgroundRunnable); mReadThread.start(); }
And this is my on characterics read callback -
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { System.out.println("BluetoothLeService.onCharacteristicRead" + status); if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); } }
The application works fine on Nexus 5 , Nexus 4 and Motorola G .
When i am running this code on Samsung S6 it does not work, onCharacteristicRead()
is not called .
I read that making sequential calls to readCharacteristics()
can cause problems as it waits for onCharacteristicRead to execute.
1 Answers
Answers 1
It is recommended to execute only one gatt command at a time because commands are not stacked. So you'd have to implement some sort of mechanism that the next read is called after you've got the read callback for the current one.
Keep in mind that gatt callbacks can come from different threads, but this should be no problem if you save the read value in the callback and then trigger the next read from there.
0 comments:
Post a Comment