对于正常的特征读取,仅读取 MTU 大小(20 字节)的数据。
我的客户将提供更大尺寸(超过 100 字节)的特征。
我看到 BLE 提供了“长读取”功能,可以读取直到达到特征的大小。
(https://bluegiga.zendesk.com/entries/25053373--REFERENCE-BLE-master-slave-GATT-client-server-and-data-RX-TX-basics 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 协议仍然要求将数据打包成 max。 22字节块,因此使用“read long”并不能节省传输时间。
但是在 Android 中如何使用这个功能呢?
BluetoothGatt 类仅提供一个简单的“Read()”——对于 iOS 来说也是如此。
增加 MTU 是不可能的,因为我们需要支持 AP 级别
我可以确认 iOS 会首先按照标准进行读取操作。然后,如果服务器返回一个完全填满的 PDU,那么 iOS 设备将继续执行 blob 读取操作。使用运行 iOS 11.2.x 的 iPhone 7 进行测试
对于长属性,您不需要多次调用peripheral.readValue(characteristic)。 CoreBluetooth 在幕后完成所有这些工作。
请参阅蓝牙规范核心 v5.0,特别是第 3 卷,F 部分“长属性值”。
实验证明上述。
我有一个 Android Thing 作为服务器,在读取操作期间我使用 iPhone 返回最大长度。 iOS 和我的 RPI3 交换的 MTU 为 185。因此读取响应的长度为 (MTU - 1) 184 字节。然后,服务器 (RPI) 接收偏移量为 184 的新读取请求,然后您可以返回更多数据。继续此操作,直到偏移量 > 512,或者最后读取的响应返回的长度小于 MTU - 1。
基于BluetoothGattServer 支持长属性的事实,我假设BluetoothGatt 对象也支持长属性。由于无法通过 API 设置要读取的偏移量,因此我假设您只能调用一次读取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)