Проблема с передачей файлов через BLE на Android - PullRequest
0 голосов
/ 28 января 2020

Я работаю над передачей файлов со смартфона на периферийное устройство через BLE.

Медленная отправка данных по BLE (передача данных осуществляется с использованием перезаписи одного символа длиной 20 байтов c). Медленная скорость не является проблемой, потому что размер файлов также очень мал (до 1 МБ).

В тривиальных тестах все работает хорошо. Пока я пытаюсь запустить автоматическую передачу файлов в al oop (например, оставить его включенным в течение ночи для тестирования), на устройстве со стандартом Bluetooth 4.2 через короткое время Android рассылает спам из-за содержимого в Logcat :

01-24 13:44:08.411  1002  2449 10116 D vendor.qti.bluetooth@1.0-uart_controller: ReportSocFailure
01-24 13:44:08.411  1002  2449 10116 D vendor.qti.bluetooth@1.0-uart_controller: ReportSocFailure send soc failure
01-24 13:44:08.411  1002  2449 10116 E vendor.qti.bluetooth@1.0-uart_controller: Error reading data from uart

После нескольких секунд спама этот вывод записывает следующий вывод в Logcat, сигнализируя, что Bluetooth останавливается / перезапускается

1-24 13:44:08.428  1002  2449  2449 W vendor.qti.bluetooth@1.0-async_fd_watcher: StopThread: stopped the work thread
01-24 13:44:08.428  1002  2449  2449 D vendor.qti.bluetooth@1.0-uart_transport: userial clock off

01-24 13:44:38.527  1002  2449  2449 I vendor.qti.bluetooth@1.0-uart_transport: DeInitTransport: Transport is being closed!
01-24 13:44:38.528  1002  2449  2449 D vendor.qti.bluetooth@1.0-power_manager: SetPower: enable: 0
01-24 13:44:38.529  1002  2449  2449 D vendor.qti.bluetooth@1.0-power_manager: GetRfkillFd: rfkill_fd: 9
01-24 13:44:38.529  1002  2449  2449 D vendor.qti.bluetooth@1.0-power_manager: ControlRfkill: rfkill_fd: 9, enable: 0
01-24 13:44:38.637  1002  2449  2449 W vendor.qti.bluetooth@1.0-data_handler: controller Cleanup done
01-24 13:44:38.638  1002  2449  2449 I vendor.qti.bluetooth@1.0-data_handler: DataHandler:: joined Init thread 
01-24 13:44:38.638  1002  2449  2449 E vendor.qti.bluetooth@1.0-wake_lock: Release wake lock not initialized/acquired
01-24 13:44:38.638  1002  2449  2449 D vendor.qti.bluetooth@1.0-wake_lock: CleanUp wakelock is destroyed 
01-24 13:44:38.638  1002  2449  2449 W vendor.qti.bluetooth@1.0-bluetooth_hci: BluetoothHci::close, finish cleanup


01-24 13:44:38.713 u0_a3  3430  3430 D BluetoothSap: Proxy object disconnected
01-24 13:44:38.715  1000 26585 26585 D A2dpProfile: Bluetooth service disconnected
01-24 13:44:38.716  1000 26585 26585 D BluetoothSap: Proxy object disconnected
01-24 13:44:38.718  1000 26585 26585 D SapProfile: Bluetooth service disconnected
01-24 13:44:38.719  1000 26585 26585 D BluetoothInputDevice: Proxy object disconnected
01-24 13:44:38.719 10137 28340 28340 D BluetoothInputDevice: Proxy object disconnected

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

На устройстве со стандартом Bluetooth 4.0 все работает нормально , я мог оставить постоянную передачу файла работает в течение дня, и cra sh не произойдет.

У вас есть какие-либо идеи или предложения, почему это происходит? Для взаимодействия с адаптером Bluetooth я использую библиотеку RxBle

https://github.com/Polidea/RxAndroidBle

Спасибо.

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

с Android API уровня 21 и выше, у вас есть возможность запросить больший размер MTU от периферийного устройства, на которое вы отправляете, как упоминалось здесь . Это позволит вам отправлять до пакета из 517 байтов, и это делает вашу передачу относительно быстрее, чем отправка пакетов размером 20 байтов. Однако это возможно, только если ваше устройство поддерживает больший размер MTU. Если вы планируете делать обновления прошивки, я бы предложил, чтобы ваше периферийное устройство и приложение для смартфона использовали надлежащий протокол обновления прошивки, что также может зависеть от производителя чипа Bluetooth, используемого на вашем периферийном устройстве. Надеюсь, это поможет.

0 голосов
/ 06 февраля 2020

FYI - Я обнаружил в системе отслеживания ошибок BLE Kotlin Библиотека Coroutines, похожая на ту, что у меня есть - мое сообщение об ошибке точно соответствует сообщениям об ошибках, сообщенным здесь:

Проблема с передачей файла over BLE на Android

В описании данной проблемы указано, что проблема возникла на устройстве Samsung Galaxy A5, которое было именно тем устройством, которое я использовал.

Таким образом, я пришел к выводу, что эта проблема, вероятно, связана с этим конкретным устройством c, поскольку я могу без проблем запускать обновления FW на нескольких разных телефонах. Я не исследовал дальше.

Мое решение для этого - при применении обновления по какой-либо причине происходит сбой (ошибка BT, батарея разряжается, устройство выйдет из диапазона go), все будет сброшено и обновление попытается беги снова. Вы просто не можете предсказать, будут ли / как / когда неправильно работать разные устройства - решение состоит не в том, чтобы пытаться исправить все возможные ошибки, а в том, чтобы дать системе возможность восстановиться после ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...