如何在 Android Studio 中正确读取浮动特性

How to Properly Read Float Characteristic in Android Studio

我正在使用 ArduinoBLE 库创建服务和特征:

BLEService angleService("1826");
BLEFloatCharacteristic pitchBLE("2A57", BLERead | BLENotify);

我添加服务和特性并宣传我的设备:

  BLE.setLocalName("acsAssist");
  BLE.setAdvertisedService(angleService);
  angleService.addCharacteristic(pitchBLE);
  BLE.addService(angleService);
  pitchBLE.writeValue(0);
  BLE.advertise();

我执行一些计算,然后将我的计算值写入服务:

 pitchBLE.writeValue(posiPitch);

posiPitch 是一个浮点值,例如 1.96。它可以从 -90.00 到 90.00

我尝试从我的 Android 应用中读取这个值:

(characteristic.getFloatValue(BluetoothGattCharacteristic.FORMAT_SFLOAT,0))

我得到了疯狂的数字,例如 -1.10300006E9

如何读取我的浮点值,以便我的 android 应用程序值与 arduino 值匹配?

我通过使用字符串特征大大简化了情况。

虽然这可能会占用更多资源,但它减少了必须解析字节数组以将数据转换为我想要的内容的麻烦。

我的字符串特征是用自定义 UUID 制作的(以避免蓝牙 GATT 标准冲突):

BLEStringCharacteristic pitchBLE("78c5307a-6715-4040-bd50-d64db33e2e9e", BLERead | BLENotify, 20);

在我按照我原来的post做广告和计算后,我简单地写到我的特征并将值作为字符串传递:

pitchBLE.writeValue(String(posiPitch));

在我的 Android 应用程序中,我只是获取特征的字符串值:

characteristic.getStringValue(0)

我希望这对像我这样正在努力寻找更清晰的信息资源的未来开发人员有所帮助:)

我运行遇到了类似的问题。我没有使用 getFloatValue(),而是使用了 getValue(),它 returns 一个字节数组。

出现奇怪数字的原因是arduino存储数据的字节顺序与java不同。

要更改顺序,请使用 byteBuffer:

byte[] b = characteristic.getValue();
float f = ByteBuffer.wrap(b).order(ByteOrder.LITTLE_ENDIAN).getFloat();

这个post帮助了我:How to convert 4 bytes array to float in java