如何在 android BLE 示例程序中获取从 BLE 接收到的原始字节?

How do I get the raw bytes received in from BLE in the android BLE sample program?

我正在使用此处的 BluetoothLeGatt 示例:https://github.com/android/connectivity-samples/tree/master/BluetoothLeGatt

假设BLE连接、服务和特征检测都正常进行。正在发送的以下数据是特征值。

我从自定义 BLE 设备向智能手机发送字节数组,例如 {0x00、0x01、0x02、0x03、0x04} 行。在 android 程序中,这是在 DeviceControlActivity.java

BroadcastReceiver mGattUpdateReceiver 的 onReceive() 函数中接收的

displayData(intent.getStringExtra(BluetoothLeService.EXTRA_DATA));  

实际上在文本视图中显示它。如果我分析通过 BLE 获得的字符串,并查看各个字节,我会看到类似这样的内容(十六进制值):

0 1 2 3 4 a 33 33 20 33 31 20 33 32 20 33 33 20 33 34 20

每个数字都是一个字节的十六进制值。因此,当从自定义 BLE 设备发送 5 个字节时,我得到 5 个字节 0 到 4,然后是一个字节 'a'(值 10),然后是表示每个字节传输的字符串版本的字符序列。例如,33 33 20 33 31 20 33 32 20 33 33 20 33 34 20 在文本视图中转换为 00 01 02 03 04(20 表示 space)。当自定义设备发送的字节数不同时,此序列中的值会发生变化。

有没有办法根据上面获得的信息知道自定义设备实际发送了多少字节的数据?有没有办法获取 BLE 中接收的原始字节,作为 byte[] 数组或其他东西,而不是字符串?如果这不可能,从上面的字符串中解码从 BLE 接收到的每个字节的正确方法是什么?

您使用的示例已经将数据作为字节数组接收,但它将十六进制表示形式附加到数据作为字符串。这就是您以两种表示形式获取数据的原因。

您需要在 line 149 上更改文件 BluetoothLeService.java 中的示例。目前正在阅读
intent.putExtra(EXTRA_DATA, new String(data) + "\n" + stringBuilder.toString());

您需要将其更改为
intent.putExtra(EXTRA_DATA, new String(data) + "\n");

如果您只想接收字符串表示形式。