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