2017-02-08 6 views
2

Я пытаюсь прочитать характеристику поплавка подключенного устройства Bluetooth LE (Genuino 101). В целях тестирования устройство обеспечивает FloatCharacteristic с жестко закодированным значением «55 .3». Хотя я могу получить строку, которая как-то напоминает float, я не могу прочитать фактическое значение float.
Вот фрагмент кода, который обрабатывает строку:Android Bluetooth LE - считывание характеристик плавающего

// For all other profiles, writes the data formatted in HEX. 
     final byte[] data = characteristic.getValue(); 
     if (data != null && data.length > 0) { 
      final StringBuilder stringBuilder = new StringBuilder(data.length); 
      for(byte byteChar : data) 
       stringBuilder.append(String.format("%02X ", byteChar)); 
      intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString()); 
     } 

это копируется прямо из https://developer.android.com/samples/BluetoothLeGatt/index.html BLE демо-проекта от андроида домашней страницы разработчика. Намерение затем обрабатывается этим фрагментом:

private final BroadcastReceiver mGattUpdateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     System.out.println("Broadcast received"); 
     final String action = intent.getAction(); 
     if (BluetoothLeService.ACTION_GATT_CONNECTED.equals(action)) { 

     } else if (BluetoothLeService.ACTION_GATT_DISCONNECTED.equals(action)) { 

     } else if (BluetoothLeService.ACTION_GATT_SERVICES_DISCOVERED.equals(action)) { 

     } else if (BluetoothLeService.ACTION_DATA_AVAILABLE.equals(action)) { 
      displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA)); 
     } 
    } 
}; 

private void displayData(String data) { 
    if (data != null) { 
     System.out.println("Data Received: " + data); 
    } 
} 

Что приводит к выходу

I/System.out: Data Received: 33]B 
I/System.out: 33 33 5D 42 

Так, отведенной обмениваемых порядком байтов, это правильное шестнадцатеричное значение для 55.3f.
Однако, если я попытаюсь использовать character.getFloatValue(), я получаю только мусор. Вот как я пытался выяснить, как получить реальный поплавок:

final byte[] data = characteristic.getValue(); 
     if (data != null && data.length > 0) { 
      for (int i = 0; i< 333; i++) { 
       try { 
        final float fData = characteristic.getFloatValue(BluetoothGattCharacteristic.FORMAT_FLOAT, i); 
        System.out.println("Offset = "+ i + ". Data that gets sent: " + fData + "/Data that we would expect: " + 55.3f); 
       } catch (Exception e) { 
        System.out.println("Exception at offset " + i); 
       } 
      } 
     } 

выход всегда

I/System.out: Offset = 0. Data that gets sent: Infinity/Data that we would expect: 55.3 
I/System.out: Exception at offset 1 
I/System.out: Exception at offset 2 
... 

Что моя ошибка здесь? Кроме того, я не уверен, как следует понимать параметр Offset. Это смещение в бит, в байте? Подсчет от MSB, от LSB? Также документация getFloatValue() претензий «возвращает float» - кэшированное значение признака при заданном смещении или null, если запрошенное смещение превышает размер значения. ». Но приведенный выше фрагмент грубо превышает максимальный размер любой характеристики gatt, но вместо того, чтобы возвращать «null», вызов метода выдает исключения. Итак, каков правильный способ получить поплавок?

+0

В настоящее время я помог себе, форматируя данные с помощью 'float f1 = ByteBuffer.wrap (data) .order (ByteOrder.LITTLE_ENDIAN) .getFloat();' хотя это «быстрый и грязный взлом», d скорее используйте выделенный метод getFloatValue(). – UnbescholtenerBuerger

+0

И если вы попытаетесь разобрать один байт на int? –

+1

Вы перебираете i, но вы получите одно и то же значение для каждого цикла, потому что смещение в character.getFloatValue (BluetoothGattCharacteristic.FORMAT_FLOAT, 0) всегда равно 0. Попробуйте установить его на «i». – Nebr

ответ

0

на некоторое время, я помог себе путем форматирования данных с

float f1 = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getFloa‌​t(); 

.