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

如何修复“bluetooth le中写入特性没有响应”?

杜高谊
2023-03-14

我正在Android上学习蓝牙le,遇到了无法从写入特性获得响应的问题。我正在使用的硬件是一个HM-10,它有一个我可以写入的服务和特性,我确信这与我所写的代码有关。

我已经阅读了关于android开发者建立蓝牙gatt的文章。回调包含onDescriptorRead/Write、onCharacteristicRead/Write、OnServicesDiscoveryd、onCharacteristicChanged,包括用于将信息从服务更新到活动的广播接收器。我还尝试将HM-10插入我的电脑,并使用RealTerm从我的手机应用程序发送数据。我确认我发送的数据正在通过。但当通过HM-10从电脑发送数据时,我的手机应用程序没有返回任何信息。(在onCharacteristicChanged或onCharacteristicRead上)在发送之前,我正在将特性上的通知设置修改为enabled。

描述符是CCCD(0x2902)。该特性是一个自定义特性,根据文档处理读、写、通知。坦率地说,我不知道如何在代码中检查这一点。

发送到characteristic的命令。

if (characteristic.equals("0000ffe1-0000-1000-8000-00805f9b34fb")) {
  characteristic.setValue("AT+CSQ?");
}
bluetoothGatt.writeCharacteristic(characteristic);

写入的回调

@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
Log.w(TAG, "successfully wrote characteristic");

broadcastWrite(ACTION_WRITE_AVAILABLE, characteristic);
}
}

读取特性的回调

@Override
// Result of a characteristic read operation
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);

}
}

特性的回调已更改

@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
Log.w(TAG, "successfully received new characteristic change");
BroadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
}

启用特性通知的命令

descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
 bluetoothGatt.writeDescriptor(descriptor);

我期待蓝牙gatt被设置为处理特征变化。实际发生的是一个没有响应的大黑洞。

共有1个答案

盖昊东
2023-03-14

经过进一步研究,使用setCharacteristicNotification结合更改CCCD描述符上的通知设置成功地解决了这个问题。

 类似资料: