xamarin.android - 如何从蓝牙 LE (SIG) 十六进制值中提取重量值
问题描述
我正在开发一个 xamarin android 应用程序来连接蓝牙低能量体重秤。我已经可以连接到设备并探索它的服务和特性,但是我在提取它的价值时遇到了一些问题。
该秤实现了蓝牙 SIG 标准,因此我希望它具有体重秤服务 (org.bluetooth.service.weight_scale) 和体重测量特性 (org.bluetooth.characteristic.weight_measurement)。显然不是。
探索设备服务,读取服务接缝为“未知服务”(0000ffe0-0000-1000-8000-00805f9b34fb),特征接缝为“TI SensorTag Keys Data”(0000ffe1-0000-1000-8000-00805f9b34fb) .
以下是参考服务的一些示例读数:
- 对于 78.4 公斤,我得到了 E7-58-01-06-20
- 对于 81.6 公斤,我得到了 E7-58-01-06-60
- 对于 81.7 公斤,我得到了 E7-58-01-06-62
- 对于 118.6 公斤,我得到了 E7-58-01-09-44
该秤支持体重读数、体脂、体内水分、肌肉量、骨量、巴塞尔代谢率和活跃代谢率。我想我正在使用权重只读模式。我已经将十六进制值转换为十进制,但输出值不是直接的。
我应该使用什么公式来提取值?
解决方案
如果您只关心特征值的最后两个字节:06-20、06-60、0--62 和 09-44。您可以将它们与秤上显示的重量进行比较:
> 0x620/78.4 -> 20.0
> 0x660/81.6 -> 20.0
> 0x662/81.7 -> 20.0
> 0x944/118.6 -> 20.0
这意味着特征值的低两个字节表示的数字中的每个数字等于一公斤的1/20 = 50g。
要在应用程序中显示权重,只需将特征值的最后两个字节转换为主机整数表示(ntohs
或等效的https://linux.die.net/man/3/ntohs)并将其除以 20。
推荐阅读
- annotations - Mask R-CNN 中的边界框大小 - 太短
- css - 访问 SVG 图像 Flutter 中的组件
- amazon-web-services - AWS Step 函数参数没有移动到下一步
- racket - DrRacket 中参考悬停时图形问号的含义?
- flutter - 如何修复 RenderBox 未在 ListTile 中列出?
- verilog - Verilog 中未解决的对“fulladder”的引用
- c# - 同一张表的多对多关系。英孚
- mysql - 通过(选择结果)mysql更新行
- javascript - JavaScript Click-Event 触发器每次点击触发多次
- java - 为什么 UriComponentsBuilder 忽略空查询参数?