Android Bluetooth LE - чтение характеристик с плавающей точкой

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

// 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 с домашней страницы разработчика Android. Намерение затем обрабатывается этим фрагментом:

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.
Однако, если я пытаюсь использовать характеристику.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 - кэшированное значение характеристики с заданным смещением или ноль, если запрошенное смещение превышает размер значения.". Но приведенный выше фрагмент значительно превышает максимальный размер любой характеристики Гатта, но вместо того, чтобы возвращать "ноль", вызов метода генерирует исключения. Так какой правильный способ получить поплавок здесь?

1 ответ

Решение

В настоящее время я помог себе, отформатировав данные с

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

,

Другие вопросы по тегам