2

アンドロイド版。> 4.3 標準 Android ビーコン ライブラリの推定ビーコン。Eddystone-UID パッケージ テレメトリ パッケージ。

Eddystone-UID パッケージ送信の Telemetry パッケージから温度センサー送信を読み取ろうとしています。Android Beacon Library の Eddystone [Telemetry] expamples に従って、温度送信の beacon.getExtraDataFields().get(2) データを正常に読み取ることができます。このデータは、温度に応じて 4 桁または 5 桁の数字として出力されます。

ビーコン温度センサーが8:8の固定小数点数を送信することを同じように通知されました... beacon.getExtraDataFields().get(2)を読み取り、次に256で割ると、摂氏で温度が読み取られます。ただし、温度が 0 ℃ を超えて負になるとすぐに、大きな不一致が生じます。フォーラムでの調査によると、符号付き 8:8 固定表記法と 10 進数への変換に関係しているようです。8:8 の固定小数点表記の概念は理解していますが、Android ビーコン ライブラリのメソッドを使用して負の固定小数点を読み取り、負の degC に変換する方法に関するリファレンスを見つけることができないようです。

[注: Estimote の Android SDK とそのビーコン アプリにも同じ問題がありました...彼らは SDK を更新することでこれを修正しました...私は Android ライブラリを使用していますが、Estimote SDK は使用していません]

ガイダンスは非常に高く評価されます。

4

2 に答える 2

4

以下のコードは、エンコードされた Eddystone テレメトリ温度フィールドを摂氏に変換するために使用されます。これは、 Android Beacon Libraryも使用するLocate 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;

お手持ちのビーコンでこの変換式をお試しいただけます。うまくいかない場合は、Locate アプリを試して、同じものが表示されることを確認してください。その場合、エンコードされた値が Eddystone 仕様に完全に準拠していない可能性があります。

于 2015-10-28T14:32:07.933 に答える
0

このメソッドをdavidgyoung変換式と共に使用して、ビーコンから温度を取得し、小数点以下 2 桁の float にキャストします。

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 に答える