Android BLE с некоторой задержкой после успешного подключения - PullRequest
0 голосов
/ 16 февраля 2019

Я работаю над приложением Android, которое подключается к BLE-устройству и выполняет там некоторые процессы.

У меня всего 5 шагов:

После сканирования и connectGatt ()

В 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 (),

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 (),

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 (),

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");
    } 
}

In onCharacteristicWrite (),

Небольшой звуковой сигнал,

    @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 мс времени.

Я снова провел другой эксперимент, названный методом requestMtu на шаге 2), теперь второй вызов занял всего 10-25 мс.

Наконец, я понял, что любой первый шаг после успешного подключения занимает больше временивремя.

Я не знаю, почемуп, не могли бы вы помочь мне понять, а также, я хочу сократить это время, чтобы ускорить весь процесс.

Есть ли возможность сделать это?

Заранее спасибо.

1 Ответ

0 голосов
/ 16 февраля 2019

Что на самом деле требует времени, так это обнаружение службы, которое всегда выполняется, когда устройство подключено (даже если вы не вызываете DiscoverServices).Любая команда откладывается до завершения.Чтобы ускорить его, вы должны попытаться уменьшить значение GATT для периферийных устройств.Вы также можете попытаться отправить MTU-запрос от периферийного устройства непосредственно после подключения, чтобы при обнаружении службы использовалось меньше пакетов.

Кстати, вы не можете прочитать характеристику сразу после отправки запроса дескриптора записи.Вам всегда нужно ждать завершения операции GATT, пока вы не сможете отправить новую.

...