Android蓝牙低功耗(ble)writeCharacteristic延迟回调

时间:2014-03-12 10:24:42

标签: android bluetooth-lowenergy

我正在使用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秒)。

4 个答案:

答案 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