Android 蓝牙 (BLE) onCharacteristicChanged 上的数据损坏

标签 android android-bluetooth android-ble

我的应用程序执行以下操作:

  • 它使用 onDescriptorWrite 发送命令到 BT 设备。
  • BT 设备一收到此命令 它开始传输数据到安卓手机。
  • 安卓的onCharacteristicChanged捕获所有数据从 BT 设备发送。
  • 传输完所有数据后,Android 应用程序会将其写入文件。

  • 我已经测试过了在三星 (Android 11)、一加 (Android 11) 和小米 (Android 9) 上一切正常 ,但数据来自 onCharacteristicChanged在诺基亚(Android 11)上损坏。
    该测试示例显示了将传输的数据写入带有校验和的文件中。 正如你所看到的,我在小米上得到了完全相同的字节,但在诺基亚上它有时会被破坏。
    Tested on Xiaomi MiA1 (Android 9)
    
    File_MD5: The right file MD5 -> AE36F08213B25B5E0EE19425257D0D85
    
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    File_MD5: Measurement file MD5: AE36F08213B25B5E0EE19425257D0D85 (ok)
    
    
    Tested on Nokia 5.4 (Android 11)
    
    File_MD5: The right file MD5 -> BCF704DD811A760B5602C20DEDB61AF8
    
    File_MD5: Measurement file MD5: BCF704DD811A760B5602C20DEDB61AF8 (ok)
    File_MD5: Measurement file MD5: E65A5D38EB3D8BF4E1AF5240DFBE1840 (ERROR)
    File_MD5: Measurement file MD5: BCF704DD811A760B5602C20DEDB61AF8 (ok)
    File_MD5: Measurement file MD5: BCF704DD811A760B5602C20DEDB61AF8 (ok)
    File_MD5: Measurement file MD5: BCF704DD811A760B5602C20DEDB61AF8 (ok)
    File_MD5: Measurement file MD5: BCF704DD811A760B5602C20DEDB61AF8 (ok)
    File_MD5: Measurement file MD5: 0D3A577631A115FBAF3324A9B09244A8 (ERROR)
    File_MD5: Measurement file MD5: A6FB1334D7AA1520F105ACB1EC1324C5 (ERROR)
    File_MD5: Measurement file MD5: BCF704DD811A760B5602C20DEDB61AF8 (ok)
    File_MD5: Measurement file MD5: BCF704DD811A760B5602C20DEDB61AF8 (ok)
    

    在这个问题面前,我绝对无法理解, Android 的又一个支离 splinter 且不可靠的生态系统。

    我尝试了以下方法:
  • 设置我的BluetoothGatt实例到 CONNECTION_PRIORITY_HIGH使用 requestConnectionPriority 的模式
  • 使用 synchronized onCharacteristicChanged 中的数据容器如果这是一些多线程写入相同容器类型的错误。

  • 他们都没有帮助。
    有什么见解吗?
    E D I T:
    我的同事做了一个固件只是发送递增的数字。 正如您在红色区域中看到的,数据已损坏,即使使用 Nordic's own nRF toolbox app.
    我应该担心吗?
    这意味着这个诺基亚是行不通的,是这样吗?这可能只是此设备的硬件问题吗?
    enter image description here

    最佳答案

    似乎该智能手机的实现存在一些差异。尝试做这些事情:

  • 将每个数据 block (从 onCharacteristicChanged 检索)放入线程安全集合。最好将每个 block 包装在一个结构中( {data: ByteArray, device: *, something else...} )。
  • 在后台线程中处理每个 block 以避免 UI 卡住。
    这样做的主要原因是,一些设备内部正在积极使用字节缓存,这可能会损坏数据,我们应该从 onCharacteristicChanged 复制字节尽快,他们在我们自己的线程上以一种方便的方式处理。
  • 关于Android 蓝牙 (BLE) onCharacteristicChanged 上的数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70970945/

    相关文章:

    java - 如何优化android代码

    Android:加载位于 app/src/main/中的文本文件

    android - 从嵌套的 JSON 文件中获取数据时出现问题

    Android广播接收器蓝牙事件捕获

    android - BLE 使用哪个 targetSDK?

    android - 如何格式化要发送到 BLE 设备上的特征的字节数组?

    android - 解决 appcompat_v7 错误

    安卓蓝牙 : get Device Specific AT commands

    安卓蓝牙配对安全

    flutter - 如何从 flutter_reactive_ble 示例获取 deviceServices