javascript - 从 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 的上述数据不匹配。有谁知道为什么提供的数据和屏幕截图中的值不匹配以及如何获取其余数据?
解决方案
您对标志字段的按位操作看起来不正确。
我做了以下事情:
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 应用程序中获得的内容相匹配。
推荐阅读
- r - 如何将一周中每一天的平均每小时数据可视化为 R 中 7 天的 facet_wrap?
- orocommerce - 是否可以让用户使用相同的登录名向不同的客户下订单?
- android - 是否有必要在完成调用之前设置内容视图?
- sql - PostgreSQL - 使用 group by 子句创建一个 jsonb 数组
- node.js - 我们可以使用正斜杠在 nginx 上部署和访问具有相同端口号的多个 nodejs 应用程序吗?
- postgresql - 使用 heroku pg:pull 迁移数据库处于分离状态
- javascript - 如何使 html5 视频控件始终打开/显示。?
- r - 如何在维恩图中添加超过 6 组的计数值?
- java - 在 teamcity 中构建项目时,在 gradle 中央插件存储库中找不到 Org.springframework.boot 插件
- amazon-web-services - 即使未将 s3 存储桶指定为请求者付费,我是否可以为数据传输付费?