首页 > 解决方案 > 从 Indoor Bike Data 特征解码蓝牙数据

问题描述

我正在尝试使用 Fitness Machine Service + Indoor Bike Data 特性来获取踏频数据。通过使用 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 

查看室内自行车数据特征的规范,它说标志字段应该编码为 16 位(规范)但是当我尝试类似的东西时,

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])
});

输出:

在此处输入图像描述

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

标签: javascriptbluetoothbluetooth-lowenergy

解决方案


您对标志字段的按位操作看起来不正确。

我做了以下事情:

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 present, Instantaneous Power present, Heart Rate present。该字段Instantaneous Speed始终存在。

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


推荐阅读