我正在使用BLE Api(SDK 18)在Android上实现一个应用程序,我遇到的问题是传输数据进程延迟很慢。这是我的日志。
03-12 16:20:05.121:D / BluetoothGatt(13578):writeCharacteristic() - uuid:...
03-12 16:20:06.272:D / BluetoothGatt(13578):onCharacteristicWrite() - Device = ... UUID = ... Status = 0
03-12 16:20:06.972:D / BluetoothGatt(13578):writeCharacteristic() - uuid:...
03-12 16:20:08.254:D / BluetoothGatt(13578):onCharacteristicWrite() - Device = ... UUID = ... Status = 0
03-12 16:20:10.055:D / BluetoothGatt(13578):writeCharacteristic() - uuid:...
03-12 16:20:11.257:D / BluetoothGatt(13578):onCharacteristicWrite() - Device = ... UUID = ... Status = 0
03-12 16:20:12.478:D / BluetoothGatt(13578):writeCharacteristic() - uuid:...
03-12 16:20:14.250:D / BluetoothGatt(13578):onCharacteristicWrite() - Device = ... UUID = ... Status = 0
03-12 16:20:14.960:D / BluetoothGatt(13578):writeCharacteristic() - uuid:...
03-12 16:20:16.242:D / BluetoothGatt(13578):onCharacteristicWrite() - Device = ... UUID = ... Status = 0
03-12 16:20:16.402:D / BluetoothGatt(13578):writeCharacteristic() - uuid:...
03-12 16:20:20.225:D / BluetoothGatt(13578):onCharacteristicWrite() - Device = ... UUID = ... Status = 0
03-12 16:20:20.526:D / BluetoothGatt(13578):writeCharacteristic() - uuid:...
03-12 16:20:24.219:D / BluetoothGatt(13578):onCharacteristicWrite() - Device = ... UUID = ... Status = 0
03-12 16:20:25.360:D / BluetoothGatt(13578):writeCharacteristic() - uuid:...
03-12 16:20:27.222:D / BluetoothGatt(13578):onCharacteristicWrite() - Device = ... UUID = ... Status = 0
有关更多信息,我发现每个Transfer Progress只有在具有onCharacteristicWrite回调时才会完成,这意味着在接收onCharacteristicWrite回调之前所有发送命令都将被忽略。
这是我们必须遵循的Android流程还是有任何设置方法可以跳过回调步骤以加快进度。
我的代码是:
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
......
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
mSending = false;
}
};
private void writeCharacteristic() {
.....
mGattCharacSetIntensity.setValue(data);
mGattCharacSetIntensity.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT);
mBluetoothGatt.writeCharacteristic(mGattCharacSetIntensity);
return;
}
编辑:我与iPhone(来自AppStore的BLE传输数据应用程序)进行了比较,BLE传输数据非常快(小于0.5秒),令人印象深刻。我们如何解决Android BLE转移进度?
编辑:如果我将BluetoothGattCharacteristic的WriteType设置为WRITE_TYPE_NO_RESPONSE,并且当我顺序发送多个命令时,Android会将它们存储在队列中并在收到writeCharacteristic CallBack后逐个发送到远程设备,这会导致问题,当你停止发送lood,Android发送进度仍然会延迟(有时超过3秒)。
答案 0 :(得分:5)
BLE链接的性能在很大程度上取决于所使用的连接间隔,如果您的连接间隔很高,您看到的性能可能并非那么不合理。根据核心规范,连接间隔可以在7.5毫秒到4秒之间,因此具有相当大的灵活性。
如果您可以,我建议您尝试更改您正在谈话的外围设备,以使用更短的连接间隔,这样可以提高性能。您可以使用this page来解释BLE吞吐量,以及this page,解释连接参数。
答案 1 :(得分:2)
我们遇到了同样的问题。它发生在几次写入之后,当你重新连接Gatt时就会消失。我们所做的是测量writeCharacteristic()和onCharacteristicWrite()之间的延迟。如果它超过某个阈值(1500ms),我们断开()并关闭()gatt服务器并重新连接。之后通常会好一段时间。
执行此操作时,可能需要禁用整个蓝牙适配器并重新启用它。否则,第一次重新连接到gatt服务器失败,它需要大约15秒才能重新连接。有时它永远不会重新连接。
禁用适配器时,可能会遇到服务发现未在onServicesDiscovered()中返回的问题。我们目前没有解决方案。
答案 2 :(得分:1)
这对我来说似乎也是一个问题。如果延迟调试器中的调用,则可以确认写入BLE无线电时存在延迟。我将在我的应用程序中实现一个队列来处理延迟。
以下是我为排队命令所做的工作:
public void sendWriteCommandToConnectedMachine(byte[] commandByte) {
if(commandByte.length > 20)
dissectAndSendCommandBytes(commandByte);
else
queueCommand(commandByte); //TODO - need to figure out if service is valid or not
}
private void queueCommand(byte[] command) {
mCommandQueue.add(command);
if(!mWaitingCommandResponse)
dequeCommand();
}
这是我为出列BLE命令所做的工作
private void dequeCommand() {
if(mCommandQueue.size() > 0) {
byte[] command = mCommandQueue.get(0);
mCommandQueue.remove(0);
sendWriteCommand(command);
}
}
这是我特有的写法
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
if(status != BluetoothGatt.GATT_SUCCESS)
logMachineResponse(characteristic, status);
mWaitingCommandResponse = false;
dequeCommand();
}
答案 3 :(得分:1)
您必须实现自己的流量控制,不要开始写入,直到为前一次写入发送OnCharacteristicWrite