【问题标题】:Android receiving multiple BLE packets per connection intervalAndroid 每个连接间隔接收多个 BLE 数据包
【发布时间】:2014-09-09 03:00:54
【问题描述】:

我有一台设备通过 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 是否支持每个连接间隔发送多个数据包?

迈克尔

【问题讨论】:

  • 你找到答案了吗?我还想知道每个连接可以发送多少个数据包。我的设备和 Android 每个连接都发送和接收数十个数据包,但在(比如 50 个)数据包之后,它变得更慢,最终变得非常非常慢,这并不例外。你能给我一些建议吗?

标签: android bluetooth-lowenergy android-bluetooth


【解决方案1】:

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

我可以给出 2 条建议:

  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(...) 的参数并作为peripheralDidUpdateValueFor(...) 中的值接收。它们不共享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2014-10-20
    • 1970-01-01
    相关资源
    最近更新 更多