I tired to use Android BLE SDK to communication with my Glucose device. I need setCharacteristicNotification for UUID 2a18 and 2a34. I refer to the Android official SDK as follows:
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);
BUT it can not even enter the onCharacteristicChanged callback.
my onCharacteristicChanged as follows:
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); }; }); }
if I set Battery Level notification as follows, it works.
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);
I dont know what is different with Battery and Glucose notifications.
If anyone knew what should I do, so please help me.
additional:
when I used battery service, my logcat as follows:
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
but when I use Glucose, my logcat lose onNotify(), like this:
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
I dont know why logcat lose the onNotify()...
additional(8/4):
Thanks for your reply ! I tried to enable indications on Record Access Control Point characteristic but failed.. My Process as follows:
Enable notifications on Glucose Measurement characteristic and Glucose Measurement Context characteristic & Enable indications on Record Access Control Point characteristic
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); }; }); } } };
Send 0x0101 to record access control point
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;
my callback function
@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); }; }); }
I'm trying to understand that "GLS_SPEC" pdf... I used Nordic Semiconductor's Glucose Service sample application, and it could works. I try to learn how to reach that function.
I noted some log like "unregisterIRListener() is called" shows on LogCat, but I'm not sure that whether about my question or not...
Thanks for reading.