我的设备上有6个特征。其中一个需要通知才能发送数据。我注册了这样的特征:
private void registerEnvironmentCharacteristics(List<BluetoothGattCharacteristic> characteristics) {
for (BluetoothGattCharacteristic characteristic : characteristics) {
UUID characteristicUuid = characteristic.getUuid();
if (Characteristics.TEMPERATURE_CHARACTERISTIC_UUID.equals(characteristicUuid))
temperatureCharacteristic = characteristic;
flipNotifications(temperatureCharacteristic,true);
}
}
这是setCharacteristicNotification的翻转方法:
private void flipNotifications(BluetoothGattCharacteristic characteristic, boolean enable) {
boolean notifications = bluetoothGatt.setCharacteristicNotification(characteristic, enable);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(Characteristics.CONFIGURATION_DESCRIPTOR_UUID);
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
bluetoothGatt.writeDescriptor(descriptor);
BluetoothCommunicationManager.getInstance().add(new DescriptorCommand(descriptor, bluetoothGatt, enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE));
}
当我从registerEnvironment中删除flipNotification()方法时,我从设备中获取5个特征(没有这个通知),但是当我添加flipNotification时,我在所有特征上都为空。知道我做错了什么吗?这是我的方法:
public void readTemperature() {
BluetoothCommunicationManager.getInstance().add(new WriteCharacteristicCommand(temperatureCharacteristic, bluetoothGatt, SINGLE_READ_COMMAND));
}
提前感谢您的帮助!
答案 0 :(得分:0)
Android BLE只支持一个特有的写/读操作,你可以这样做,首先调用serviceDiscovery方法,你会得到OnServiceDiscovery的结果,在这里你需要将所有特性添加到List或ArrayList变量中,并设置一个通知再见一次,一旦你写了一次charastristric的通知,调用了onDescriptorWrite方法,你就可以从数组中删除那个特征值,并再次为列表顶部值设置setNotification。
1)使用FIFO队列或优先级队列取决于您的业务逻辑
2)插入您想要阅读的所有特征
3)调用您的requestCharacteristics方法,以便它可以开始使用您的队列
4)从你的onCharacteristicsRead调用看看队列的大小是否大于零请求一个..一定要从这里偷看()
5)现在你的requestCharacteristics方法执行poll()并请求BLE GATT的特征。
检查此答案对您有帮助。