2017-09-01 74 views
1

我正在学习蓝牙,具体如何实现GATT characteristic specs,所以我可以写周边驱动程序。在几乎所有的规格中,他们都希望使用整数数据类型来保存十进制值(当数据是十进制值时)。BLE GATT:为什么要在整数类型中存储小数?

例如,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如我所料。

问题:

  1. 不GATT用这种 “包装” 技术,以节省空间,在空中?
  2. 我正确地做这件事吗?
  3. 是否NodeJS有一个库来处理这个数据打包和解包?似乎是一种非常常见的情况。我已经搜查了NPM,但我不确定这个概念被称为什么。

回答

1

比例整数像这些被用来简化在小型嵌入式设备的实现。

由于成本和功耗的原因,所用的微控制器通常没有FPU(即硬件支持浮点计算)。在那些没有FPU的应用程序中,可以使用软件浮点库,但是这些库很慢(因此它们消耗功率),并且它们占用了代码空间。即使在具有FPU的微控制器上,使用它也会增加功耗,对于浮点数使用四个字节也会增加RAM使用量(另一个稀缺资源),而缩放整数版本只有一个字节。

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

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

相关问题