San*_*nan 5 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 -> 8bits 所以两者都是真的,因此我们可以得到车轮和曲柄各自的值。
累积轮转数- 6D 01 00 00 -> 32 位,因此以小端顺序反转蓝牙值,即 00 00 01 6D 并将其转换为十进制,我们得到-365
最后一个轮子事件时间- FC 7E -> 16 位,因此以小端顺序反转蓝牙值,即 7E FC 并将其转换为十进制,我们得到-32508
Cumulative Crank Revolutions- 2C 01 -> 16bits 所以在小端即 01 2C 中反转蓝牙值并将其转换为十进制我们得到-300
上次曲柄事件时间 - F8 7E -> 16 位,因此以小端顺序反转蓝牙值,即 7E F8 并将其转换为十进制,我们得到 - 32504
在这里,我们只为我们的应用程序使用了轮子和曲柄旋转值,所以我们面临一个问题,即使在停止循环后曲柄或轮子的最后一个值仍在重复,并且该值从前一个事件值继续高而异常。在这里,我怀疑Last Wheel 和 Crank 事件时间将发挥重要作用. 但我不确定这些时间字节背后的功能和目的。主轮和曲柄值的单位更少,因此我们不知道我们必须做哪种类型的转换。我们如何获得正确的实时值来计算循环运动时的 RPM 和速度。我们应该如何在 C# 编码中使用最后一个事件时间?我们如何将时间事件纳入我们的逻辑?请指导我们完成这个解析过程。我使用的设备是SunDing515 骑行速度和踏频传感器,带蓝牙低功耗。强文本
我正在为BLE传输GATT CSC测量值的单元开发一个应用程序(https://github.com/oesmith/gatt-xml/blob/master/org.bluetooth.characteristic.csc_measurement.xml)。我下面描述的不是 C# 或 Java 特定的概念,而是通用的。
csc_measurement.xml文件时,您会发现单位是 1/1024 秒。因此,您必须将您提到的值(32508 和 32504)相除才能获得纯第二读数。然而,由于该读数作为 UInt16 传输,这也意味着该变量每 64 秒就会溢出。我不知道为什么这个 GATT 特性是这样设计的,他们可以在这里使用 UInt32 (或 UInt24),就像轮子旋转一样,但这就是我们所拥有的。因此,您的任务是根据该数据计算瞬时踏频值。当您还考虑到有时骑手可能会以每分钟 20-30 转曲柄旋转的速度踩踏时,很明显,我需要的不仅仅是几秒钟的样本数据来计算具有可接受精度的踏频。
话虽如此,如果您的设备仍然为事件时间提供不稳定的数据:请仔细检查 1024 除法和溢出逻辑以及滑动窗口。您仍然有最后的手段可以回退到您自己测量的时间戳,但这在我的情况下适得其反:当手机在锻炼期间进入锁定模式然后再次解锁时,所有测量值都会立即涌入应用程序渲染我的时间戳无效,我的计算变得离谱。因此,如果可能的话,请尽量遵循设备的读数。
不是 C#,而是 Dart 源代码供参考:https://github.com/TrackMyIndoorWorkout/TrackMyIndoorWorkout/blob/develop/lib/devices/gadgets/cadence_mixin.dart
另请注意,如果有人实现了自行车功率计配置文件(https://github.com/oesmith/gatt-xml/blob/master/org.bluetooth.characteristic.cycling_power_measurement.xml),车轮转数时间戳的值为 1/2048 秒分辨率(相对于曲柄转数或 CSC 轮时间戳的 1/1024 秒分辨率),以便每 32 秒溢出一次,而不是每 64 秒溢出一次)。
| 归档时间: |
|
| 查看次数: |
1240 次 |
| 最近记录: |