我正在尝试与Android设备中的BLE进行交互并读取一些传感器值,我正在遵循API级别> 21.我设法扫描设备并连接到它。第一个挑战是一次性读取所有特征值,一些建议使用优先级队列来做到这一点,我实施得很明智,它工作正常。
BluetoothGattCallback gattCallBack = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
switch (newState) {
case BluetoothProfile.STATE_CONNECTED:
Log.d(TAG, "STATE_CONNECTED");
bluetoothGatt.discoverServices();
break;
case BluetoothProfile.STATE_DISCONNECTED:
Log.d(TAG, "STATE_DISCONNECTED");
break;
default:
Log.d(TAG, "STATE_OTHER");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
final List<BluetoothGattService> services = gatt.getServices();
characteristics = new ArrayList<BluetoothGattCharacteristic>();
characteristics.add(services.get(1).getCharacteristics().get(0));
characteristics.add(services.get(1).getCharacteristics().get(1));
characteristics.add(services.get(1).getCharacteristics().get(2));
characteristics.add(services.get(2).getCharacteristics().get(0));
characteristics.add(services.get(2).getCharacteristics().get(1));
characteristics.add(services.get(2).getCharacteristics().get(2));
characteristics.add(services.get(3).getCharacteristics().get(0));
characteristics.add(services.get(3).getCharacteristics().get(1));
characteristics.add(services.get(3).getCharacteristics().get(2));
requesReadCharacteristics(gatt);
}
public void requesReadCharacteristics(BluetoothGatt gatt) {
gatt.readCharacteristic(characteristics.get(characteristics.size() - 1));
}
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status == 0 ) {
Log.d(TAG, "DeviceNameFetchFromDevice: " + characteristic.getValue());
characteristics.remove(characteristics.get(characteristics.size() - 1));
if (characteristics.size() > 0) {
requesReadCharacteristics(gatt);
} else {
gatt.disconnect();
}
}
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
super.onCharacteristicWrite(gatt, characteristic, status);
}
};
现在我需要通过BLE设备连续监控读取传感器值(每个间隔10秒),所以我需要重复读取特征值并获取它们的值。但是第一次调用后,ble不允许调用“readCharacteristic”。
现在我实现了它,就像定期调用connectDevice(BluetoothDevice)一样,就像断开与BLE设备的现有连接并再次连接它一样。有什么方法我们可以调用readCharacteristic重复连接到设备。根据我的理解,断开和连接设备并不是那么有效。请让我知道,如果有任何这样的例子
,继续阅读设备的正确方法是什么,或者分享答案 0 :(得分:1)
首先,你应该打开通知:
mBluetoothLeService.setCharacteristicNotification(characteristic, true);
然后,当数据发生变化时,您可以读取此方法中的值:
onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)