2015-10-28 3 views
1

Android Vers. > 4,3 Стандартная Android Beacon Library Оценочные маяки. Комплект Eddystone-UID Телеметрический пакет.Android Beacon Library Eddystone Telemetry. Температура

Я пытаюсь прочитать передачу датчика температуры из пакета Telemetry пакета передачи Eddystone-UID. Я могу успешно прочитать beacon.getExtraDataFields(). Получить (2) данные для передачи температуры в соответствии с дополнениями Eddystone [Telemetry] в Android Beacon Library. Эти данные печатаются как 4 или 5-значное число в зависимости от темпа.

Мне сообщили, что датчик температуры маякового радиосигнала передает номер фиксированной точки 8: 8 ... чтение beacon.getExtraDataFields(). Get (2), а затем деление на 256, я получаю показание температуры по Цельсию. Однако, как только temp пересекает 0 degC в отрицательный, я получаю большие расхождения. Исследования среди форумов, похоже, указывают на то, что это связано с подписанной 8: 8 фиксированной математикой и преобразованием в десятичную. Хотя я понимаю концепцию нотации с фиксированной точкой 8: 8, я не могу найти ссылку на то, как читать отрицательную неподвижную точку и преобразовывать ее в отрицательный degC, используя методы Android Beacon Library.

[Примечание: Estimote в Android SDK и их приложение маяка были такая же проблема ... они исправили это, обновляя их SDK ... Я использую Android библиотеку и не Estimote SDK]

Руководства будет наиболее оценили.

ответ

1

Код, приведенный ниже, используется для преобразования закодированного поля температуры телеметрии Eddystone в градусы Цельсия. Это взято из Locate Android app, которое также использует Android Beacon Library. Этот код был протестирован с маяками Eddystone от Radius Networks.

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

Вы можете попробовать эту формулу преобразования с маяками, которые у вас есть. Если вы обнаружите, что он не работает, попробуйте приложение Locate, чтобы убедиться, что вы видите то же самое. Если это так, может быть, что закодированное значение не полностью соответствует спецификации Eddystone.

+0

работал хорошо. Протестировано с маяком Estimote. диапазон температур от +25 до -22 град. Спасибо. – William

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; 
}