我正在尝试开发一个BT应用程序来连接到BLE设备并从中读取一些数据。 对于设备信息部分,我循环遍历设备的所有特性,读取特征并从BluetoothGattCallback的onCharacteristicRead方法收集返回的数据。
问题是,对于循环,onCharacteristicRead方法只被调用一次。请参阅下面的代码和logcat。
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
String value = characteristic.getStringValue(0);
Log.e("TAG", "onCharacteristicRead: " + value + " UUID " + characteristic.getUuid().toString() );
}
特征循环为
private void getDeviceInformation() {
BluetoothGattService deviceInfoService = bluetoothGatt.getService(UUIDs.DEVICE_INFORMATION_SERVICE);
BluetoothGattCharacteristic deviceSerialNumber, deviceHardwareRevision, deviceSoftwareRevision;
for (BluetoothGattCharacteristic characteristic : bluetoothGatt.getService(UUIDs.DEVICE_INFORMATION_SERVICE).getCharacteristics()) {
bluetoothGatt.setCharacteristicNotification(characteristic, true);
bluetoothGatt.readCharacteristic(characteristic);
}
}
Logcat -
D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a25-0000-1000-8000-00805f9b34fb enable: true
D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a27-0000-1000-8000-00805f9b34fb enable: true
D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a28-0000-1000-8000-00805f9b34fb enable: true
D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a23-0000-1000-8000-00805f9b34fb enable: true
D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a50-0000-1000-8000-00805f9b34fb enable: true
W/BluetoothGatt: onCharacteristicRead() - Device=F6:8B:C2:F3:EB:EE handle=14 Status=0
E/TAG: onCharacteristicRead: 86a691595263 UUID 00002a25-0000-1000-8000-00805f9b34fb
答案 0 :(得分:0)
您应该同步进行所有操作。所以之后:
bluetoothGatt.readCharacteristic(characteristic);
你应该等待回电
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)
所以,如果你想做你所描述的事情,那就做出类似的事情:
List<BluetoothGattCharacteristic> characteristics = new ArrayList<>();
boolean isGettingDeviceInformation;
int count = 0;
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
String value = characteristic.getStringValue(0);
Log.e("TAG", "onCharacteristicRead: " + value + " UUID " + characteristic.getUuid().toString() );
if(isGettingDeviceInformation) {
if(count < characteristics.size()) {
count++;
bluetoothGatt.setCharacteristicNotification(characteristics.get(count), true);
bluetoothGatt.readCharacteristic(characteristics.get(count));
} else {
isGettingDeviceInformation = false;
}
}
}
private void getDeviceInformation() {
BluetoothGattService deviceInfoService = bluetoothGatt.getService(UUIDs.DEVICE_INFORMATION_SERVICE);
BluetoothGattCharacteristic deviceSerialNumber, deviceHardwareRevision, deviceSoftwareRevision;
characteristics = bluetoothGatt.getService(UUIDs.DEVICE_INFORMATION_SERVICE).getCharacteristics();
bluetoothGatt.setCharacteristicNotification(characteristics.get(count), true);
bluetoothGatt.readCharacteristic(characteristics.get(count));
}
<强> 更新 强>
不要忘记在蓝牙中你的操作可能会消失,所以你可以在循环中堆叠,等待回调。所以为了避免它,你需要在操作上超时,所以如果没有得到回调,你只需要取消当前的操作,并且可以更进一步。