BLE GATT:为啥以整数类型存储十进制?
Posted
技术标签:
【中文标题】BLE GATT:为啥以整数类型存储十进制?【英文标题】:BLE GATT: why storing decimal in integer types?BLE GATT:为什么以整数类型存储十进制? 【发布时间】:2017-09-01 21:30:49 【问题描述】:我正在学习蓝牙,特别是如何实现GATT characteristic specs,以便我可以编写外围驱动程序。在几乎所有规范中,它们看起来都在使用整数数据类型来保存十进制值(当数据是十进制值时)。
例如,Cycling Power Measurement spec 规范将Pedal Power Balance
存储到uint8
中。如您所见,Pedal Power Balance
值的分辨率为小数点后 1 位(例如:10.1
)。 GATT format types spec 有很多小数点类型(float32
等)。
为什么 GATT 不使用旨在保存十进制数的数据类型?我的猜测是限制通过 BLE 发送的数据大小。对吗?
我正在编写 NodeJs 代码来快速证明一些技术。根据我的假设,这就是我猜测一个将一位精度的小数“打包”成有符号的 8 位整数的方式。我在这里使用加速(可以是 +/- 所以使用有符号整数):
'use strict';
const oneG = -9.806649999788;
let int8Buf = new Buffer.alloc(8); //to hold signed 8-bit integer
int8Buf.writeInt8(oneG * 10, 0);
console.log(int8Buf.readInt8(0) / 10);
按照我的预期运行此输出 -9.8
。
问题:
-
GATT 是否使用这种“打包”技术来节省空中空间?
我这样做是否正确?
NodeJS 是否有一个库来处理这种数据打包和解包?似乎是一个非常常见的场景。我搜索过 NPM,但我不确定这个概念叫什么。
【问题讨论】:
【参考方案1】:像这样的缩放整数用于简化小型嵌入式设备上的实现。
出于成本和功耗的原因,所使用的微控制器通常没有 FPU(即硬件支持浮点计算)。在那些没有 FPU 的情况下,可以使用软件浮点库,但这些库速度很慢(因此会消耗电力),并且会占用代码空间。即使在确实有 FPU 的微控制器上,使用它也会增加功耗,并且使用四个字节的浮点数也会增加 RAM 使用量(另一种稀缺资源),而缩放整数版本只使用一个字节。
由于这些原因,在嵌入式世界中,当需要小数时,通常使用缩放整数。
在 GATT 特性的情况下,还希望使用较小的数据类型,因为您通常希望特性的值不超过 20 个字节。这是因为 ATT MTU 通常设置为 23 个字节(并且 ATT 有 3 个字节的开销),因为这是可以包含在单个链路层数据包中的最长 ATT 数据包(如果蓝牙 4.2 的数据长度扩展不是实施)。
【讨论】:
以上是关于BLE GATT:为啥以整数类型存储十进制?的主要内容,如果未能解决你的问题,请参考以下文章