iPhone 上从 nRF52 ARM 接收 BLE 数据包的速度很慢

Posted

技术标签:

【中文标题】iPhone 上从 nRF52 ARM 接收 BLE 数据包的速度很慢【英文标题】:slow reception of BLE packets on iPhone from nRF52 ARM 【发布时间】: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 的开销更少,并且没有相同的大小限制。 【参考方案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 端,它可能无法足够快地解码数据包。一种可能的想法是在接收到数据后处理数据。我的意思是存储通知中的原始数据,然后在收到所有数据后对其进行处理。这样,在传输数据时会发生较少的处理。

以上是关于iPhone 上从 nRF52 ARM 接收 BLE 数据包的速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

NRF52810和NRF52811的区别

在 iPhone 上从线性 PCM 中提取幅度数据

NORDIC内核ARM蓝牙芯片NRF51802/NRF51822

Nordic nRF51/nRF52硬件开发流程说明

如何在 android 5.1 上从接收器播放音乐,它与 android 4.2 不同

nRF24L01+不能接收或接收偶尔异常等问题实战分享