【问题标题】: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

问题:

  1. GATT 是否使用这种“打包”技术来节省空中空间?
  2. 我这样做是否正确?
  3. NodeJS 是否有一个库来处理这种数据打包和解包?似乎是一个非常常见的场景。我搜索过 NPM,但我不确定这个概念叫什么。

【问题讨论】:

    标签: node.js bluetooth type-conversion gatt


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多