代码之家  ›  专栏  ›  技术社区  ›  mornindew

心率值(BLE)

  •  0
  • mornindew  · 技术社区  · 3 年前

    List<int> value = [22, 56, 55, 4, 7, 3];
    

    标志字段: 我将主字节数组中的第一项转换为二进制以获取标志

    22 = 10110 (as binary)
    

    这使我相信它是U16(位[0]是==1)

    HR值:

    因为它是16位的,所以我正在尝试获取1&中的字节;2个索引。然后我尝试将它们缓冲到一个ByteData中。从那里我可以把它们转换成Uint16,Endian设置为Little。这给了我一个14136的值,很明显我缺少了一些基本的东西,关于它应该如何工作。

    如果您能帮助我澄清我不了解的关于如何处理16位BLE值的问题,我们将不胜感激。

    非常感谢。

      /*
    Constructor - constructs the heart rate value from a BLE message
     */
      HeartRate(List<int> values) {
        var flags = values[0];
        var s = flags.toRadixString(2);
        List<String> flagsArray = s.split("");
    
        int offset = 0;
    
        //Determine whether it is U16 or not
        if (flagsArray[0] == "0") {
          //Since it is Uint8 i will only get the first value
          var hr = values[1];
          print(hr);
        } else {
          //Since UTF 16 is two bytes I need to combine them
          //Create a buffer with the first two bytes after the flags
          var buffer = new Uint8List.fromList(values.sublist(1, 3)).buffer;
          var hrBuffer = new ByteData.view(buffer);
          var hr = hrBuffer.getUint16(0, Endian.little);
          print(hr);
        }
      }
    
    0 回复  |  直到 3 年前
        1
  •  6
  •   Rob Napier    3 年前

    你更新的数据看起来好多了。下面是如何破译它,以及你自己从零开始解决这个问题的过程。

    这个 Bluetooth Heart Rate Service (HRS)文档,从主 GATT page ,但就解析格式而言,我所知道的最好的源代码是 org.bluetooth.characteristic.heart_rate_measurement . (由于重组,我不知道你怎么能找到这个页面而不搜索它。似乎再也没有联系了。)

    位的编号从LSB(0)到MSB(7)。

    • 位0-心率值格式:0=>每分钟8次
    • 位3-能量消耗状态:0=>不存在
    • 位4-RR间隔:1=>存在一个或多个值

    RR间隔的含义在上面链接的HRS文件中解释。听起来你只是想要心率值,所以我不在这里讨论。

    字节1-UINT8 BPM:56

    字节2-5-UINT16 RR间隔:55、4、7、3

    您可能不关心这些,但是这里有两个UINT16值(可以有任意数量的RR Interval值)。BLE总是小endian,所以[55,4]是1079(55+4<&书信电报;8) ,并且[7,3]是775(7+3<&书信电报;8).

    我相信医生在这个问题上有点困惑。XML表明这些值是以秒为单位的,但是注释说“分辨率为1/1024秒” <BinaryExponent>-10</BinaryExponent>

    • RR1:0.76s(775/1024)