0

GATTサーバでサービスを検出するためにRxAndroidBLEライブラリを使用しています。 ほとんどの場合は大丈夫ですが、GATTエラー133(0x85)が出て失敗することがよくあります。私は時間のサービスカップルの発見のためにある期間、例えば5秒の間、再試行したいと思う。 は、ここで私は働いていないGATTエラーの場合にRxAndroidBLE Discoverサービスを再試行する方法。

bleDevice = mBleClient.getBleDevice(macAddress); 
    subscription = bleDevice.establishConnection(false) 
      .flatMap(RxBleConnection::discoverServices) 
      .first() // Disconnect automatically after discovery 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnUnsubscribe(this::onUnsubscribe) 
      .compose(this.bindToLifecycle()) 
      .retryWhen(errors -> errors.flatMap(error -> { 
         if (isGattError(error) { 
          return Observable.just(new Object()); 
         } else { 
          return Observable.error(error); 
         } 
        } 
      )) 
      .timeout(5, TimeUnit.SECONDS) 
      .subscribe(this::getScanResult, this::onConnectionFailure); 

そのをしようとretryWhenが呼び出さ取得されていないように見えるしていたコードです。それはrxJavaの問題の詳細かもしれませんが、私は本当にこれに関する助けを感謝します。

+0

こんにちは@Avijeet - 5秒間に接続とサービスの検出が正常に終了することは確実ですか? –

+0

私が観察したことは、動作するときにサービス発見のためにわずか2〜2時間かかります。 5秒の時間間隔を変更することができます、主な問題は再試行する方法です。 – Avijeet

+0

'.onUnsubscribe()'では何をしていますか? –

答えて

1

コメントに書いたとおり、this::onUnsubscribeは​​を呼び出しているので、.retryWhen()演算子は呼び出される可能性がありません。

以下の.doOnUnsubscribe().retryWhen()のように移動することができます。

+0

ありがとうDariusz、私はあなたのために別の小さな質問があります、私たちは再試行することができます接続のためのアプローチも同様obserObserable?私はConnection Observableも同様の問題(エラー133)に直面しています。 – Avijeet

+0

はい、 'RxBleDevice.establishConnection()'は '.retryWhen()'で動作する準備ができています。 '.retryWhen() 'の唯一の問題は、' RxBleConnection'から取得した 'Observable'で使用され、接続自体が切断される場合です。再試行時のオブザーバブルは切断例外を返します。続行するには、新しい接続を確立する必要があります。 –

+0

例外を処理して接続を再試行できる例がありますか?私はガベージコレクションが発生してBLE gattが切断されることがあることを観察していました。そして、私のコードは、私のbleデバイスからの接続と読み取りを待っています。 – Avijeet

関連する問題