我对android 4.4 Bluetooth Low Energy有疑问。
我有一个带UART Rx引脚的BLE加密狗。我可以将字节数据从Rx-pin发送到BLE加密狗,BLE加密狗将通过指示将数据发送到蓝牙主机设备。
所以我有一个Rx特征值,它的属性是指示。 我将大约80字节的数据发送到Rx特性,但是我只通过回调函数onCharacteristicChanged得到20个字节。
但我使用iPad mini来表示这个特征值,它接收4个数据包中的一个20字节数据,看起来是正确的。
如何在Android回调函数中接收像iOS这样的80字节数据?
答案 0 :(得分:6)
尝试协商更大的GATT MTU。默认值为23个字节。 (G)ATT协议每个通知/指示占用3个字节。 因此,默认情况下,20 - 3 = 20个字节。
在iOS 8上,iOS允许的最大MTU为158字节。 我不确定Android允许的内容。
答案 1 :(得分:2)
我有完全相同的问题 - 20个字节是适用于指示和通知的限制。它在规范中定义,但我还没有找到它。
如果您的特征没有使用任何指示或通知,则此约束不适用,并且您的所有数据将以MTU-5的块发送,请参阅BT4.0规范的第3.4.6.1节。
答案 2 :(得分:1)
数据以每个20字节的块发送。因此,如果要接收所有80个字节,则将数据分成20个字节的块并循环发送。有关说明,请参阅Android: Sending data >20 bytes by BLE。
请记住在循环中添加Thread.sleep(200)
,以便不会覆盖特征。