如果具有正常的“特性”,则将读取MTU大小(20字节)的数据。
我的客户将提供较大的特征(大约100bytes)。
我看到BLE提供了“长时间读取”功能,该功能可以读取直到达到特征的大小。
(https://bluegiga.zendesk.com/entries/25053373--REFERENCE-BLE-master-slave-GATT-client-server-and-data-RX-TX-basics)
attclient_read_long命令-启动一个过程,在此过程中,客户端首先向服务器发送正常的读取请求,如果服务器返回的属性值的长度等于BLE MTU(22字节),则客户端将继续发送“读取长”请求直到读取其余的属性。仅在读取长度超过22个字节的属性时适用。为了简单起见,构造GATT服务器以使它没有长属性通常更为简单。请注意,BLE协议仍然要求将数据打包成最大包。 22字节的块,因此使用“read long”不会节省传输时间。
但是如何在Android中使用此功能?
BluetoothGatt类仅提供一个简单的“Read()”-与iOS相同。
无法增加MTU,因为我们需要支持AP级别
最佳答案
我可以为iOS确认将首先执行按照标准的读取操作。然后,如果服务器返回完全填充的PDU,则iOS设备将继续执行blob读取操作。在运行iOS 11.2.x的iPhone 7上进行了测试
对于长属性,您无需多次调用外围设备.readValue(特征)。 CoreBluetooth在后台进行所有这些操作。
请参阅Bluetooth Spec Core v5.0,尤其是第3卷,第F部分“长属性值”。
实验证明以上。
我有一个Android Thing充当服务器,在读取操作期间,我正在用iPhone返回最大长度。 iOS和我的RPI3交换的MTU为185。因此,读取响应的长度为(MTU-1)184个字节。然后,服务器(RPI)接收偏移为184的新读取请求,然后您可以返回更多数据。持续进行直到偏移量> 512,或者最后一个读取响应返回的长度小于MTU-1的长度。
基于BluetoothGattServer支持长属性的事实,我认为BluetoothGatt对象也可以。由于无法通过API设置要读取的偏移量,因此我假设您只能调用一次read。