我们已根据以下链接中的拆分确定了我们在应用中获得的车轮和曲柄传感器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循环速度和蓝牙低能量的节奏传感器。 强文
答案 0 :(得分:0)
我正在为BLE
单元开发一个应用程序,该应用程序可以传输GATT
CSC
个测量值。我下面描述的不是C#或Java特定的概念,而是通用的。
csc_measurement.xml
文件时,您会发现单位为1/1024秒。因此,您必须除以您提到的值(32508和32504)才能获得纯正的第二读数。但是,由于此读数作为UInt16传输,因此这也意味着此变量每64秒溢出一次。我不知道为什么这个GATT特性是这样设计的,他们可以像轮转一样在这里使用UInt32(或UInt24),但这就是我们所拥有的。因此,您需要根据这些数据计算瞬时节奏值。当您还考虑到有时车手可能会以每分钟20-30的曲柄转数踩踏板时,很显然,我需要的不仅仅是示例数据,而是几秒钟的采样数据,即可计算出一个可以接受的精度。
话虽如此,如果您的设备仍提供不确定的事件时间数据:请再次检查1024除法和溢出逻辑以及滑动窗口。您仍然没有办法退回到自己测量的时间戳,但在我看来,这适得其反:当手机在锻炼过程中进入锁定模式,然后又再次解锁时,所有测量值立即涌入应用程序这使我的时间戳无效,并且我的计算变得令人发指。因此,请尽可能坚持使用设备的读数。