我正在尝试使用Android Studio作为IDE和Java作为编程语言与温度计BLE设备进行交互。使用智能手机上的应用程序,我发现了该设备在运行过程中暴露的服务:有很多通用服务/特性和一个自定义服务。
首先,我试着阅读
从服务列表中恢复特征并访问其描述符:
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连接到仪表:
并列出几个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字节响应帧?
提前感谢!
您的错误是一次只允许有一个未完成的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数据?