Получение нескольких пакетов BLE за один интервал подключения в Android

Информация о моем устройстве

  1. Скандинавская доска:

    • Размер MT: 247.
    • Эта плата отправляет уведомления по нескольким пакетам за один интервал соединения (просто значение счетчика, например 1,2,3,4 ...), при «Измерении частоты сердечных сокращений».
  2. Android-устройство:

    • Версия 5.0 и 6.0. (Использование двух устройств).
    • свяжите Bluetooth Low Energy (BLE) с доской.
    • плата подключается к моему Android-приложению MTU устанавливает 244.
    • Источник приложения - образец проекта GoogleLeGatt
    • Приложение отправляет уведомление по значению «Служба частоты пульса».
    • Получить значение уведомления в Gattcallback "onCharacteristicChanged ()"
  3. проблема

    • У меня Android-приложение потеряло некоторые пакеты.

Я прочитал этот пост. Максимизация пропускной способности BLE на iOS и Android . Поэтому я отправляю E-mail этому автору и ищу другую информацию для Android.

Я нашел такой же вопрос. но ответ на этот вопрос не был выполнен. Затем я нашел один вопрос, что хочу. но у этого вопроса нет ответов. Android получает несколько пакетов BLE на каждый интервал подключения . К сожалению, у меня нет ответа на E-mail.

Мой вопрос: как установить уведомление Android BLE. (Нестандартная настройка платы) (Мой вопрос - тот же самый Android, который принимает несколько пакетов BLE на каждый интервал подключения )

Под строкой находится мой пример кода. при уведомлении.

@Connect

public boolean connect(final String address) {
    if (mBluetoothAdapter == null || address == null) {
        Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
        return false;
    }

    // Previously connected device.  Try to reconnect.
    if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress) && mBluetoothGatt != null) {
        Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection.");
        if (mBluetoothGatt.connect()) {
            mConnectionState = STATE_CONNECTING;
            return true;
        } else {
            return false;
        }
    }

    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
    if (device == null) {
        Log.w(TAG, "Device not found.  Unable to connect.");
        return false;
    }

    // We want to directly connect to the device, so we are setting the autoConnect
    // parameter to false.
    mBluetoothGatt = device.connectGatt(this, false, mGattCallback);

    Log.d(TAG, "Trying to create a new connection.");
    mBluetoothDeviceAddress = address;
    mConnectionState = STATE_CONNECTING;
    return true;
}

@GattCallback

  /*broadcastUpdate method is display value*/
 @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {

        if (newState == BluetoothProfile.STATE_CONNECTED) {
            mConnectionState = STATE_CONNECTED;
            // Attempts to discover services after successful connection.
            Log.i(TAG, "Attempting to start service discovery:");
            mBluetoothGatt.discoverServices();

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            Log.i(TAG, "Disconnected from GATT server.");
            mConnectionState = STATE_DISCONNECTED;
            broadcastUpdate(ACTION_GATT_DISCONNECTED);
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            Log.d(TAG, "onServicesDiscovered success: (status)" + status);
            //findServiceOther(gatt);
            broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
            Log.d(TAG, "Request MTU");
            gatt.requestMtu(SET_MTU);
        } else {
            Log.w(TAG, "onServicesDiscovered failed: (status)" + status);
        }
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            Log.d(TAG, "onCharRead Success");
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        } else {
            Log.d(TAG, "OnCharRead Error: " + status);
        }
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
        if (characteristic.getUuid().equals(SampleGattAttributes.UUID_HEART_RATE_MEASUREMENT))
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic, FLAG_HEART_RATE);
        else
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
    }

    @Override
    public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
        super.onMtuChanged(gatt, mtu, status);
        boolean priority = gatt.requestConnectionPriority(BluetoothGatt.CONNECTION_PRIORITY_HIGH);
        Log.d(TAG, "MTU changed (mtu/status) / Priority : (" + mtu + "/" + status + ") / " + priority);
        changed_MTU_Size = mtu;
        broadcastUpdate(ACTION_DATA_AVAILABLE, changed_MTU_Size, FLAG_MTU);
        broadcastUpdate(ACTION_GATT_CONNECTED);
    }

Уведомление @set

public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) {
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return;
    }

    mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);

    if (SampleGattAttributes.UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {
        // This is specific to Heart Rate Measurement.
        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(SampleGattAttributes.UUID_CLIENT_CHARACTERISTIC_CONFIG);
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        mBluetoothGatt.writeDescriptor(descriptor);
    }
}

Edit_1

Я тестирую оффшорное приложение Nordic в магазине Google Play. nRF Connect for Mobile, но это приложение также пропускает пакет.

Edit_2

Я тоже нашел проблему.

<Норматическая конфигурация плавающей платы>

  • HEART_RATE_MEAS_INTERVAL: 10
  • MIN_CONN_INTERVAL: MSEC_TO_UNITS (40, UNIT_1_25_MS)
  • MAX_CONN_INTERVAL: MSEC_TO_UNITS (40, UNIT_1_25_MS)
  • SLAVE_LATENCY 0
  • CONN_SUP_TIMEOUT MSEC_TO_UNITS (4000, UNIT_10_MS)

<Запуск в Android-приложении>

  • пропустить запросMTU: получить 20-байтовый пакет успешно. (Средняя скорость передачи данных составляет 2200 байт / секунду в моем приложении)

  • requestMTU: Я стараюсь так много MTU (например: 23 (может быть небольшой размер), 40, 100, 255 (цель) ...), но потерял некоторый пакет (скорость передачи данных 8500 ~ 9500 байт в секунду в моем приложении)

Я задаюсь вопросом requestMTU и уведомления получать взаимосвязи.

android,bluetooth,bluetooth-lowenergy,

0

Ответов: 1


1

Я реализовал передачу файлов через LE на nrf51422 и SD310 с помощью службы Nordic UART. Приложение Android создано в CPP с помощью Qt и библиотеки QtBluetooth. Поэтому этот ответ мне действительно не поможет. Но я позаботился о том, чтобы получить полезную скорость передачи данных. 1, установите параметры соединения в 7,5 мс (мин) и 15 мс (макс.). 2nd, на периферийной стороне, я посылаю до 7 пакетов (до тех пор, пока буфер не будет заполнен). Таким образом, периферийное устройство отправляет до 7 пакетов на событие подключения. На стороне Android событие с изменением charachteritic прибывает мне часто с размером данных 20 байтов (из-за максимального размера MTU 23, 3 байта, используемого службой nordic uart), и я мгновенно считываю данные. Возможно, ваша ошибка - размер MTU 244. Размер BLE по умолчанию BLE по умолчанию равен 23 (Core spec 4.1).

С уважением

андроид, Bluetooth,-lowenergy,
Похожие вопросы