Descriptor始终为NULL

Descriptor始终为NULL

我的CLIENT_CHARACTERISTIC_CONFIG是

public final static UUID CLIENT_CHARACTERISTIC_CONFIG =  UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");


我这样做是为了更改特征:

            BluetoothGatt mBluetoothGatt = device.connectGatt(this.context, false, mGattCallback);
            mBluetoothGatt.connect();


            BluetoothGattService mCustomService = bleScanner.getBluetoothGatt().getService(UUID.fromString(bleServiceUUID));
            if(mCustomService == null){
               return;
            }

            BluetoothGattCharacteristic mCharacteristic = mCustomService.getCharacteristic(UUID.fromString(bleCharacteristicUUID));
            if(mReadCharacteristic == null){
                return;
            }
            String message = "myMessage";
            mCharacteristic.setValue(message.getBytes());

            if (!mBluetoothGatt.writeCharacteristic(characteristic)) {
                Log.e(TAG, "Failed to write characteristic");
            } else {
                Log.e(TAG, "Writed characteristic " + message);
            }


在传感器上更改characteristic之后,在onCharacteristicWrite中调用BluetoothGattCallback

@Override
                public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {

                    if (status == BluetoothGatt.GATT_SUCCESS) {

                        if (!mBluetoothGatt.setCharacteristicNotification(characteristic, true)) {
                            DLog.e(TAG, "Notification Setup failed: "+characteristic.getUuid());
                        }

                        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(CLIENT_CHARACTERISTIC_CONFIG);
                        if (descriptor!=null){
                            descriptor.setValue( BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
                            mBluetoothGatt.writeDescriptor(descriptor1);
                        }
                    }
                }


但是descriptor始终为NULL。并且onCharacteristicChanged永远不会被调用。
为什么?我的CLIENT_CHARACTERISTIC_CONFIG对吗?

最佳答案

这是因为某些设备(例如三星E5 Android 4.3->更新至5.1.1)支持BLE,但不支持BluetoothGattDescriptor 0x2902(请参阅链接)

要查看设备中支持者的所有描述符,请调用:

for (BluetoothGattDescriptor descriptor:characteristic.getDescriptors()){
                    Log.e(TAG, "BluetoothGattDescriptor: "+descriptor.getUuid().toString());
                }


[更新]
某些BLE设备不支持Writed characteristics,例如iBeacon

08-03 18:05