OGeek|极客世界-中国程序员成长平台

标题: ios - 如何通过每个连接间隔发送超过 1 个数据包来最大化 iOS 上 BLE 的吞吐量? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 19:33
标题: ios - 如何通过每个连接间隔发送超过 1 个数据包来最大化 iOS 上 BLE 的吞吐量?

如何在 iOS 上每个连接间隔向蓝牙 LE (BLE) 设备发送超过 1 个数据包?

我正在从 iOS [iPhone 6 with iOS 10.3] 连接到 Microchip BM70 BLE .我读过 https://punchthrough.com/blog/posts/maximizing-ble-throughput-on-ios-and-android 之类的文章以及 https://lists.apple.com/archives/bluetooth-dev/2015/Apr/msg00026.html 之类的线程并实现了这样的代码:

  1. 连接到设备
  2. 获取适当的写入特性。
  3. 为无响应 (157) 获取外设的最大写入长度
  4. 创建 157 字节的数据包。
  5. 然后使用 Write WithoutResponse 通过 Peripheral 的 WriteValue 方法发送数据包。

如果我只写 full blast,iOS 会在大约 20 个数据包后停止发送数据。如果我每 4 个数据包后睡 150 毫秒,它就会正确发送。如果我在每个数据包后睡 35 毫秒,那么它也可以正确发送。如果我发送 18 个数据包,然后将第 19 个数据包作为 Write WithResponse + 回调处理程序发送,那么它也会正确发送数据包。

但是,当我查看逻辑分析仪时,数据正在正确发送,但每个连接间隔 [30ms] 仅发送 1 个数据包:

logic analyzer snippet of BLE packets

我是否需要在 CBPeripheral 或 CBCentralManager 中进行一些其他设置才能在每个连接间隔发送超过 1 个数据包?

谢谢!



Best Answer-推荐答案


如果您在断开中央和外围设备时遇到问题,我建议使用带响应的写入,并在写入数据后从外围设备接收到成功回调时发送第二组数据。如果您专注于提高吞吐量,这比在 4 个数据包后等待 150 毫秒要好。

此外,iOS 将与外围设备一起调整 MTU 大小,以在一个连接中发送尽可能多的数据包。 [这是来 self 使用 iPhone(中央应用程序)和 Linux/Android(外围应用程序)所做的实验]。与小米A1连接时,根据iPhone应用程序对外围设备的要求,MTU调整为185。但是,您不能以编程方式为 MTU 大小提供自定义值,因为用于编辑 MTU 的 API 是私有(private)的并且对公共(public) API 隐藏。

以 iPhone 8 为中心,Android 以 BLE 4.2 作为外围设备,我们可以实现的吞吐量为 2.5 千字节每秒。

关于ios - 如何通过每个连接间隔发送超过 1 个数据包来最大化 iOS 上 BLE 的吞吐量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48085889/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4