Notificaciones de Android BLE para Glucosa

Estoy cansado de usar Android BLE SDK para comunicarme con mi dispositivo Glucose. Necesito setCharacteristicNotification para UUID 2a18 y 2a34. Me refiero al SDK oficial de Android de la siguiente manera:

http://developer.android.com/guide/topics/connectivity/bluetooth-le.html#notification

BluetoothGattCharacteristic charGM = 
mConnGatt.getService(UUID.fromString(BleUuid.SERVICE_GLUCOSE))
    .getCharacteristic(UUID.fromString(BleUuid.CHAR_GLUCOSE_MEASUREMENT_STRING));
mConnGatt.setCharacteristicNotification(charGM, enabled);
BluetoothGattDescriptor descGM = charGM.getDescriptor(UUID.fromString(BleUuid.CHAR_CLIENT_CHARACTERISTIC_CONFIG_STRING));
descGM.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mConnGatt.writeDescriptor(descGM);

PERO ni siquiera puede ingresar la devolución de llamada onCharacteristicChanged.

my onCharacteristicChanged de la siguiente manera:

        public void onCharacteristicChanged(BluetoothGatt gatt,
                                        BluetoothGattCharacteristic characteristic) {
        broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(getApplicationContext(),"onCharacteristicChanged",Toast.LENGTH_LONG).show();
                setProgressBarIndeterminateVisibility(false);
            };
        });
    }

si configuro la notificación de Nivel de batería de la siguiente manera, funciona.

BluetoothGattCharacteristic charBarrery = 
    mConnGatt.getService(UUID.fromString(BleUuid.SERVICE_BATTERY))
        .getCharacteristic(UUID.fromString(BleUuid.CHAR_BATTERY_LEVEL_STRING));
mConnGatt.setCharacteristicNotification(charBarrery, enabled);
BluetoothGattDescriptor descBarrery = charBarrery.getDescriptor(UUID.fromString(BleUuid.CHAR_CLIENT_CHARACTERISTIC_CONFIG_STRING));
descBarrery.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
mConnGatt.writeDescriptor(descBarrery);

No sé qué es diferente con las notificaciones de batería y glucosa.

Si alguien sabe qué debo hacer, por favor ayúdame.

adicional:

cuando utilicé el servicio de batería, mi logcat es el siguiente:

07-29 10:28:17.924: D/BluetoothGatt(947): setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
07-29 10:28:17.924: D/BluetoothGatt(947): writeDescriptor() - uuid: 00002902-0000-1000-8000-00805f9b34fb
07-29 10:28:18.484: D/BluetoothGatt(947): onDescriptorWrite() - Device=B4:AB:2C:06:9E:F4 UUID=00002a19-0000-1000-8000-00805f9b34fb
07-29 10:28:18.604: D/BluetoothGatt(947): onNotify() - Device=B4:AB:2C:06:9E:F4 UUID=00002a19-0000-1000-8000-00805f9b34fb

pero cuando uso Glucosa, mi logcat pierde en Notify (), así:

07-29 10:31:23.729: D/BluetoothGatt(1763): setCharacteristicNotification() - uuid: 00002a18-0000-1000-8000-00805f9b34fb enable: true
07-29 10:31:23.729: D/BluetoothGatt(1763): writeDescriptor() - uuid: 00002902-0000-1000-8000-00805f9b34fb
07-29 10:31:24.324: D/BluetoothGatt(1763): onDescriptorWrite() - Device=B4:AB:2C:06:9E:F4 UUID=00002a18-0000-1000-8000-00805f9b34fb

No sé por qué logcat pierde el onNotify () ...

adicional (8/4):

Gracias por su respuesta ! Traté de habilitar las indicaciones en la característica Grabar punto de control de acceso pero fallé. Mi proceso de la siguiente manera:

