骑行速度与踏频传感器的BLE Gatt特性数据解析与运算

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 骑行速度和踏频传感器,带蓝牙低功耗强文本

Csa*_*oth 4

我正在为BLE传输GATT CSC测量值的单元开发一个应用程序(https://github.com/oesmith/gatt-xml/blob/master/org.bluetooth.characteristic.csc_measurement.xml)。我下面描述的不是 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 除法和溢出逻辑以及滑动窗口。您仍然有最后的手段可以回退到您自己测量的时间戳,但这在我的情况下适得其反:当手机在锻炼期间进入锁定模式然后再次解锁时,所有测量值都会立即涌入应用程序渲染我的时间戳无效,我的计算变得离谱。因此,如果可能的话,请尽量遵循设备的读数。


不是 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 秒溢出一次)。