BLE写特性问题
BLE writeCharacteristic issue
我正在尝试 writeCharacteristic()
到 BLE 设备。
我使用Google示例应用程序建立连接,连接正常。我可以看到 BLE 服务和服务特征。
writeCharacteristic()
方法 return true 和 onCharacteristicWrite()
回调 return 状态 BluetoothGatt.GATT_SUCCESS
但设备没有任何反应:
我尝试了堆栈溢出中的所有解决方案,但没有任何帮助。
这是我的代码:
在 BluetoothLeService
class 我有 sendData()
方法,它得到一个 byte[]
由于最大负载为 33 字节,我将分别发送每个命令。
public void sendData(byte[] data) {
String lService = "71387664-eb78-11e6-b006-92361f002671";
String lCharacteristic = "71387663-eb78-11e6-b006-92361f002671";
BluetoothGattService mBluetoothLeService = null;
BluetoothGattCharacteristic mBluetoothGattCharacteristic = null;
if (mBluetoothGattCharacteristic == null) {
mBluetoothGattCharacteristic = mBluetoothGatt.getService(UUID.fromString(lService)).getCharacteristic(UUID.fromString(lCharacteristic));
}
mBluetoothGattCharacteristic.setValue(data);
boolean write = mBluetoothGatt.writeCharacteristic(mBluetoothGattCharacteristic);
}
在您的代码中,您检查了 属性 的特征?
如果在设备上写入某些内容,则特性必须具有写入 属性 或写入无响应 属性 或写入并通知 属性。
因此,检查您的代码,您正在编写哪些特征。
您的代码看起来不错,如果您有 GATT_SUCCESS,则表示该特性已成功写入。
您也可以尝试读取此特性并检查值是否已更新。也有可能特性已成功写入,但只有在与设备断开连接后才会触发相应设备的功能。也有可能是设备端的一些bug。
我发现了问题。希望我的回答对其他人有帮助。
问题是,我发送的 byte[] 数组比允许的更大(20 字节)。此外,我需要在这个 byte[] 数组中添加“\r”,这样,BLE Devise 就知道它是命令的结尾。
另一件事,我需要创建一个队列并在 onCharacteristicRead() 中收到响应后从中弹出。
class DataQueues {
private ArrayList<byte[]> queueArray;
private int queuSize;
protected DataQueues() {
queueArray = new ArrayList<>();
}
protected void addToQueue(byte[] bytesArr) {
queueArray.add(bytesArr);
}
protected byte[] popQueue() {
if (queueArray.size() >= 0)
return queueArray.remove(0);
else {
return null;
}
}
protected int getArrSize() {
return queueArray.size();
}
}
希望这对某些人有所帮助。
我正在尝试 writeCharacteristic()
到 BLE 设备。
我使用Google示例应用程序建立连接,连接正常。我可以看到 BLE 服务和服务特征。
writeCharacteristic()
方法 return true 和 onCharacteristicWrite()
回调 return 状态 BluetoothGatt.GATT_SUCCESS
但设备没有任何反应:
我尝试了堆栈溢出中的所有解决方案,但没有任何帮助。
这是我的代码:
在 BluetoothLeService
class 我有 sendData()
方法,它得到一个 byte[]
由于最大负载为 33 字节,我将分别发送每个命令。
public void sendData(byte[] data) {
String lService = "71387664-eb78-11e6-b006-92361f002671";
String lCharacteristic = "71387663-eb78-11e6-b006-92361f002671";
BluetoothGattService mBluetoothLeService = null;
BluetoothGattCharacteristic mBluetoothGattCharacteristic = null;
if (mBluetoothGattCharacteristic == null) {
mBluetoothGattCharacteristic = mBluetoothGatt.getService(UUID.fromString(lService)).getCharacteristic(UUID.fromString(lCharacteristic));
}
mBluetoothGattCharacteristic.setValue(data);
boolean write = mBluetoothGatt.writeCharacteristic(mBluetoothGattCharacteristic);
}
在您的代码中,您检查了 属性 的特征? 如果在设备上写入某些内容,则特性必须具有写入 属性 或写入无响应 属性 或写入并通知 属性。 因此,检查您的代码,您正在编写哪些特征。
您的代码看起来不错,如果您有 GATT_SUCCESS,则表示该特性已成功写入。 您也可以尝试读取此特性并检查值是否已更新。也有可能特性已成功写入,但只有在与设备断开连接后才会触发相应设备的功能。也有可能是设备端的一些bug。
我发现了问题。希望我的回答对其他人有帮助。 问题是,我发送的 byte[] 数组比允许的更大(20 字节)。此外,我需要在这个 byte[] 数组中添加“\r”,这样,BLE Devise 就知道它是命令的结尾。 另一件事,我需要创建一个队列并在 onCharacteristicRead() 中收到响应后从中弹出。
class DataQueues {
private ArrayList<byte[]> queueArray;
private int queuSize;
protected DataQueues() {
queueArray = new ArrayList<>();
}
protected void addToQueue(byte[] bytesArr) {
queueArray.add(bytesArr);
}
protected byte[] popQueue() {
if (queueArray.size() >= 0)
return queueArray.remove(0);
else {
return null;
}
}
protected int getArrSize() {
return queueArray.size();
}
}
希望这对某些人有所帮助。