Habilitar notificaciones sobre la característica de medición de glucosa y la característica de contexto de medición de glucosa y habilitar las indicaciones sobre la característica de registro de punto de control de acceso

    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
    for (BluetoothGattService service : gatt.getServices()) {
        if ((service == null) || (service.getUuid() == null)) {
            continue;
        }
        if (BleUuid.SERVICE_GLUCOSE.equalsIgnoreCase(service
                .getUuid().toString())) {

            BluetoothGattCharacteristic charGM = 
                    mConnGatt.getService(UUID.fromString(BleUuid.SERVICE_GLUCOSE))
                        .getCharacteristic(UUID.fromString(BleUuid.CHAR_GLUCOSE_MEASUREMENT_STRING));
            mConnGatt.setCharacteristicNotification(charGM, enabled);
            BluetoothGattDescriptor descGM = charGM.getDescriptor(UUID.fromString(BleUuid.CHAR_CLIENT_CHARACTERISTIC_CONFIG_STRING));
            descGM.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mConnGatt.writeDescriptor(descGM);

            BluetoothGattCharacteristic charGMC = 
                mConnGatt.getService(UUID.fromString(BleUuid.SERVICE_GLUCOSE))
                    .getCharacteristic(UUID.fromString(BleUuid.CHAR_GLUCOSE_MEASUREMENT_CONTEXT_STRING));
            mConnGatt.setCharacteristicNotification(charGMC, enabled);
            BluetoothGattDescriptor descGMC = charGMC.getDescriptor(UUID.fromString(BleUuid.CHAR_CLIENT_CHARACTERISTIC_CONFIG_STRING));
            descGMC.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mConnGatt.writeDescriptor(descGMC);

            BluetoothGattCharacteristic charRACP = 
                mConnGatt.getService(UUID.fromString(BleUuid.SERVICE_GLUCOSE))
                    .getCharacteristic(UUID.fromString(BleUuid.CHAR_RECORD_ACCESS_CONTROL_POINT_STRING));
            mConnGatt.setCharacteristicNotification(charRACP, enabled);
            BluetoothGattDescriptor descRACP = charRACP.getDescriptor(UUID.fromString(BleUuid.CHAR_CLIENT_CHARACTERISTIC_CONFIG_STRING));
            descRACP.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
            mConnGatt.writeDescriptor(descRACP);

            BluetoothGattCharacteristic charBarrery = 
                    mConnGatt.getService(UUID.fromString(BleUuid.SERVICE_BATTERY))
                        .getCharacteristic(UUID.fromString(BleUuid.CHAR_BATTERY_LEVEL_STRING));
            mConnGatt.setCharacteristicNotification(charBarrery, enabled);
            BluetoothGattDescriptor descBarrery = charBarrery.getDescriptor(UUID.fromString(BleUuid.CHAR_CLIENT_CHARACTERISTIC_CONFIG_STRING));
            descBarrery.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
            mConnGatt.writeDescriptor(descBarrery);

            runOnUiThread(new Runnable() {
                public void run() {
                    btnUpdateData.setEnabled(true);
                };
            });
        }
    }
};

Enviar 0x0101 para registrar el punto de control de acceso

    case R.id.btnUpdateData:
    try{
        //***SEND 0x0101 TO RECORD ACCESS CONTROL POINT   
        BluetoothGattCharacteristic writeRACPchar = 
                mConnGatt.getService(UUID.fromString(BleUuid.SERVICE_GLUCOSE))
                    .getCharacteristic(UUID.fromString(BleUuid.CHAR_RECORD_ACCESS_CONTROL_POINT_STRING));
        byte[] data = new byte[1];
        data[0] = (byte)0x0101;
        writeRACPchar.setValue(data);
        mConnGatt.writeCharacteristic(writeRACPchar);
    }catch(Exception e){
        e.printStackTrace();
    }
    break;

mi función de devolución de llamada

@Override
public void onCharacteristicRead(BluetoothGatt gatt,
                                 BluetoothGattCharacteristic characteristic, 
                                 int status) {
        broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}

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

@Override
public void onCharacteristicChanged(BluetoothGatt gatt,
                                    BluetoothGattCharacteristic characteristic) {
    broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}

&

    private void broadcastUpdate(final String action,
        final BluetoothGattCharacteristic characteristic) {
        final Intent intent = new Intent(action);
        if (BleUuid.CHAR_SERIAL_NUMBEAR_STRING
                .equalsIgnoreCase(characteristic.getUuid().toString())) {
            displayResult(characteristic.getStringValue(0));
        }else if(BleUuid.CHAR_MANUFACTURER_NAME_STRING
                .equalsIgnoreCase(characteristic.getUuid().toString())){
            displayResult(characteristic.getStringValue(0));
        } else if(BleUuid.CHAR_BATTERY_LEVEL_STRING
                .equalsIgnoreCase(characteristic.getUuid().toString())){
            final byte[] data = characteristic.getValue();
            String dataStr = "";
            dataStr = String.format("%02X", data[0]);
            int a = Integer.parseInt(dataStr, 16);
            String result = "battery level: " + Integer.toString(a)+ "%";
            displayResult(result);
        } else {
            // For all other profiles, writes the data formatted in HEX.
            final byte[] data = characteristic.getValue();
            if (data != null && data.length > 0) {
                final StringBuilder stringBuilder = new StringBuilder(data.length);
                for(byte byteChar : data)
                    stringBuilder.append(String.format("%02X ", byteChar));
                displayResult(stringBuilder.toString());
            }
        }
}

&

    private void displayResult(String result){
    adUpdateData.add(result);
    runOnUiThread(new Runnable() {
        public void run() {
            lvUpdateData.setAdapter(adUpdateData);
        };
    });
}

Estoy tratando de entender que pdf "GLS_SPEC" ... Utilicé la aplicación de muestra del Servicio de Glucosa de Nordic Semiconductor, y podría funcionar. Trato de aprender cómo alcanzar esa función.

Noté que algunos log como "unregisterIRListener () se llama" se muestran en LogCat, pero no estoy seguro de si se trata de mi pregunta o no ...

Gracias por leer.