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.