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

Android在每个连接间隔接收多个BLE数据包,android,bluetooth-lowenergy,android-bluetooth,Android,Bluetooth Lowenergy,Android Bluetooth,我有一个设备,可以通过一个可扩展的GATT特性将数据传输到我的Android(4.4.2)。设备在每个连接间隔发送多个20字节的数据包,其中每个数据包都有一个序列号。 假设设备每个连接间隔发送4个数据包,如图所示。。。 |sq1,sq2,sq3,sq4 | sq5,sq6,sq7,sq8 | 我注意到在Android端,may对onCharacteristicChanged()的调用像。。。 |sq4,sq4,sq4,sq4 | sq8,sq8,sq8 | Android是否支持每个连接间隔发送

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

我注意到在Android端,may对onCharacteristicChanged()的调用像。。。 |sq4,sq4,sq4,sq4 | sq8,sq8,sq8 |

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


Michael

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

我可以给出两个建议:

  • 应在
    onCharacteristicChanged
    方法开始时尽快获取对该值的引用,因为它可能很快会被更改(通过另一个通知或写入操作)。参考:
  • 不要使用
    connectGatt(…,Handler)
    方法,而是依赖默认的处理程序。如果设置了处理程序,这将在接收回调之前增加额外的时间,因此有更多的机会覆盖数据。参考:
  • 然而,上述建议不能保证100%的成功,但可以降低丢失数据的可能性

    此外,当您写入并侦听通知时,我建议将其拆分为2+个特征,因为特征值将在写入和通知操作之间共享。值可能会在发送之前更新,您将最终发送收到的内容。参考:


    iOS API要好得多,因为数据被设置为的参数,并在中作为值接收。它们不共享。

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