2017-11-03 58 views
0

私はBLE Androidアプリを作成しようとしています。私は時々私が BluetoothGatt.writeDescriptor()を呼ぶときそれが偽を返すことがわかった。Android BLE BluetoothGatt.writeDescriptor()が時々falseを返す

この機能には制限がありません。しかし、ppl on stack overflowは、別の記述子を書く前に、私がBluetoothGattCallback.onDescriptorWrite()を待つ必要があると言っています。

これは、writeDescriptor()でBLE is busyという他の書き込みを行うことができないという返信です。

ここでは、writeCharacteristic()を2回呼び出すことはできないと言っているanother threadです。

私の質問は

  • あるが、それは本当に本当ですか?
  • BLEリクエストをシリアライズするための内部アンドロイドAPIバッファがありません。すべての開発者がそれを自分で行う必要がありますか?
  • さまざまな機能で本当ですか?たとえば、私がwriteDescriptor()に電話をかけたとき、onDescriptorWrite()を受け取る前に、私はもう一度writeDescriptor()に電話することができないことを理解しています。しかしonDescriptorWrite()を電話してwriteCharacteristic()に電話する必要がありますか?
  • また、関数間の依存関係がある場合、他の関数にはこの制限があります(つまり:readCharacteristic(),readDescriptor()requestMtu() ...)?
  • また、BluetoothGattServerとBluetoothGattの相互依存性も存在します。例えばBluetoothGattServer.notifyCharacteristicChanged()に電話すると、BluetoothGatt.writeDescriptor()またはBluetoothGatt.writeCharacteristic()に電話する前にBluetoothGattServerCallback.onNotificationSentを待つ必要がありますか? (ちなみに、GoogleのドキュメントonNotificationSent()が運によって適切に文書化されているために賞賛ドク氏は述べています:複数の通知が送信される場合は、このコールバックが追加 通知を送信する前に受信されるため

、アプリケーションが を待たなければなりません

。私は、Android BLE APIは下に文書であることを感じてそれとも私が間違っているとシーケンスを呼び出すメソッド許可されているものをどこかに文書化されてはいますがmにポイントしてくださいすることができた場合は - 。?最後に、すべてのこの質問を持つ
  • そのような文書にe?そうでない場合は、Googleで問題を開いて、ドキュメントに何か追加するよう依頼できるチャンネルがありますか?私は多くのテキストではないかもしれないことを意味します - onNotificationSent()のようないくつかの関数は適切に文書化されています。彼らはこの文を他の関数にコピーするだけです。

答えて

2

マニュアルには情報がありません。あなたは、ルールを見つけるためにソースコードを読むことができ、次のされている(現在は)しかし:

BluetoothGattオブジェクトについて、あなただけの、requestMtureadCharacteristicwriteCharacteristicreadDescriptor含む一度に未処理の要求を、持つことができますwriteDescriptorおよびexecuteReliableWrite。したがって、読み取り要求を発行する場合は、書き込み要求を発行する前に読み取り応答を待つ必要があります。彼らはBluetoothGatt.javaに進行中の操作がある場合にfalseを返すコードを実装していましたが、requestMtuでこれを行うのを忘れていました。したがって、requestMtuのうちの1つに複数の要求がある場合、遅かれ早かれランダムなエラーが発生しますこのポストの時点での最新バージョンでは)。

はい、開発者はすべて手動でリクエストをシリアル化する必要があります。 Bluetoothスタックには実際にはリクエストのキューがありますが、クライアントごとに1つのリクエスト(つまりBluetoothGattオブジェクト)に制限されています。したがって、同じ電話機の2つのアプリケーションが同じデバイスと同時に話す場合、「ビジー」エラーは発生しません。唯一の例外は、現在のデータフローの実装がかなりバグがある場合(Googleが無視していると思われるhttps://issuetracker.google.com/issues/37121017を参照)、レスポンスなしで書き込みを使用する場合です。

サーバーロールとクライアントロールが分離されているため、特性を書き込むのと同時に通知を送信できます。

https://issuetracker.google.comで問題を提起することができます(ただし、誰もそれを読んでいないと感じます)。またはAndroidがオープンソースであるため、https://android-review.googlesource.com/にプルリクエストを送信して、そこからJavadocを更新しますドキュメンテーションが生成されます。

関連する問題