如何在Java中解析BluetoothGattCharacteristic值

时间:2019-05-17 11:20:58

标签: java android c arduino bluetooth-gatt

我目前在尝试弄清楚如何将数据从ESP32微控制器传输到android手机方面有些迷失。我已经成功发送和读取了特征值,但是不知道如何解析它。.现在,我正在发送简单的整数值= 15

我发现数据是使用字节数组发送的,因此我将其转换为十六进制字符串,结果31-35-2E-30-30毫无意义。检查 nRF connect 应用程序,它还会显示相同的十六进制结果,但除此之外,它还将值解析为15.00

这是Arduino代码:

...
char txString[8];
int someNumber = 15;
dtostrf(someNumber, 1, 2, txString);

_pCharacteristicNotify -> setValue(txString);
_pCharacteristicNotify -> notify();
...

Android Studio

public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
    _handler.handleMessage(Message.obtain(null, ..., characteristic));
}

private Handler _handler = new Handler() {
    public void handleMessage(Message msg) {
        // ------- The problem is here ----------------
        BluetoothGattCharacteristic characteristic;
        characteristic = (BluetoothGattCharacteristic) msg.obj;
        String value = Utils.parseBLECharacteristicValue(characteristic);
        // the value is "31-35-2E-30-30"
        // HOW TO GET THE NUMBER 15 ??
    }
};

我正在使用的解析方法是从这里Example 1

有人可以解释我如何解析给定值吗?

如果提供的值是字符串"abcd123"而不是整数,逻辑将如何改变?

1 个答案:

答案 0 :(得分:1)

31-35-2E-30-30是字符串15.00的ASCII表示。

根据dtostrf() documentation

  

转换以“ [-] d.ddd”格式进行。

由于调用的第三个参数为2,因此用两个十进制值解释了字符串15.00。

尝试使用Arduino的String constructor进行整数到字符串的转换。然后,您可以使用Android中的Integer类,按照此answer所述,将字符串转换回整数。