如果我们在字符上调用 setCharacteristicNotification ,而不是在值更改时提供远程通知?如何在蓝牙LE中的中央设备上启用远程通知?
答案 0 :(得分:9)
在Android上启用远程通知,
setCharacteristicNotification(特征,启用)是不够的。
需要为特征编写描述符。外围设备必须在创建特征时启用特征通知。
启用通知后,它将具有句柄 0x2902 的描述符。所以我们需要将 BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE 写入描述符。首先将 0x2902 转换为128位UUID,它将如下所示 00002902-0000-1000-8000-00805f9b34fb (基本蓝牙UUID为0000xxxx-0000-1000-8000-00805f9b34fb )。
以下代码
protected static final UUID CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
* Enable Notification for characteristic
*
* @param bluetoothGatt
* @param characteristic
* @param enable
* @return
*/
public boolean setCharacteristicNotification(BluetoothGatt bluetoothGatt, BluetoothGattCharacteristic characteristic,boolean enable) {
Logger.d("setCharacteristicNotification");
bluetoothGatt.setCharacteristicNotification(characteristic, enable);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CHARACTERISTIC_UPDATE_NOTIFICATION_DESCRIPTOR_UUID);
descriptor.setValue(enable ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE : new byte[]{0x00, 0x00});
return bluetoothGatt.writeDescriptor(descriptor); //descriptor write operation successfully started?
}
答案 1 :(得分:3)
我在调用descrpitor.setValue时也会收到空值,所以我只是在发现服务时打开它,最后它运行得很好:
通知主设备某些特性发生变化,请在您的外围设备上调用此功能:
private BluetoothGattServer server;
//init....
//on BluetoothGattServerCallback...
//call this after change the characteristic
server.notifyCharacteristicChanged(device, characteristic, false);
主设备中的:发现服务后启用setCharacteristicNotification:
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
super.onServicesDiscovered(gatt, status);
services = mGatt.getServices();
for(BluetoothGattService service : services){
if( service.getUuid().equals(SERVICE_UUID)) {
characteristicData = service.getCharacteristic(CHAR_UUID);
for (BluetoothGattDescriptor descriptor : characteristicData.getDescriptors()) {
descriptor.setValue( BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
mGatt.writeDescriptor(descriptor);
}
gatt.setCharacteristicNotification(characteristicData, true);
}
}
if (dialog.isShowing()){
mHandler.post(new Runnable() {
@Override
public void run() {
dialog.hide();
}
});
}
}
现在您可以检查您的特征值是否发生变化,例如onCharacteristicRead函数:
@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
Log.i("onCharacteristicRead", characteristic.toString());
byte[] value=characteristic.getValue();
String v = new String(value);
Log.i("onCharacteristicRead", "Value: " + v);
}
答案 2 :(得分:2)
要启用通知,您应该执行以下操作。
mBluetoothLeService.setCharacteristicNotification(mSampleCharacteristic, true);
其定义如下。
if (enabled) {
BluetoothGattDescriptor bluetoothGattDescriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
bluetoothGattDescriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
mBluetoothGatt.writeDescriptor(bluetoothGattDescriptor);
} else {
BluetoothGattDescriptor bluetoothGattDescriptor = characteristic.getDescriptor(UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
bluetoothGattDescriptor.setValue(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
mBluetoothGatt.writeDescriptor(bluetoothGattDescriptor);
}
如果远程通知不起作用,请在启用相同的通知后尝试读取特征。
阅读特征如
mBluetoothLeService.readCharacteristic(eachChara);