2017-02-08 6 views
2

接続されているBluetooth LEデバイス(Genuino 101)のフロート特性を読み取ろうとしています。テストの目的で、このデバイスは、ハードコードされた値'55 .3 'を持つFloatCharacteristicを提供します。私は何とかフロートに似ている文字列を受け取ることができますが、私は実際のフロート値を読み取ることはできません。これは、Androidデベロッパーのホームページからhttps://developer.android.com/samples/BluetoothLeGatt/index.html BLEデモプロジェクトから直接コピーされ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()); 
     } 


はここで文字列を処理するコードフラグメントです。 の意図は、このスニペットによって処理されます:

スワップエンディアンを脇に置き、出力だから、

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

、につながる

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

が、これは55.3fの正しい進値です。
しかし、私がcharacteristic.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 
... 

あり、ここで私のミスは何ですか?また、私はどのようにオフセットパラメータを理解する必要がありますか分かりません。バイト単位のオフセットですか? LSBからMSBを数えますか? また、getFloatValue()のドキュメントでは、 "returns float - 指定されたオフセットでの特性のキャッシュされた値、または要求されたオフセットが値のサイズを超えた場合はnull"が返されます。しかし上記のスニペットはどんなgatt特性の最大サイズをも大幅に超えていますが、 'null'を返す代わりに例外をスローします。 ここでフロートを得る正しい方法は何ですか?

+0

当分の間、私はデータを 'float f1 = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN).getFloat();'という形式で書いてくれました。これは「速く汚れた」ハックですが、 dではなく専用のgetFloatValue()メソッドを使用します。 – UnbescholtenerBuerger

+0

そして1バイトをintに解析しようとすると? –

+1

私はループしていますが、characteristic.getFloatValue(BluetoothGattCharacteristic.FORMAT_FLOAT、0)のオフセットは常に0に設定されているため、各ループで同じ値が得られます。代わりに "i"に設定してみてください。 – Nebr

答えて

0

当分の間、私は

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

でデータをフォーマットすることで自分自身を助けました。

関連する問題