我正在尝试不断地从BLE设备中读取特征。
我在服务类中创建了一个Runnable:
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;
}
}
成功发现我呼吁的服务:
public void startReadingCharacteristics()
{
System.out.println("BluetoothLeService.startReadingCharacteristics");
this.mBackgroundRunnable = new BackgroundRunnableForRead();
mReadThread = new Thread(mBackgroundRunnable);
mReadThread.start();
}
这是我的特色阅读回调 -
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);
}
}
该应用程序在Nexus 5,Nexus 4和Motorola G上运行良好。
当我在Samsung S6上运行此代码时,它无效,onCharacteristicRead()
未被调用。
我读到,在等待onCharacteristicRead执行时,对readCharacteristics()
进行顺序调用会导致问题。
答案 0 :(得分:0)
建议一次只执行一个gatt命令,因为commands are not stacked。因此,您必须实现某种机制,在您获得当前读取的回调后调用下一个读取。
请记住,gatt回调可以来自不同的线程,但是如果你在回调中保存读取值然后从那里触发下一次读取,这应该没问题。