【发布时间】:2016-06-16 01:58:00
【问题描述】:
我正在尝试从 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 连接到设备。根据我的理解,断开和连接设备并不是那么有效。请告诉我,继续读取设备的正确方法是什么,或者如果有这样的例子,请分享
【问题讨论】:
-
是否有错误或“ble 不允许在第一次调用后调用 readCharacterisitc”是什么意思?
标签: android android-bluetooth bluetooth-lowenergy