Android 4.4 BLE指示数据超过20字节

5
我有一个与Android 4.4低功耗蓝牙相关的问题。
我有一个带有UART Rx引脚的BLE Dongle。我可以从Rx引脚向BLE Dongle发送字节数据,然后,BLE Dongle会通过indication将数据发送到蓝牙主机设备。
因此,我有一个Rx特征值,其属性为indication。我向Rx特征发送了大约80个字节的数据,但是在onCharacteristicChanged回调函数中,我只收到了20个字节的数据。
但是,当我使用iPad mini指示此特征值时,它会接收4个20字节数据包,似乎没问题。
如何在Android回调函数中像iOS一样接收80个字节的数据?
3个回答

7

尝试调整更大的GATT MTU。默认值为23个字节。 每个通知/指示,(G)ATT协议会占用3个字节的头文件。 因此,默认情况下剩下20 - 3 = 20个字节。

在iOS 8上,iOS允许的最大MTU为158个字节。 我不确定Android允许多少。


我认为你在建议使用这个 API。请注意,它是从API级别21开始支持的。 - ThomasW
我已经能够使用iOS设备请求512的值。 - ThomasW
1
似乎尽管协商了512字节,但我只收到了155字节。 - ThomasW
是的,你确实会使用它。 - Martijn Thé
1
我怀疑协商的 MTU 大小为 512 字节。可能发生的情况是 iOS 使用 Read/Write Long 操作将有效负载分块成单独的消息(每个消息包含最大 155 字节的有效负载数据),这将在幕后透明地发生。对于通知和无响应写入,不存在这样的分块。 - Martijn Thé

3

我曾经遇到过完全相同的问题——20个字节是指示和通知都适用的限制。它在规范中有定义,但我还没有找到它。

如果您的特征不使用指示或通知,则不适用此限制,并且所有数据将以MTU-5的块发送,请参见BT4.0规范的3.4.6.1节。


请问给出者能否说明这个答案有什么错误。 - eklektek

2
数据以每20个字节为一块发送。所以如果你想接收所有80个字节,那么就将数据分成20个字节的块并在循环中发送。请参考Android: Sending data >20 bytes by BLE以获得更多澄清。
记得在循环中添加Thread.sleep(200)以防止特征被覆盖。

在编写特性或回调方法之前? - Jeff Bootsholz
3
200毫秒是一个随机值,取决于硬件。我的设备需要超过350毫秒。因此,请构建一个堆栈writeCharacteristic,等待writeCharacteristicWrite,轮询堆栈并发送下一个值。 - paulgavrikov
此外,还有一个onCharateristicWrite()事件可用于触发下一次发送,对吗? - Graveen
至少,这是我的经验。事件在数据发送之后设置。 - Graveen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接