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(即硬件支持浮点计算)。在那些没有 F​​PU 的情况下,可以使用软件浮点库,但这些库速度很慢(因此会消耗电力),并且会占用代码空间。即使在确实有 FPU 的微控制器上,使用它也会增加功耗,并且使用四个字节的浮点数也会增加 RAM 使用量(另一种稀缺资源),而缩放整数版本只使用一个字节。

由于这些原因,在嵌入式世界中,当需要小数时,通常使用缩放整数。

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

【讨论】:

以上是关于BLE GATT:为啥以整数类型存储十进制?的主要内容,如果未能解决你的问题,请参考以下文章

为啥mongodb以base64的形式存储二进制数据?

Java复习二 基本数据类型与变量和常量

java, 数据类型

char类型为啥只能存储0-255

Android BLE为啥首次连接蓝牙设备比较慢

GATT特性BLE读取速度慢