【问题标题】:BLE: Read Long Characteristics Value using Android / iOSBLE:使用 Android / iOS 读取长特征值
【发布时间】:2016-11-09 13:35:36
【问题描述】:

具有正常特性只读将读取 MTU 大小(20 字节)的数据。 我的客户将提供更大尺寸(约 100 字节)的特征。

我看到 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 中,至少,你需要发出多次读取,重复直到你得到少于 22 个字节。这与 BlueGiga 描述的过程相同;你只需要自己实现它。我怀疑 Android 可能也是如此

标签: android ios bluetooth-lowenergy android-bluetooth ios-bluetooth


【解决方案1】:

我可以确认 iOS 将首先发生按照标准的读取操作。然后如果服务器返回一个完全填充的 PDU,iOS 设备将继续执行 blob 读取操作。使用运行 iOS 11.2.x 的 iPhone 7 测试

对于长属性,您不需要多次调用 peripheral.readValue(characteristic)。 CoreBluetooth 在幕后完成了所有这些工作。

请参阅蓝牙规范核心 v5.0,特别是第 3 卷,F 部分。“长属性值”。

以上实验证明。

我有一个 Android Thing 作为服务器,在读取操作期间,我正在使用我的 iPhone 返回最大长度。 iOS 和我的 RPI3 交换了 185 的 MTU。所以读取响应是 (MTU - 1) 184 字节长。然后,服务器 (RPI) 接收到偏移量为 184 的新读取请求,然后您可以返回更多数据。这一直持续到偏移量 > 512,或者最后一个读取响应返回的长度小于 MTU - 1 长度。

基于 BluetoothGattServer 支持长属性这一事实,我假设 BluetoothGatt 对象也支持。由于无法通过 API 设置要读取的偏移量,我假设您只能调用一次 read。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多