Android 信标库 Eddystone 遥测。温度

Android Beacon Library Eddystone Telemetry. Temperature

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

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

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

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

非常感谢指导。

下面的代码用于将编码的 Eddystone 遥测温度场转换为摄氏度。这是取自Locate Android app, which also uses the Android Beacon Library。此代码已使用 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 规范。

我将此方法与 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;
}