BLE GATT:为什么以整数类型存储小数?

BLE GATT: why storing decimal in integer types?

我正在学习蓝牙,具体是如何实现GATT characteristic specs所以我可以编写外设驱动程序。在几乎所有规范中,他们看起来都在使用整数数据类型来保存小数值(当数据是小数值时)。

例如,Cycling Power Measurement spec spec stores the Pedal Power Balance into a uint8. As you can see the Pedal Power Balance value has resolution of 1 decimal place (ex: 10.1). The GATT format types spec 有很多小数点类型(float32 等)。

为什么 GATT 不使用旨在保存十进制数的数据类型?我的猜测是限制通过 BLE 发送的数据大小。对吗?

我正在编写 NodeJs 代码以快速证明一些技术。根据我的假设,这就是我如何猜测一个 "packs" 一个精度为一位的小数到一个带符号的 8 位整数。我在这里使用加速(可以是 +/- 所以使用 signed int):

'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

问题:

  1. GATT 是否使用这种 "packing" 技术来节省 space 无线传输?
  2. 我这样做正确吗?
  3. NodeJS 是否有处理这种数据打包和解包的库?似乎是一个非常普遍的场景。我搜索了 NPM,但我不确定这个概念叫什么。

像这样的缩放整数用于简化小型嵌入式设备上的实现。

出于成本和功耗的原因,所使用的微控制器通常没有FPU(即浮点计算的硬件支持)。在那些没有 F​​PU 的设备上,可以使用软件浮点库,但这些库速度很慢(因此会耗电),并且会占用代码 space。即使在具有 FPU 的微控制器上,使用它也会增加功耗,并且将四个字节用于浮点数也会增加 RAM 使用量(另一种稀缺资源),而缩放整数版本仅使用一个字节。

由于这些原因,在嵌入式世界中,当需要分数数量时使用缩放整数是一种规范。

在 GATT 特性的情况下,也希望使用较小的数据类型,因为您通常希望特性的值不超过 20 个字节。这是因为 ATT MTU 通常设置为 23 字节(并且 ATT 有 3 字节的开销),因为这是可以包含在单个 Link 层数据包中的最长 ATT 数据包(如果数据长度扩展蓝牙 4.2 未实现)。