我的应用程序执行以下操作:
onDescriptorWrite
发送命令到 BT 设备。onCharacteristicChanged
是 捕获所有数据从 BT 设备发送。我已经测试过了在三星 (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.
我应该担心吗?
这意味着这个诺基亚是行不通的,是这样吗?这可能只是此设备的硬件问题吗?
最佳答案
似乎该智能手机的实现存在一些差异。尝试做这些事情:
onCharacteristicChanged
检索)放入线程安全集合。最好将每个 block 包装在一个结构中( {data: ByteArray, device: *, something else...}
)。 这样做的主要原因是,一些设备内部正在积极使用字节缓存,这可能会损坏数据,我们应该从
onCharacteristicChanged
复制字节尽快,他们在我们自己的线程上以一种方便的方式处理。 关于Android 蓝牙 (BLE) onCharacteristicChanged 上的数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70970945/