循环速度和步调传感器的BLE Gatt特征数据解析和操作

时间:2018-04-13 09:32:03

标签: c# bluetooth-lowenergy gatt

我们已根据以下链接中的拆分确定了我们在应用中获得的车轮和曲柄传感器Gatt特性测量数据。 " https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.csc_measurement.xml"

例如我们尝试了以下内容,

十六进制数据:0x03 6D010000 FC7E 2C01 F87E

Flag-03 - > 0000 0011 - >因此我们可以获得轮子和曲柄的各自值。

累积轮转速-6D 01 00 00 - >因此,32位反转小端的蓝牙值,即00 00 01 6D并将其转换为十进制,我们得到-365

最后一轮事件时间 - FC 7E - > 16比特如此反转小端的蓝牙值,即7E FC并将其转换为十进制,我们得到-32508

累积曲柄革命-2C 01 - > 16比特如此反转小端的蓝牙值,即01 2C并将其转换为十进制,我们得到-300

最后的曲柄事件时间 - F8 7E - > 16比特如此反转小端的蓝牙值,即7E F8并将其转换为十进制,我们得到-32504

这里我们仅使用了车轮和曲柄转速值,因此我们面临的问题是,即使在停止循环后曲柄或车轮的最后一个值也在重复,并且该值继续前一个事件值有时候价值非常高且异常。在这里,我怀疑 Last Wheel和Crank事件时间将发挥重要作用。但我不确定这些时间字节背后的功能和目的。主轮和曲柄值单位较小,因此我们不知道我们必须做什么类型的转换。我们如何获得正确的实时值来计算循环中的RPM和速度。我们应该如何在C#编码中使用最后一个事件时间?我们如何将时间事件纳入我们的逻辑?请引导我们完成解析过程。我使用的设备是 SunDing515循环速度和蓝牙低能量的节奏传感器强文

1 个答案:

答案 0 :(得分:0)

我正在为BLE单元开发一个应用程序,该应用程序可以传输GATT CSC个测量值。我下面描述的不是C#或Java特定的概念,而是通用的。

  1. 您提到的车轮和曲柄的公转读数是无单位的。这是因为它是转数的简单计数。传感器通常固定在前叉或车轴上,而车轮或轮辐上有一个对应的旋转简单磁铁钻头,每次磁铁通过检测器时,传感器都会计数。对于我的设备,累积转数按预期单调增加。
  2. 乍一看,事件时间数据可能看起来很不稳定。但是,当您仔细查看csc_measurement.xml文件时,您会发现单位为1/1024秒。因此,您必须除以您提到的值(32508和32504)才能获得纯正的第二读数。但是,由于此读数作为UInt16传输,因此这也意味着此变量每64秒溢出一次。我不知道为什么这个GATT特性是这样设计的,他们可以像轮转一样在这里使用UInt32(或UInt24),但这就是我们所拥有的。

因此,您需要根据这些数据计算瞬时节奏值。当您还考虑到有时车手可能会以每分钟20-30的曲柄转数踩踏板时,很显然,我需要的不仅仅是示例数据,而是几秒钟的采样数据,即可计算出一个可以接受的精度。

  1. 设备可能每秒发送多次读数。您需要处理上一个事件时间和/或转数保持不变的情况。您可以丢弃该数据包,或者如果它指示锻炼暂停事件,甚至可以扣除。
  2. 我正在将读数推入LIFO队列。这将提供一个动态长度滑动窗口,用于计算显示节奏。
  3. 我将常数设置为30秒,这将是滑动窗口在时间上的大小。
  4. 对于每个读数,我都会查看队列中的读数是否超过30秒,如果是这样,我会删除最早的读数。
  5. 必须处理事件时间值溢出(每64秒发生一次)的情况。这是我计算节奏读数时的一个简单检查:如果最新读数的时间值小于最旧读数的时间值,则我将最新读数暂时偏移64秒。我还必须提到,如果您的滑动窗口时间大于64秒,则这种简单的逻辑将不起作用,因为这会使计时器多次溢出。
  6. 未指定是否在两次锻炼之间保留累积转数。到目前为止,我还没有看到任何东西,但是我正在处理室内自行车,并且很容易聆听锻炼时的一读,并将其用作补偿。
  7. 如果幸运的话,您的设备可以通过1826 GATT服务的2AD2“室内自行车数据” GATT特性提供瞬时或平均节奏。在这种情况下,您可以在这里摆脱所有这些恶作剧。

话虽如此,如果您的设备仍提供不确定的事件时间数据:请再次检查1024除法和溢出逻辑以及滑动窗口。您仍然没有办法退回到自己测量的时间戳,但在我看来,这适得其反:当手机在锻炼过程中进入锁定模式,然后又再次解锁时,所有测量值立即涌入应用程序这使我的时间戳无效,并且我的计算变得令人发指。因此,请尽可能坚持使用设备的读数。