我想从我们开发的移动应用程序的 11 字节数据中识别 BLE 车轮和曲柄传感器数据

I want to identify the BLE wheel and crank sensor data from the 11-bytes data from a mobile application we have developed

我想从 11 字节 数据中识别车轮和曲柄传感器数据。我试图根据下面 link 中的拆分来解析我在移动应用程序中获得的 11 字节十六进制数据。

https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Characteristics/org.bluetooth.characteristic.csc_measurement.xml

例如我尝试了以下方法,

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

Flag-03 ->0000 0011 -> 8bits 所以两者都是真的因此我们可以得到轮子和曲柄各自的值。

累计车轮转数 - 6D 01 00 00 -> 32 位,因此将其转换为十进制我们得到 -1828782080

Last Wheel Event Time- FC 7E -> 16 位因此将其转换为十进制我们得到 - 64638

累积曲柄转数 - 2C 01 -> 16 位,因此将其转换为十进制我们得到 - 11265

Last Crank Event Time- F8 7E -> 16 位所以将其转换为十进制我们得到 - 63614

我无法从 BLE 获得实际的车轮和曲柄测量值。我所遵循的参考 link 中所理解的上述程序是否正确?还是我在其他地方错了?我已尽最大努力剖析和解析数据,但不幸的是我无法找到解决方案。请指导我完成这个过程。我们必须做什么才能获得正确的价值?就像我应该将它乘以某个数字吗?我尝试过不同的组合但无法获得。我使用的设备是 SunDing515 自行车速度和脚踏圈速传感器,带低功耗蓝牙

根据您的数据和数据 sheet,我们看到这些值使用的是无符号整数。 (uint16 或 uint8)。 None 你的价值应该是负数。

通常,蓝牙值是小端而不是大端。 示例:

6D010000 应读取 00 00 01 6D = 365

FC7E 应读为 7E FC = 32508

2C01 应该读作 01 2C = 300

F87E 应该读作 7E F8 = 32504

我不知道你是否明白你在寻找什么,但字节顺序确实帮助了我。您需要做的基本过程是读取数据两次。然后使用时间差和曲柄转数的差(我只做了曲柄)乘以 1024(根据规格)。

所以假设你有小端示例: 累计曲柄转数 (CCR) 为 300,上次曲柄事件时间 (LCET) 为 23504(单位的分辨率为 1/1024s。)。再次读取数据,您将获得略高的 CCR(例如 301 或 302)和更高的 LCET,例如 24704。然后从较旧的(24704-23504)中减去较新的 LCET,得到 1200 和 Higer CCR降低 CCR (302-300) 得到 2。然后将 CCR 乘以 1024,然后除以 LCET 的差值。给你1.7。那是你每次阅读的轮换。然后乘以 60 得到每分钟转数。 (102.4)

Dennis Rutherford 的回答是正确的方向,但我认为我们应该考虑骑自行车的性质和力学:如果有人以 20 rpm 的速度爬坡(我知道这是极端的,但它可能会发生!) ,那么曲柄每秒转动不到 1/3。因此,在这种情况下,乘以 60 会产生高度可变的数据。

事件时间的分辨率足够高(1/1024s),但车轮和曲柄的转数只是简单的计数,因为传统的磁传感器无法提供小数转数。

因此我的解决方案是滑动 window 来计算瞬时节奏:如果我们等待足够的时间(20-30 秒),那么我们可以满足于瞬时较少但更稳定的读数。

正确处理事件时间值的溢出也很重要,因为对于 UInt16 字节,它每 64 秒溢出一次。因此,如果最后一个事件时间低于第一个事件时间,则会发生溢出,对于我们的计算,我们需要将最后一个事件时间增加 64 秒。还要注意我们的时间window不能太大,否则多次溢出会融合在一起,计算就跑了。

最后:请检查 1826 GATT 服务的 2AD2“室内自行车数据”GATT 特性,因为如果你幸运(我不是),那么你会得到那里提供的瞬时节奏,你会从所有这些恶作剧。