BluetoothGattDescriptor 始终为 NULL

BluetoothGattDescriptor is always 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 之后,在 BluetoothGattCallback

中调用 onCharacteristicWrite
@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 总是 NULLonCharacteristicChanged 永远不会被调用。 为什么?我的 CLIENT_CHARACTERISTIC_CONFIG 对吗?

这是因为一些设备(我的是三星 E5 Android 4.3-> 更新到 5.1.1)支持 BLE 但不支持 BluetoothGattDescriptor 0x2902(参见 link)

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

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

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