Android和NRF52832之间的间歇性BLE吞吐量问题

时间:2018-03-14 18:54:37

标签: android performance bluetooth-lowenergy throughput nrf52

我正在寻找帮助,以确定我遇到的间歇性BLE吞吐量问题的原因。

设置:

我有一部手机(nexus 5x)运行android 7.1.1,其自定义应用程序通过BLE连接到3个传感器。传感器基于Nordic NRF52832,并运行定制固件。我没有写北欧固件,但我告诉它使用nrf5_SDK_v12.2 S132 sdk / soft设备。北欧将北欧UART服务(NUS)上的传感器数据传输到手机上。

问题:

通常我运行我的应用程序,连接传感器,然后将数据从传感器传输到手机上。当一切按预期工作时,我看到每个传感器的平均数据吞吐量为~2250 Bps(在电话上测量)。但偶尔我会得到1或2个传感器(可能总是2不能老实记住),其中吞吐量大大减少。当吞吐量降低时,我通常会看到来自传感器的750Bps - 1500Bps,吞吐量降低,但未受影响的传感器的吞吐量保持不变。我从未观察到系统以全带宽运行到所有3个传感器,然后突然降低了2个传感器的吞吐量,反之亦然。看起来,一旦建立连接,它就是完全连接或速度降低的连接。吞吐量的减少会导致数据丢失,从而导致应用程序无法正常运行。

我试过/排除的事情:

  • 起初我认为这是一个RF问题,所以我开始为手机端的每个传感器记录RSSI。查看日志后,似乎不是RF问题。我观察到系统的全吞吐量运行,RSSI低至-90dB,RSSI的吞吐量降低了-40dB。
  • 我的第二个可能是传感器遇到某种问题导致他们以降低的速率生成数据。为了检查这一点,我首先记录了从NUS数据特征通知(在电话上)收到的所有字节数。当传感器带宽减小时,我发现特性变化总是导致手机接收到20个字节(MTU -3)。这让我相信传感器上的BLE子系统无法跟上传感器产生的数据。我通过将调试器连接到Nordic芯片并观察用于缓冲测量的缓冲区,然后通过ble NUS发送,我进一步验证了这个结论,我观察到样本因为缓冲区已满而被丢弃。
  • 此外,我不认为这是我的应用程序导致放缓。我已经让我不会留在onCharacteristicChanged()回调中。我的应用程序只是将新字节存放在队列中以供另一个线程处理。
  • 在OnConnectionStateChanged()中建立了gatt连接后,我通过在手机上调用gatt.RequestConnectionPriority(GattConnectionPriority.High)为每个传感器请求了高优先级连接。
  • 我已将Nordic的最小/最大连接间隔设置为12.5ms

我的结论/问题

根据我的观察,当建立连接导致手机或传感器减少连接带宽时,似乎发生了某些事情。在MTU /连接间隔(CI)之外,我不确定哪些参数可能导致连接吞吐量的这种下降。

  • 关于我为什么间歇性地遇到这些吞吐量问题的任何想法?
  • 我有一种直觉,知道android BLE堆栈正在做一些我不想要它做的事情,但它在连接属性方面是一种黑盒子,任何想法......它可能会改变什么?如何有意识地检测到它有意减慢连接?

完全免责声明,我的手机应用程序是用C#写的Xamarin,但我不认为这不重要。

谢谢!

0 个答案:

没有答案