2017-09-01 75 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的數據長度擴展不是實現)。

相關問題