gpt4 book ai didi

Android 每个连接间隔接收多个 BLE 数据包

转载 作者:行者123 更新时间:2023-11-29 01:40:49 26 4
gpt4 key购买 nike

我有一个设备可以通过 BLE GATT 特性将数据传输到我的 Android (4.4.2)。设备在每个连接间隔发送多个 20 字节的数据包,其中每个数据包都有一个序列号。假设设备每个连接间隔发送 4 个数据包,如图所示......|sq1,sq2,sq3,sq4|sq5,sq6,sq7,sq8|..

我注意到在 Android 端,可能会调用 onCharacteristicChanged() 就像...|sq4,sq4,sq4,sq4|sq8,sq8,sq8,sq8|...

Android 是否支持每个连接间隔发送多个数据包?

迈克尔

最佳答案

是的,它支持每个连接间隔有多个数据包,但是API 设计得很糟糕,特征值是一个共享对象,可能被多个线程更新。每个通知都可以在不同的线程中处理,然后它们在一个线程上调用 onCharacteristicChanged(在 connectGatt(...) 中设置,或者为旧的 Android 版本设置一些未指定的线程. 如果连接间隔非常小,或者设备在一个间隔内发送了很多数据包,则可能会在您收到第一个通知的回调之前被另一个通知覆盖。

我可以给两个建议:

  1. 应尽快在 onCharacteristicChanged 方法的开头获取对该值的引用,因为它可能很快就会更改(通过另一个通知或写入操作)。引用:https://github.com/NordicSemiconductor/Android-BLE-Library/issues/54
  2. 不要使用 connectGatt(..., Handler) 方法,而是依赖默认处理程序。如果您设置一个处理程序,这将在您收到回调之前增加额外的时间,因此有更多的机会覆盖数据。引用:https://github.com/NordicSemiconductor/Android-BLE-Library/issues/54

但是,上述建议并不能保证 100% 成功,但可以降低丢失数据的机会。

此外,当您编写和收听通知时,我建议将其拆分为 2+ 个特性,因为特性的值随后会在写入和通知操作之间共享。值可能会在发送前更新,您最终将发送收到的内容。引用:https://github.com/NordicSemiconductor/Android-BLE-Library/issues/60

iOS API 要好得多,因为数据被设置为 writeValue(...) 的参数并作为值(value)收到 peripheralDidUpdateValueFor(...) .它们不共享。

关于Android 每个连接间隔接收多个 BLE 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24817107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com