了解循环功率测量的 BLE 特性值 0x2A63
Posted
技术标签:
【中文标题】了解循环功率测量的 BLE 特性值 0x2A63【英文标题】:Understanding BLE characteristic values for cycle power measurement 0x2A63 【发布时间】:2019-01-29 18:33:50 【问题描述】:我目前正在使用 Dart/Flutter BLE 插件来更好地了解 BLE 设备。
插件:
https://pub.dartlang.org/packages/flutter_blue
当我连接到我的虚拟自行车训练器时,我选择了 0x1818 服务,然后我订阅了 0x2A63 特性以进行循环功率测量。
我正在努力将我收到的响应列表与以下有关此服务/特征的 GATT 文档保持一致。此列表中有 18 个值,但 GATTS 列表中只有 17 个。而且这些值似乎没有任何意义。
我还尝试将前两个值 '52','24' 转换为 16 位二进制文件,以查看它是否与第一个字段的标志对齐,但结果如下,这再次没有意义。
0x3418 = 11010000011000
https://www.bluetooth.com/specifications/gatt/viewer?attributeXmlFile=org.bluetooth.characteristic.cycling_power_measurement.xml
这个截图是我第一次连接到教练时的截图。
这张截图是我在自行车上轻轻骑行时的截图
此屏幕截图是我停止骑行但踏板和车轮仍在转动。
自行车训练器是 Cycleops Magnus,它没有 Cycle Speed Cadence 服务 1816,但可以提供基于功率的虚拟速度。
我的问题是这样的:
列表中的哪些值与 GATTS 对应 特征和奖励问题是,我将如何推断速度或 此服务中的值的节奏?
【问题讨论】:
【参考方案1】:基于蓝牙 GATT 规范第 3.55 节:
DEC - [52,24,40,0,58,29,59,0,0,0,107,136,23, 0,214, 81, 1,0]
BIT - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Flag field = 24,52 (bit0 and bit1)
2452 = 00001001 10010100
第 3.55.2.1 节 对应的 (1) 等于
- bit2 = Accumulated Torque Present
- bit4 = Wheel Revolution Data Present
- bit7 = Extreme Torque Magnitudes Present
- bit8 = Extreme Angles Present
- bit11 = Accumulated Energy Present
然后从第 3.55.2 节开始,您将根据标志向下查看位列表: Instant Power 是 bits2 (40) 和 bit3 (0)
(Dec) 0040 == 00000000 00101000 == 40w
为了破译其余的位,我们必须参考 flags 字段,因为 flags 字段之后的剩余位和即时功率必须取决于 flags 字段所说的培训师支持的内容。
基于 flags 字段的 bit2 表示“累积扭矩存在”( 如果标志字段的第 2 位设置为 1,则存在)因此接下来的 2 位表示累积扭矩
Dec (2958)
然后,下一个数据将基于标志字段的第 4 位 - 车轮转速数据存在(如果标志字段的第 4 位设置为 1,则存在)。这是车轮速度,一旦考虑到车轮周长,它就会转化为速度。对于 Wheel Rev Data,这由接下来的 6 位表示。
Cumulative Wheel Revolutions - 4 bits
Last Wheel Event Time - 2 bits
正如您所提到的,该培训师不提供节奏服务,因此您看不到标志字段 (bit5) 为 1。因此您无法从该数据集推断节奏。
对于车轮速度,您将根据 Cum Wheel Rev 和 Last Wheel Event Time 从 6 位解码数据。当您使用颤振时,我无法为您提供如何解码 6 位的代码,而且我没有颤振语言的经验。 (我使用 Swift)但可能会查看 GoldenCheetah 的这段代码并进行相应的转换。
BT40Device::getWheelRpm(QDataStream& ds)
quint32 wheelrevs;
quint16 wheeltime;
ds >> wheelrevs;
ds >> wheeltime;
double rpm = 0.0;
if(!prevWheelStaleness)
quint16 time = wheeltime - prevWheelTime;
quint32 revs = wheelrevs - prevWheelRevs;
// Power sensor uses 1/2048 second time base and CSC sensor 1/1024
if (time) rpm = (has_power ? 2048 : 1024)*60*revs / double(time);
else prevWheelStaleness = false;
prevWheelRevs = wheelrevs;
prevWheelTime = wheeltime;
dynamic_cast<BT40Controller*>(parent)->setWheelRpm(rpm);
【讨论】:
以上是关于了解循环功率测量的 BLE 特性值 0x2A63的主要内容,如果未能解决你的问题,请参考以下文章
iBeacon 广告 - 测量。功率/发射功率以确定与 iBeacon 的大致接近程度?