了解循环功率测量的 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 的大致接近程度?

降低 ble for android 的 Tx 功率

如何实时测量 PC 组件(cpu、内存、磁盘等)的功率(瓦​​特)?

Android 从 BLE 设备获取温度读数

谁制造了低距离或低发射功率可用或可配置的 BLE 设备

IOS 蓝牙 BLE 写入值返回“未知错误”