0

最大スループットを達成するためにOnCharacteristicWriteコールバック条件に基づいて同期して次のパケットを書き込もうとしています。しかし何らかの理由で、1-2秒後にOnCharacteristicWriteコールバックが開始されなくなり、パケットを再送してもそれが呼び出されることはありません。パケットごとに遅延を追加するとうまくいくが、最大スループットを達成するために遅延を追加したくない。Android BLEコールバック数秒後にOnWriteCallbackが終了します

遅延を追加せずに最大スループットを達成できる方法はありますか?

また、接続間隔ごとに複数のパケットを送信することは、どういう意味ですか(また、周辺機器経由で達成できる方法はありますか)。

+0

どのAndroid搭載端末/ OSバージョンがありますか? – Emil

+0

Android 4.4.2 kitkat –

+0

@Emilまた、BLEのバージョンは4.2です。しかし、私はconnの間隔ごとに複数のパケットを送信する方法を得ていません。私はパケットごとにonCharacteristicWriteコールバックが受信されたときに、パケットを1つずつ送信しています。しかし、特定の期間(onCharacteristicWriteコールバックステータス0が成功した約300パケット後)に、コールバックは突然停止し、パケットが再送信されても​​決して起動しません。だから私はすべてのパケットをコールバックステータス0で正常に書き込む2つのパケットの間に8msの遅延を追加しますが、これは実際にスループットを低下させます。これを実装する方法はありますか? –

答えて

1

[応答なしで書き込み](https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html#setWriteType(int)を参照)を使用すると、接続間隔ごとに複数のパケットを送信できます。

「Write Without Response」で複数のパケットを送信すると、残念なことにAndroid KitKatがフロー制御を壊しています。新しいAndroid搭載デバイスを試してみると、正常に動作するはずです。

writeCharacteristicメソッドがtrueを返す場合、パケットがBluetoothプロセスに渡されたことを意味します。ソースコードの正確なロジックはhttps://android.googlesource.com/platform/frameworks/base/+/fe2bf16a2b287c3c748cd6fa7c14026becfe83ff/core/java/android/bluetooth/BluetoothGatt.java#1081です。特性に書き込みプロパティがあり、gattオブジェクトが有効で、現在進行中の他の保留中のGATT操作がない場合は、基本的にtrueを返します。

書き込み応答が到着した(Write With Responseの場合)か、Bluetoothスタックが準備完了で、新しいパケットを受け入れるためのバッファ領域がある場合(Write Without Responseの場合)、onCharacteristicWriteコールバックはstatus = 0を送信します。

私は最近、ここにあなたが読むことができる投稿を書いた:onCharacteristicWrite and onNotificationSent are being called too fast - how to acquire real outgoing data rates?

KitKatを簡単に回避するには、10個のパケットをWrite Without Responseとして書き込み、次に11番目のパケットをWrite With Responseとして書き込み、次にWrite Without Responsesを使用して書き直すことができます。それはあなたにまともなパフォーマンスを与えるはずです。

+0

詳細情報をありがとうございます。私は短期間に応答せずにパケットを書き込むことができますが、データの整合性をチェックするために、私はBLEのTxとRxピンをループバックし、OnCharacteristicChange calbackと同じ特性を読み取った後に同じデータを受信して​​いるかどうかを確認します。このデータ比較に基づいて次のパケットを送信しています。しかし、同じ特性を持つOnCharacteristicChangesに基づいてパケットを読み取ることは、非常に遅い処理であるようです。また、書き込みと送信の2つの異なる特性を使用して、読み込みと方法の2つを使用できますか?ありがとう! –

関連する問題