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
。
问题:
- GATT 是否使用这种 "packing" 技术来节省 space 无线传输?
- 我这样做正确吗?
- NodeJS 是否有处理这种数据打包和解包的库?似乎是一个非常普遍的场景。我搜索了 NPM,但我不确定这个概念叫什么。
像这样的缩放整数用于简化小型嵌入式设备上的实现。
出于成本和功耗的原因,所使用的微控制器通常没有FPU(即浮点计算的硬件支持)。在那些没有 FPU 的设备上,可以使用软件浮点库,但这些库速度很慢(因此会耗电),并且会占用代码 space。即使在具有 FPU 的微控制器上,使用它也会增加功耗,并且将四个字节用于浮点数也会增加 RAM 使用量(另一种稀缺资源),而缩放整数版本仅使用一个字节。
由于这些原因,在嵌入式世界中,当需要分数数量时使用缩放整数是一种规范。
在 GATT 特性的情况下,也希望使用较小的数据类型,因为您通常希望特性的值不超过 20 个字节。这是因为 ATT MTU 通常设置为 23 字节(并且 ATT 有 3 字节的开销),因为这是可以包含在单个 Link 层数据包中的最长 ATT 数据包(如果数据长度扩展蓝牙 4.2 未实现)。
我正在学习蓝牙,具体是如何实现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
。
问题:
- GATT 是否使用这种 "packing" 技术来节省 space 无线传输?
- 我这样做正确吗?
- NodeJS 是否有处理这种数据打包和解包的库?似乎是一个非常普遍的场景。我搜索了 NPM,但我不确定这个概念叫什么。
像这样的缩放整数用于简化小型嵌入式设备上的实现。
出于成本和功耗的原因,所使用的微控制器通常没有FPU(即浮点计算的硬件支持)。在那些没有 FPU 的设备上,可以使用软件浮点库,但这些库速度很慢(因此会耗电),并且会占用代码 space。即使在具有 FPU 的微控制器上,使用它也会增加功耗,并且将四个字节用于浮点数也会增加 RAM 使用量(另一种稀缺资源),而缩放整数版本仅使用一个字节。
由于这些原因,在嵌入式世界中,当需要分数数量时使用缩放整数是一种规范。
在 GATT 特性的情况下,也希望使用较小的数据类型,因为您通常希望特性的值不超过 20 个字节。这是因为 ATT MTU 通常设置为 23 字节(并且 ATT 有 3 字节的开销),因为这是可以包含在单个 Link 层数据包中的最长 ATT 数据包(如果数据长度扩展蓝牙 4.2 未实现)。