从“室内自行车数据”特征解码蓝牙数据

时间:2020-09-22 03:15:16

标签: javascript bluetooth bluetooth-lowenergy

我正在尝试使用“健身器材服务”和“室内自行车数据”特征来获取踏频数据。通过使用nRF Connect Android App,我可以看到数据在其中,示例数据:

inst. speed  8.5km/h
inst. cadence 45.0 per min
inst. power 8W
Heart rate 0 bpm

//same data as hex 44 02 52 03 5A 00 08 00 00 

在查看“室内自行车数据”特性的规范时,它说标记字段应编码为16bit(spec),但是当我尝试类似的方法时,

const characteristic = await char.startNotifications()
characteristic.addEventListener('characteristicvaluechanged', (data) => {
  const flags = data.getUint16(0, true);
    
  console.table([ flags & 0x0,flags & 0x1, flags & 0x2,flags & 0x3, flags & 0x4,flags & 0x5, flags & 0x6,flags & 0x7, flags & 0x8,flags & 0x9, flags & 0x10,flags & 0x11, flags & 0x12,flags & 0x13, flags & 0x14,flags & 0x15, flags & 0x16])
});

输出:

enter image description here

数据与nRF Connect Android上的上述数据不匹配。有谁知道为什么提供的数据和屏幕截图中的值不匹配以及我如何获取其余数据?

1 个答案:

答案 0 :(得分:2)

您对flags字段进行的按位操作看起来不正确。

我已经执行以下操作:

var ble_bytes = new Uint8Array([0x44, 0x02, 0x52, 0x03, 0x5A, 0x00, 0x08, 0x00, 0x00]).buffer;
var view = new DataView(ble_bytes)

flags = view.getUint16(0, true);
var i;
for (i = 0; i < 16; i++) {
  console.log('flags[' + i + '] = ' + (!!(flags >>> i & 1)));
}
console.log('Instantaneous Speed = ' + view.getUint16(2, true) / 100)
console.log('Instantaneous Cadence = ' + view.getUint16(4, true) * 0.5)
console.log('Instantaneous Power  = ' + view.getInt16(6, true))
console.log('Heart Rate  = ' + view.getUint8(8, true))

哪个给了我输出:

> "flags[0] = false"
> "flags[1] = false"
> "flags[2] = true"
> "flags[3] = false"
> "flags[4] = false"
> "flags[5] = false"
> "flags[6] = true"
> "flags[7] = false"
> "flags[8] = false"
> "flags[9] = true"
> "flags[10] = false"
> "flags[11] = false"
> "flags[12] = false"
> "flags[13] = false"
> "flags[14] = false"
> "flags[15] = false"
> "Instantaneous Speed = 8.5"
> "Instantaneous Cadence = 45"
> "Instantaneous Power  = 8"
> "Heart Rate  = 0"

这表示存在Instantaneous Cadence presentInstantaneous Power presentHeart Rate present。字段Instantaneous Speed始终存在。

我已经据此转换了字节,这似乎与您从nRF Connect应用程序中获得的匹配。

相关问题