我有一个设备通过BLE GATT特性将数据传输到我的Android(4.4.2)。设备每个连接间隔发送多个20byte数据包,其中每个数据包都有一个序列号。 假设设备每个连接间隔发送4个数据包,如图所示...... | SQ1,SQ2,SQ3,SQ4 | SQ5,SQ6,SQ7,SQ8 | ..
我注意到在Android端,可能会调用onCharacteristicChanged()来... | SQ4,SQ4,SQ4,SQ4 | SQ8,SQ8,SQ8,SQ8 | ...
Android是否支持每个连接间隔发送多个数据包?
迈克尔
答案 0 :(得分:1)
是的,它在每个连接间隔都支持多个数据包,但是API的设计不正确,特征值是一个共享对象,可能会被多个线程更新。每个通知可以在不同的线程中处理,然后在一个线程(在onCharacteristicChanged
中设置,或者在较旧的Android版本中使用一些未指定的线程)中调用connectGatt(...)
。如果连接间隔很小,或者设备在一个间隔内发送许多数据包,可能会在您收到带有第一个通知的回调之前被另一个消息覆盖。
我可能会提供2条建议:
onCharacteristicChanged
方法开始时尽快获取对该值的引用,因为该值可能很快会被更改(通过另一个通知或写入操作)。参考:https://github.com/NordicSemiconductor/Android-BLE-Library/issues/54 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(...)
中作为值被接收。他们没有共享。