Как я могу настроить скорость передачи ГАТТ Android BLE (Bluetooth Low Energy)? - PullRequest
0 голосов
/ 13 апреля 2020

Я создаю приложение, которое передает изображения с использованием технологии BLE. Изображения не нужно передавать сразу, поэтому после прочтения некоторых документов я пришел к выводу, что 1-3 Мбит / с - это разумный выбор.

(From Wikipedia)

Distance/Range <100 m (<330 ft)
Over the air data rate  125 kbit/s – 1 Mbit/s – 2 Mbit/s
Application throughput  0.27-1.37 Mbit/s [38]

Однако реальное тестирование с BLE показало, что скорость передачи очень низкая , (почти 100 байт / с), с которыми я тестировал,

  • два последних обновления Android телефоны: Samsung galaxy 8, Samsung galaxy note 10.
  • отладка с IntelliJ

Чтобы повысить скорость передачи, я изменил размер буфера со значения по умолчанию до 500 байт, используя приведенный ниже код.

 gatt.requestMtu(CommonConstants.FILE_BUFFER_SIZE);
 @Override
 public void onMtuChanged(BluetoothGatt gatt, int mtu, int status) {
    Log.e("ERROR", "stats=>" + String.valueOf(status));
    Log.e("INFO", "CONNECTED");
    Log.i("ERROR", "Connected to GATT server.");
    Log.i("ERROR", "Attempting to start service discovery:" + gatt.discoverServices());
 }

Однако изменение Maximum Transfer Unit не изменило скорость передачи данных ,

  • Какие вещи мне не хватает в BLE относительно скорости передачи данных?
  • Разве увеличение MTU не должно приводить к увеличению скорости передачи данных?

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Большой MTU с коротким интервалом соединения обычно дает наилучшую производительность. Если оба устройства поддерживают расширение длины данных LE и PHY 2 Мбит / с, вы увеличите производительность до макс.

См. https://www.novelbits.io/bluetooth-5-speed-maximum-throughput/.

0 голосов
/ 13 апреля 2020

Я столкнулся с той же проблемой, когда жестко закодировал длину полезной нагрузки в 20 байт , и для передачи 1 МБ файла потребовалось слишком много времени. Итак, я прочитал о MTU

MTU (максимальная единица передачи) : MTU указывает максимальное количество байтов, которое может быть отправлено в одной операции записи .

Просто запрос MTU не ускорит время передачи. requestMtu () просто вернет максимальное количество байтов, которое может быть отправлено на другое устройство во время записи на устройство.

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

Предположим, что ваши текущие байты были отправлены как 100 байтов / se c:

Всего байт: 5000 байтов

Длина полезной нагрузки: 100 байт

1 операция записи: 100 байт / с c

Всего операций записи будет: 5000/100 = 50 с c

Теперь, скажем, после запроса значения MTU от устройства, оно получается равным 250 байт, и снова:

Всего байт: 5000 байт

Длина полезной нагрузки: 250 байт

1 операция записи: 250 байт / с c

Общее количество операций записи составит: 5000/250 = 20 se c // посмотрим, время сейчас сокращено.

Итак, как этого добиться:

1: подключение к устройству

2: запрос значения MTU (с максимумом 512, и он вернет вам поддерживаемое значение MTU устройства. В большинстве случаев это 251, , но только для информации 3 байта используются для внутренних целей, поэтому максимальный размер составляет MTU-3 )

3: используйте это значение MTU для создания полезной нагрузки

4: выполните операцию записи

...