public void BroadcastUpdate (String action, BluetoothGattCharacteristic characteristic) { Intent intent = new Intent (action); // This is special handling for the Heart Rate Measurement profile. Data parsing is // carried out as per profile specifications: // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml if (UUID_HEART_RATE_MEASUREMENT == (characteristic.Uuid)) { GattProperty flag = characteristic.Properties; GattFormat format = (GattFormat) (-1); if (((int) flag & 0x01) != 0) { format = GattFormat.Uint16; Log.Debug (TAG, "Heart rate format UINT16."); } else { format = GattFormat.Uint8; Log.Debug (TAG, "Heart rate format UINT8."); } var heartRate = characteristic.GetIntValue (format, 1); Log.Debug (TAG, String.Format ("Received heart rate: {0}", heartRate)); intent.PutExtra (EXTRA_DATA, heartRate); } else { // For all other profiles, writes the data formatted in HEX. byte[] data = characteristic.GetValue (); if (data != null && data.Length > 0) { StringBuilder stringBuilder = new StringBuilder (data.Length); foreach (byte byteChar in data) stringBuilder.Append (String.Format ("{0}02X ", byteChar)); intent.PutExtra (EXTRA_DATA, Convert.ToBase64String (data) + "\n" + stringBuilder.ToString()); } } SendBroadcast (intent); }