0

発生している断続的な BLE スループットの問題の原因を特定するための支援を探しています。

セットアップ:

BLE経由で3つのセンサーに接続するカスタムアプリケーションを備えたAndroid 7.1.1を実行している携帯電話(nexus 5x)があります。センサーは Nordic NRF52832 に基づいており、カスタム ファームウェアを実行しています。Nordic ファームウェアは作成していませんが、nrf5_SDK_v12.2 S132 SDK / ソフト デバイスを使用していると言われています。Nordic は、Nordic UART サービス (NUS) を介してセンサー データを電話にストリーミングします。

問題:

通常、私は自分のアプリを実行し、センサーに接続してから、センサーから電話にデータをストリーミングします。すべてが期待どおりに機能する場合、各センサーからの平均データ スループットは ~ 2250 Bps です (電話で測定)。しかし、時折、スループットが大幅に低下する 1 つまたは 2 つのセンサー (常に 2 つになる可能性があります) が得られます。スループットが低下すると、通常、センサーからのスループットは 750Bps ~ 1500Bps に低下しますが、影響を受けていないセンサーからのスループットは同じままです。システムが 3 つのセンサーすべてに対してフル帯域幅で実行されているのを観察したことがありません。その後、突然 2 つのセンサーのスループットが低下したり、その逆になったりします。接続がセットアップされると、全速接続または減速接続のように見えます。

私が試したこと/除外したこと:

  • 最初は RF の問題だと思ったので、電話側の各センサーの RSSI を記録し始めました。ログを確認すると、RF の問題ではないようです。-90dB という低い RSSI でシステムのフル スループット動作を観察し、-40dB という高い RSSI でスループットを低下させました。
  • 2 つ目は、センサーになんらかの問題があり、データの生成速度が低下した可能性があることです。これを確認するために、まず (電話で) NUS データ特性通知から受信したすべてのバイト数をログに記録しました。センサーの帯域幅が減少すると、特性の変化により、電話で常に 20 バイトが受信されることがわかります (MTU -3)。これにより、センサーの BLE サブシステムが、センサーによって生成されたデータに追いついていないことがわかりました。この結論をさらに検証するために、Nordic チップにデバッガーを接続し、測定値が ble NUS 経由で送信される前に測定値のバッファーに使用されるバッファーを監視しました。バッファーがいっぱいだったためにサンプルがドロップされていることがわかりました。
  • さらに、速度低下の原因は自分のアプリではないと思います。onCharacteristicChanged() コールバックにとどまらないようにしました。私のアプリは、新しいバイトをキューに入れ、別のスレッドで処理するだけです。
  • OnConnectionStateChanged() で gatt 接続が確立された後、電話で gatt.RequestConnectionPriority(GattConnectionPriority.High) を呼び出して、各センサーに優先度の高い接続を要求しました。
  • Nordic の最小/最大接続間隔を 12.5ms に設定しました

私の結論/質問

私の観察によると、接続が確立されたときに、電話またはセンサーが接続の帯域幅を減少させる何かが起こっているようです。MTU/接続間隔 (CI) 以外では、どのパラメーターが接続のスループットの低下を引き起こしているのかわかりません。

  • これらのスループットの問題が断続的に発生する理由について何か考えはありますか?
  • Android BLE スタックがやりたくないことをしているという直感がありますが、接続プロパティに関してはブラック ボックスのようなものです。意図的に接続を遅くすることをどのように検出できますか?

完全な免責事項、私の電話アプリは Xamarin 用に c# で記述されていますが、それは問題ではないと思います。

ありがとう!

4

0 に答える 0