在 Android 上通过 BLE 传输文件时出现问题
Problem with file transfer over BLE on Android
我致力于通过 BLE 将文件从智能手机传输到外围设备。
通过 BLE 发送数据很慢(正在使用覆盖一个 20 字节长的特征来实现数据传输)。速度慢不是问题,因为文件的大小也非常小(最多 1MB)。
在简单的测试中一切正常。只要我尝试 运行 循环自动传输文件(例如为了测试目的,让它 运行 过夜),短时间后 在具有蓝牙标准 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,表明蓝牙正在停止/重新启动
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
在这些事件之后,用于写出数据的服务被重新启动,我的猜测是因为设备上的蓝牙模块也被重新启动了。
在具有蓝牙标准 4.0 的设备上,一切正常 运行s OK,我可以将持续的文件传输 运行ning 保留一天,并且不会崩溃发生。
请问您对为什么会发生这种情况有什么想法或建议吗?对于与蓝牙适配器的交互 我使用库 RxBle
https://github.com/Polidea/RxAndroidBle
谢谢。
从 Android api 级别 21 开始,您可以从您要发送到的外围设备请求更大的 MTU 大小,如前所述 here。这将允许您发送最多 517 字节的数据包,这使您的传输比发送 20 字节的数据包相对更快。然而,这只有在您的 ble 设备支持更大的 MTU 大小时才有可能。如果您打算进行固件更新,我建议您的外围设备和智能 phone 应用程序都应使用适当的固件更新协议,这也可能取决于外围设备上使用的蓝牙芯片的制造商。希望这有帮助。
仅供参考 - 我在 BLE Kotlin Coroutines 库的问题跟踪系统中发现了与我遇到的问题类似的问题 - 我的错误消息与此处报告的错误消息完全匹配:
在给定问题的描述中,指出问题发生在设备 Samsung Galaxy A5 上,这正是我使用的设备。
所以我得出的结论是,这个问题可能与这个特定的设备有关,只要我可以 运行 在多个不同的手机上连续更新 FW 而没有问题。我没有进一步调查。
我的解决方案是 - 当由于任何原因应用更新失败时(BT 错误,电池 运行s 耗尽,设备将超出 BT 范围),一切都将被重置并且更新将再次尝试 运行。您只是无法预测 if/how/when 不同的设备是否会出现异常行为 - 解决方案不是尝试修补所有可能发生的错误,而是让系统有能力从错误中恢复。
我致力于通过 BLE 将文件从智能手机传输到外围设备。
通过 BLE 发送数据很慢(正在使用覆盖一个 20 字节长的特征来实现数据传输)。速度慢不是问题,因为文件的大小也非常小(最多 1MB)。
在简单的测试中一切正常。只要我尝试 运行 循环自动传输文件(例如为了测试目的,让它 运行 过夜),短时间后 在具有蓝牙标准 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,表明蓝牙正在停止/重新启动
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
在这些事件之后,用于写出数据的服务被重新启动,我的猜测是因为设备上的蓝牙模块也被重新启动了。
在具有蓝牙标准 4.0 的设备上,一切正常 运行s OK,我可以将持续的文件传输 运行ning 保留一天,并且不会崩溃发生。
请问您对为什么会发生这种情况有什么想法或建议吗?对于与蓝牙适配器的交互 我使用库 RxBle
https://github.com/Polidea/RxAndroidBle
谢谢。
从 Android api 级别 21 开始,您可以从您要发送到的外围设备请求更大的 MTU 大小,如前所述 here。这将允许您发送最多 517 字节的数据包,这使您的传输比发送 20 字节的数据包相对更快。然而,这只有在您的 ble 设备支持更大的 MTU 大小时才有可能。如果您打算进行固件更新,我建议您的外围设备和智能 phone 应用程序都应使用适当的固件更新协议,这也可能取决于外围设备上使用的蓝牙芯片的制造商。希望这有帮助。
仅供参考 - 我在 BLE Kotlin Coroutines 库的问题跟踪系统中发现了与我遇到的问题类似的问题 - 我的错误消息与此处报告的错误消息完全匹配:
在给定问题的描述中,指出问题发生在设备 Samsung Galaxy A5 上,这正是我使用的设备。
所以我得出的结论是,这个问题可能与这个特定的设备有关,只要我可以 运行 在多个不同的手机上连续更新 FW 而没有问题。我没有进一步调查。
我的解决方案是 - 当由于任何原因应用更新失败时(BT 错误,电池 运行s 耗尽,设备将超出 BT 范围),一切都将被重置并且更新将再次尝试 运行。您只是无法预测 if/how/when 不同的设备是否会出现异常行为 - 解决方案不是尝试修补所有可能发生的错误,而是让系统有能力从错误中恢复。