成功连接后,Android BLE会出现一些延迟

时间:2019-02-16 07:28:55

标签: android bluetooth-lowenergy mtu

我正在研究连接到BLE设备并在其中进行一些处理的Android应用。

我总共有5个步骤:

扫描并连接好Gatt()

在onConnectionStateChange()中,

  1. requestMtu()

    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        switch (newState) {
            case BluetoothProfile.STATE_CONNECTED:
                gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH);
                Log.e("Connect", (System.currentTimeMillis() - startTime) + " ms");
                deviceConnected = true;
                gatt.requestMtu(185);
                break;
    

在onMtuChanged()中,

  1. discoverServices()

        @Override
        public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
        super.onMtuChanged(gatt, mtu, status);
        Log.e("Mtu Change", (System.currentTimeMillis() - startTime) + " ms");
        if (status == BluetoothGatt.GATT_SUCCESS) {
            gatt.discoverServices();
        }
    }
    

在onServicesDiscovered()中,

  1. writeDescriptor()

        @Override
    public void onServicesDiscovered(final BluetoothGatt gatt, int status) {
        gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_BALANCED);
        Log.e("Service Discover", (System.currentTimeMillis() - startTime) + " ms");
        try {
            BluetoothGattService service = gatt.getService(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
    
            BluetoothGattCharacteristic notifyChar = gatt.getService(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
    
            if (notifyChar != null) {
                gatt.setCharacteristicNotification(notifyChar, true);
    
                BluetoothGattDescriptor descriptor = notifyChar.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
                descriptor.setValue(new byte[]{0x01, 0x00});
                gatt.writeDescriptor(descriptor);
                gatt.readCharacteristic(notifyChar);
            }
    
        } catch (Exception e) {
            showToast("Service Disc. EXCEPTION");
            e.printStackTrace();
        }
    }
    

在onDescriptorWrite()中,

  1. writeCharacteristic()

        @Override
    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
        Log.e("Descriptor Write", (System.currentTimeMillis() - startTime) + " ms");
        if (status == 0) {
            BluetoothGattCharacteristic characteristic = gatt.getService(UUID.fromString("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
    
            characteristic.setValue(myVal);
            gatt.writeCharacteristic(characteristic);
            Log.e(TAG, "TagID Sent");
        } 
    }
    

在onCharacteristicWrite()中,

  1. 哔哔声

        @Override
    public void onCharacteristicWrite(BluetoothGatt gatt,
                                      BluetoothGattCharacteristic characteristic,
                                      final int status) {
        Log.e("Characteristic Write", (System.currentTimeMillis() - startTime) + " ms");
        if(status == 0){
            beep();
        }
    }
    

我注意到每个步骤的停机时间,以下是读数(5次发生的平均值)

  1. 连接成功(即onConnectionStateChange()):500到525毫秒
  2. MtuChange(即onMtuChanged()):1400到1450毫秒
  3. 服务发现(即onServicesDiscovered()):10到25毫秒
  4. 描述符写入(即onDescriptorWrite()):10到25毫秒
  5. 特征写入(即onCharacteristicWrite):10到25毫秒

因此,首先我认为设置mtu大小会花费太多时间,然后我删除了步骤2-requestMtu()),直接调用了DiscoverService()方法,令人惊讶的是,服务发现(步骤3))花费了大约1400毫秒的时间

我做了另一个实验,再次在步骤2)中调用了requestMtu方法,现在第二次调用只花了10到25毫秒。

最后,我了解到成功连接之后的任何第一步都需要更长的时间。

我不知道原因,请您帮助我了解一下,我也想减少这段时间来使整个过程更快。

是否有可能这样做?

谢谢。

1 个答案:

答案 0 :(得分:0)

实际上需要时间的是服务发现,该服务发现总是在设备已连接时完成(即使您不调用discoverServices)。任何命令都会延迟到完成为止。为了加快速度,您应该尝试缩小外设的GATT db。您也可以尝试在连接后直接从外围设备发送MTU请求,以使服务发现使用更少的数据包。

顺便说一句,发送写描述符请求后,您不能立即读取特征。您始终需要等待GATT操作完成才能发送新的操作。