在Android(蓝牙低功耗)中启用蓝牙特性通知不起作用

时间:2015-08-24 14:14:46

标签: android bluetooth bluetooth-lowenergy gatt

如果我们在字符上调用 setCharacteristicNotification ,而不是在值更改时提供远程通知?如何在蓝牙LE中的中央设备上启用远程通知?

3 个答案:

答案 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);