0
votes

I'm trying to read the heart beat rate from my Fitbit Versa Lite Smart Watch from my React-Native application, i was able to get the characteristics of the heart rate and was able to get the value in encoded base64 format like below

Heart Rate Data: AAAAAAAAuQAA

when i decoded the base64 string, it is showing me as

 Heart Rate Data: ¹

after having a look into the bluetooth heart rate specifications from the below link

https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Characteristics/org.bluetooth.characteristic.heart_rate_measurement.xml

 <Bit index="0" size="1" name="Heart Rate Value Format bit">
  <Enumerations>
   <Enumeration key="0" value="Heart Rate Value Format is set to UINT8. Units: beats per  
      minute (bpm)" requires="C1"/>
   <Enumeration key="1" value="Heart Rate Value Format is set to UINT16. Units: beats per 
      minute (bpm)" requires="C2"/>
  </Enumerations>
 </Bit>

 <Field name="Heart Rate Measurement Value (uint16)">
   <InformativeText> Note: The format of the Heart Rate Measurement Value field is dependent 
    upon bit 0 of the Flags field. </InformativeText>
   <Requirement>C2</Requirement>
   <Format>uint16</Format>
   <Unit>org.bluetooth.unit.period.beats_per_minute</Unit>
 </Field>

now considering the above explanation from the link, do i need to consider the 1 as unit of measurement or 1 as the Bytes of data which i received from the heart rate sensor.

React-Native Code for reading the characteristics:

async readData(device) {
  const services = await device.services();
  console.log("Services:",services);
  const characteristics = await services[1].characteristics();
  // console.log(JSON.stringify(characteristicW));
  console.log("Characteristics:",characteristics);
 characteristics[0].monitor((err, update) => {
  if (err) {
    console.log(`characteristic error: ${err}`);
    console.log(JSON.stringify(err));
   } else {
    console.log("Is Characteristics Readable:",update.isReadable);
    console.log("Heart Rate Data:",base64.decode(update.value));
    var data = new Uint16Array(base64.decode(update.value));
    console.log("Heart Beats:",data[1]);
   }
 });
}

Any help is appreciated.

Thank you.

1
I'm guessing that as that is the superscript 1 character, there's something else going on. Are you using the heart rate library from dev.fitbit.com/build/guides/sensors/heart-rate?Charles Bamford
@CharlesBamford Have updated my post with code which reads the characteristics. Am i doing something wrong? I'm using react-native-ble-plx library from polidea.Madhu
In your code, I don't see how you are getting the "Flags" attribute, and then how you are taking that value and extracting the first bit (not byte).Greg Fenton

1 Answers

0
votes

Looks to me like your output from base64.decode(update.value) is ¹. That is the Unicode representation of hex value 0xB9, or decimal value 185.

Not clear to me from your code that this is the appropriate way to decipher the Characteristic you are getting in update. Maybe have your code be closer to the example documented in the wiki?