【问题标题】:slow reception of BLE packets on iPhone from nRF52 ARMiPhone 上从 nRF52 ARM 接收 BLE 数据包的速度很慢
【发布时间】:2020-05-11 22:42:01
【问题描述】:

我基于处理 BLE 5 的 nRF52 SOC 构建了一个自定义 ARM 设备。我使用 Core Bluetooth 框架在 SWIFT/X-Code/IB 中编写了一个自定义应用程序,并且无法从 ARM 设备流式传输数据的速度比大约12 KB。使用数据包嗅探器,我可以看到 ARM 设备实时发送了所有数据包,但 iPhone 读取它们的速度不会超过每秒几次。在极少数情况下,iPhone 会快速读取所有内容。蓝牙连接协商到 12-24 毫秒的延迟。我使用的是 Nordic nRF52 SDK 版本 16。当时 iPhone 没有连接到任何其他 BLE 设备。

还有其他人遇到过这个问题吗?如果有帮助,我可以贴出ARM设备上使用的代码和XCode代码。

【问题讨论】:

  • 您使用的是 L2Cap 通道吗?
  • 深入研究后,我好像在使用 GATT(Nordic SDK 中的默认设置)
  • 对于 BLE 上的高数据速率传输,您需要使用 L2Cap 通道。
  • 感谢您的评论。 ARM设备实时快速发送所有数据包; iPhone只是慢慢地处理它们。更改为 L2Cap 会影响 iPhone 处理传入数据的方式吗?
  • 是的,L2Cap 通道是一种流连接,旨在更快地传输大量数据。它比 GATT 的开销更少,并且没有相同的大小限制。

标签: ios performance bluetooth-lowenergy nrf52


【解决方案1】:

当您使用北欧板时,有几件事需要检查以“加快进程”。首先,我假设您是通过通知发送的。其次,您需要知道什么构成了您的数据速率。它们是:

  • 每个通知的位数
  • 连接间隔
  • 每个连接间隔的事件
  • 数据通信类型

您还可以将多个数据包排队存储,直到它们通过通知发送(填充缓冲区)。

所以一些有用的设置。首先,最重要的是最大化您每个数据包发送的数据。例如,如果您要发送 10 个字节的数据发送更多,这将被限制为北欧板上的最大数据大小(247)。然后增加 GAP 长度。所以我建议开始的一些设置是:

  • 转到 sdk_config.h
  • 将 NRF_SDH_BLE_GAP_EVENT_LENGTH 更改为 400(认为默认为 6)
  • 将 MTU 大小增加到 247

然后在板子上运行,你可能会得到一个错误,说 change ram and start location。这将打印到终端。你可以这样做:

  • 项目
  • 选项
  • 常见
  • 按向上箭头直到项目下
  • 链接器
  • 部分放置宏。

从那里将您的 ram 启动和分配变量更改为终端/腻子/调试器中打印的内容。也不确定 iphone 应用程序的 API,但 android 具有将蓝牙硬件设置为高功率模式的功能,这增加了我在传输数据时的吞吐量,只需在数据传输后禁用它。您使用的 API 可能有类似的功能。

对于参考代码,sdk中有一个名为maximum_throughput的示例,这应该是一个很好的参考点。

【讨论】:

  • 感谢您的详细回复。我尝试将事件长度更改为 400 并且代码崩溃但没有提供新的内存起始地址。我仍然认为这是在接收端——当我嗅探从 nRF52 设备发送的数据包时,它们都是快速实时发送的。问题似乎出在 iPhone 端,它缓慢地接收和解码数据包。我听说 iPhone 会减慢非标准连接的蓝牙通信速度,我想知道我是否是这种情况的受害者。
  • 很遗憾,如果您认为这可能是北欧方面,请查看上述示例,您可以使用大量设置进行更改。如果它是 iphone 端,它可能无法足够快地解码数据包。一种可能的想法是在接收到数据后处理数据。我的意思是存储通知中的原始数据,然后在收到所有数据后对其进行处理。这样,在传输数据时会发生较少的处理。
猜你喜欢
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2013-11-10
相关资源
最近更新 更多