0

私は、連携して機能する 2 つの特徴を持つ BLE GATT サービスを使用しています。1 つは文字列値をクエリとして送信できる書き込み専用の特性で、もう 1 つはクエリへの応答を受け取る通知専用の特性です。

通知サービスは少し遅いため、通知が読み取られる前に次のクエリに移動しないことが重要です。そうしないと、応答が失われます。

この目的のために、私は RxAndroidBle Observables を使用しており、書き込みと通知の特性に個別のチャネルを使用しています。3 番目の Observable はクエリを提供します。ただし、書き込みはあまりにも速く進んでいます。

ConnectableObservable notifyObservable =
    createNotifyObservable(NOTIFY_UUID).publish();

queryObserverable
    .doOnSubscribe(notifyObservable::connect)
    .doOnNext(query -> Log.d(TAG, "Processing query: " + query))
    .flatMap(query -> createWriteObservable(WRITE_UUID, query)))
    .doOnNext(request -> Log.d(TAG, "Write initiated."))
    .flatMap(request -> notifyObservable)
    .doOnNext(response -> Log.d(TAG, "Query response: " + response));

アプリケーションを実行すると、ログに次のように表示されます (タイムスタンプ、プロセス ID、スレッド ID が含まれます)。

06-22 14:30:01.991 14085-15360 Processing query: Query1
06-22 14:30:02.011 14085-15360 Processing query: Query2
06-22 14:30:02.011 14085-15360 Processing query: Query3
06-22 14:30:07.261 14085-15443 Write initiated.
06-22 14:30:07.301 14085-15445 Write initiated
06-22 14:30:07.321 14085-15447 Query response: Response3
06-22 14:30:07.321 14085-15449 Write initiated.
06-22 14:30:07.321 14085-15447 Query response: Response3
06-22 14:30:07.351 14085-15453 Query response: Response3

RxJava を使用して、応答を受信した後にのみ次の書き込みが行われるようにする方法はありますか?

編集:maxConnection両方の呼び出しに提案された引数を指定するflatMapと、呼び出しは適切な順序で発生しますが、Observable からの最初のクエリに対してのみ発生します。この場合のログは次のとおりです。

06-22 14:39:09.841 22245-23079 Processing query: Query1
06-22 14:39:15.131 22245-23166 Write initiated.
06-22 14:39:15.201 22245-23169 Query response: Response1
4

2 に答える 2

1

各クエリに対して正確に 1 つの応答がある場合は、クエリを関数にパックできます。

Observable<String> query(String query) {
  return notifyObservable.flatMap(notifyBytesObservable -> // to be sure that when we will start writing we're already listening
    Observable.combineLatest( // with combineLatest both Observables will be subscribed at the same time
      notifyBytesObservable.first(), // to unsubscribe from notification after the first one
      createWriteObservable(uuid, query), 
      { notificationBytes, writtenBytes -> notificationBytes }
    )
  )
    .map(notificationBytes -> String(notificationBytes))
}

これで、次のような呼び出しができるはずです。

queryObserverable
  .flatMap(queryString -> query(queryString), 1)

これがお役に立てば幸いです。

よろしくお願いします

于 2016-07-08T15:38:49.257 に答える