如何通过每个连接间隔发送多个数据包来最大化iOS上的BLE吞吐量?

时间:2018-01-03 22:09:14

标签: ios bluetooth-lowenergy core-bluetooth

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

我从iOS [iPhone 6与iOS 10.3]连接到{​​{3}}。我读过像Microchip BM70 BLE这样的文章以及像https://punchthrough.com/blog/posts/maximizing-ble-throughput-on-ios-and-android这样的帖子,并且已经实现了以下代码:

  1. 连接到设备
  2. 获取适当的写入特征。
  3. 获取NonResponse(157)
  4. 的外围设备最大写入长度
  5. 创建157个字节的数据包。
  6. 然后使用Write WithoutResponse通过Peripheral的WriteValue方法发送数据包。
  7. 如果我只是写完全爆炸,iOS会在大约20个数据包后停止发送数据。如果我在每4个数据包后睡150ms,它就会正确发送。如果我在每个数据包后35ms睡觉,那么它也会正确发送。如果我发送18个数据包然后发送第19个数据包作为Write WithResponse +回叫处理程序,那么它也会正确发送数据包。

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

    https://lists.apple.com/archives/bluetooth-dev/2015/Apr/msg00026.html

    我的CBPeripheral或CBCentralManager中是否需要进行其他设置才能每个连接间隔发送1个以上的数据包?

    谢谢!

1 个答案:

答案 0 :(得分:0)

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

此外,iOS会根据外设调整MTU大小,以便在一个连接中发送最大可能的数据包。 [这是我使用iPhone(中央应用程序)和Linux / Android(外围应用程序)进行的实验]。在连接Xiomi Mi A1时,MTU根据iPhone应用程序对外设的要求调整为185。但是,您无法以编程方式为MTU大小提供自定义值,因为用于编辑MTU的API是私有的,并且对公共API隐藏。

以iPhone 8为中心,Android为BLE 4.2作为外设,我们可以达到的吞吐量为每秒2.5 KiloBytes。