我正在寻求帮助来确定我遇到的间歇性 BLE 吞吐量问题的原因。
设置:
我有一部运行 android 7.1.1 的手机(nexus 5x),带有一个通过 BLE 连接到 3 个传感器的自定义应用程序。传感器基于 Nordic NRF52832 并运行自定义固件。我没有编写北欧固件,但有人告诉我它使用 nrf5_SDK_v12.2 S132 sdk / 软设备。Nordic 通过 Nordic UART Service (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.5 毫秒
我的结论/问题
根据我的观察,似乎在建立连接时发生了一些事情,导致手机或传感器减少了连接的带宽。在 MTU / 连接间隔 (CI) 之外,我不确定哪些参数可能导致连接吞吐量下降。
- 关于为什么我间歇性地遇到这些吞吐量问题的任何想法?
- 我有一种直觉,android BLE 堆栈正在做我不希望它做的事情,但它在连接属性方面有点像一个黑盒子,任何想法......它可能会改变什么?我如何检测到它故意减慢连接速度?
完全免责声明,我的手机应用程序是用 C# 为 Xamarin 编写的,但我认为这无关紧要。
谢谢!