当前位置: 首页 > 知识库问答 >
问题:

从BLE设备读取/写入自定义特性

聂永怡
2023-03-14

我正在尝试使用Android Studio作为IDE和Java作为编程语言与温度计BLE设备进行交互。使用智能手机上的应用程序,我发现了该设备在运行过程中暴露的服务:有很多通用服务/特性和一个自定义服务。

首先,我试着阅读

  • 健康温度计服务(UUID=00001809-0000-1000-8000-00805F9B34FB)

从服务列表中恢复特征并访问其描述符:

BluetoothGattCharacteristic temp_char = mBluetoothGattServiceList.get(2).getCharacteristics().get(0); 
for (BluetoothGattDescriptor descriptor : temp_char.getDescriptors()) {
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);
    mBluetoothGatt.writeDescriptor(descriptor);
}
mBluetoothGatt.setCharacteristicNotification(temp_char, true);

在这种情况下,我可以看到测量的结果在on特色变更回调:

public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
float char_float_value = characteristic.getFloatValue(BluetoothGattCharacteristic.FORMAT_FLOAT, 1);
}

然而,在设备随附的文件中,提示通过GATT连接到仪表:

  • 定制服务(UUID=00001523-1212-EFDE-1523-785FEABCD123)

并列出几个8字节的命令,发送到仪表,等待仪表发出8字节的响应。使用具有此格式的帧发送命令

[0x51 CMDData_0Data_1Data_2Data_30xA3 CHK-SUM]

反应是相同的,但有一些小差异。

我可以使用gatt.write特征发送帧,但我不能接收响应帧,总是0x01 0x00作为仪表的唯一答案(2字节而不是8)。

我就是这么做的:

    BluetoothGattCharacteristic custom_char = mBluetoothGattServiceList.get(5).getCharacteristics().get(0);                mBluetoothGatt.setCharacteristicNotification(custom_char, true);
    for (BluetoothGattDescriptor descriptor : custom_char.getDescriptors()) {
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        mBluetoothGatt.writeDescriptor(descriptor);
    }
    byte[] req_frame = new byte[8];
    req_frame[0] = (byte) 0x51;
    req_frame[1] = (byte) 0x24;
    req_frame[2] = (byte) 0x0;
    req_frame[3] = (byte) 0x0;
    req_frame[4] = (byte) 0x0;
    req_frame[5] = (byte) 0x0;
    req_frame[6] = (byte) 0xA3;
    req_frame[7] = (byte) 0x18;
    custom_char.setValue(req_frame);
    mBluetoothGatt.writeCharacteristic(custom_char);

    @Override
    public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS {
    mBluetoothGatt.readCharacteristic(characteristic);
        }
    }

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
    System.out.println("[onCharacteristicRead] status : " + status);
    if (status == BluetoothGatt.GATT_SUCCESS) {
        Log.d(TAG, "[onCharacteristicChanged] " + ByteArrayToString(characteristic.getValue()));
    }
}

@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
    byte[] response = characteristic.getValue();
    Log.d(TAG, "[onCharacteristicChanged] " + ByteArrayToString(response));
    }
}

唯一没有触发的回调是OnCharacteristicRead,我想我会在其中找到帧响应。

我在通信协议中犯了一些错误?如何接收8字节响应帧?

提前感谢!

共有1个答案

勾安翔
2023-03-14

您的错误是一次只允许有一个未完成的Gatt操作。在发送下一个之前,您必须等待回调。有关更多信息,请参阅Android BLE BluetoothGatt.write描述符()返回有时为false。

 类似资料:
  • 我拥有一个极地H10胸带,它以蓝牙低能量运行,并提供心率和心率变化。 我想用Android应用程序读取这些值。由于官方BLE教程中的帮助,我能够连接到设备。现在的问题是从设备中读取心率和心率变异性值。每次设备上有新值可用时,我都要读取该值(并且至少每秒都有新值)。 我找到了以下代码: 假设我与设备有连接,我如何使用它来提取心率和r-r间隔(节拍到节拍间隔)?如果有人能举个简短的例子,我会很高兴。此

  • 问题内容: 我正在使用在Xcode上使用Swift的应用程序,该应用程序连接到蓝牙BLE外设。我已经建立了与设备的连接,并想从特定特征(特别是服务UUID FFF0中的FFF1)读取一些数据。 如果要查找其信息的特征是,我可以使用以下代码请求特征的读取: 我想知道的是:如何检查此读取值是否是我要的值。我希望能够执行if语句,以针对该特征的发现值检查我的值。 例如:如果发现的值为X,则执行其他操作;

  • 我正在开发一个与硬件设备连接的BLE(蓝牙LE)应用程序。我能够发现并连接到设备,从设备读取数据,将数据写入设备。 我在苹果的BLE文档中找不到的是,当你靠近一台设备时,当应用程序关闭时,如何获得通知。 我知道如何注册到特征通知,但此通知仅在应用程序位于后台时发生。 我知道可以在应用程序关闭时检测蓝牙,并发送通知,但我想在设备发现具有的特定BLE时收到通知。 iBeacon正在将BLE与UUID、

  • 我正在尝试在Sony SmartWatch 3上实现BluetoothGattServer。 我可以成功地打开Gatt服务器并做广告。 使用BLE扫描仪应用程序,我在发现我的自定义服务及其自定义特征时得到不一致的结果。 在三星Galaxy Note 8-Android 4.4-上,我可以正确检测自定义服务和自定义特性 这是我在Wear设备上运行的代码: 我还尝试使用自定义生成的UUID从https

  • 我是新来的JavaScript,所以我可能有一些非常规的编程方式。也就是说,我正在做一个项目,我需要读写数据到自定义BLE设备。我使用gatt服务器协议进行连接。我能够与设备连接,但现在我试图从寄存器中读取数据。 我看了从谷歌以及网络蓝牙github的网络样本,但我无法理解它。下面的代码是我目前试图打破这一点。早期的尝试让我陷入了这样一个事实,即我得到的值是一个对象或一个promise对象。

  • 如何从设备读取RAW数据?