2

安卓版本。> 4.3 标准 Android 信标库估计信标。Eddystone-UID 包遥测包。

我正在尝试从 Eddystone-UID 包传输的遥测包中读取温度传感器传输。根据 Android Beacon 库中的 Eddystone [Telemetry] 示例,我可以成功读取 beacon.getExtraDataFields().get(2) 数据以进行温度传输。此数据根据温度打印为 4 位或 5 位数字。

我被告知信标温度传感器传输一个 8:8 的定点数...读取 beacon.getExtraDataFields().get(2) 然后除以 256 我得到摄氏温度读数。然而,一旦温度超过 0 摄氏度进入负值,我就会得到很大的差异。论坛中的研究似乎表明它与带符号的 8:8 固定符号数学和转换为十进制有关。虽然我了解 8:8 定点符号概念,但我似乎无法找到有关如何使用 Android 信标库方法读取负定点并转换为负 degC 的参考。

[注意:Estimote 的 Android SDK 和他们的信标应用程序有同样的问题......他们通过更新他们的 SDK 解决了这个问题......我使用的是 Android 库而不是 Estimote SDK]

指导将不胜感激。

4

2 回答 2

4

下面的代码用于将编码的 Eddystone 遥测温度场转换为摄氏度。这取自Locate Android 应用程序,该应用程序也使用Android 信标库。此代码已使用 Radius Networks 的 Eddystone 信标进行了测试。

long unsignedTemp = (beacon.getExtraDataFields().get(2) >> 8);
double temperature = unsignedTemp > 128 ? 
    unsignedTemp - 256 : 
    unsignedTemp +(beacon.getExtraDataFields().get(2) & 0xff)/256.0;

您可以使用手头的信标尝试此转换公式。如果您发现它不起作用,还请尝试使用定位应用程序以确保您看到相同的内容。如果是这种情况,可能是编码值不完全符合 Eddystone 规范。

于 2015-10-28T14:32:07.933 回答
0

我使用这种方法和davidgyoung转换公式从信标中检索温度,同时转换为带有两位小数的浮点数:

public static float getTemperatureFromBeacon(Beacon beacon) {
    long unsignedTemp = (beacon.getExtraDataFields().get(2) >> 8);
    double temperatureDouble = unsignedTemp > 128 ?
            unsignedTemp - 256 :
            unsignedTemp + (beacon.getExtraDataFields().get(2) & 0xff) / 256.0;
    float temperature = (float) Math.round(temperatureDouble * 100) / 100;
    return temperature;
}
于 2016-01-21T12:35:06.800 回答