0

J'utilise la bibliothèque RxAndroidBLE pour découvrir des services dans mon serveur du GATT. cela fonctionne très bien la plupart du temps, mais souvent je reçois l'erreur GATT 133 (0x85) et il échoue. Je voudrais réessayer pour la découverte du service quelques temps pour une période de temps, disons pendant 5 secondes. ici est le code que je suis en trainComment réessayer RxAndroidBLE Discover Services en cas d'erreur du GATT.

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); 

Son ne fonctionne pas et ressemble à la retryWhen n'est pas appelé. C'est peut-être plus de problème de rxJava mais j'apprécierai vraiment n'importe quelle aide sur ceci.

+0

Bonjour @Avijeet - êtes-vous sûr que la connexion et la découverte de service se termineront bien dans ces 5 secondes? –

+0

ce que j'ai observé est que quand cela fonctionne, il faut seulement une seconde ou deux pour la découverte de service. Intervalle de temps de 5 secondes peut être modifié, le principal problème est de savoir comment réessayer. – Avijeet

+0

Que faites-vous dans '.onUnsubscribe()'? –

Répondre

1

Comme vous l'avez écrit dans les commentaires, votre this::onUnsubscribe appelle subscription.unsubscribe(), donc l'opérateur .retryWhen() n'a aucune possibilité d'être appelé.

Vous pouvez déplacer le .doOnUnsubscribe() ci-dessous de .retryWhen() ou l'inverse pour obtenir le comportement souhaité.

+0

Merci Dariusz, j'ai une autre petite question pour vous, pouvons-nous essayer l'approche retryWhen pour connectionObservable ainsi? Je suis confronté au même problème (erreur 133) dans la préparation de Connection Observable. – Avijeet

+0

Oui, 'RxBleDevice.establishConnection()' est prêt à fonctionner avec '.retryWhen()'. Le seul problème avec '.retryWhen()' est quand il est utilisé sur 'Observable's obtenu à partir de' RxBleConnection' et la connexion elle-même sera déconnectée - ces observables quand réessayée retournera l'exception de déconnexion. Pour continuer une nouvelle connexion doit être établie. –

+0

Avez-vous un exemple où nous pouvons gérer l'exception et réessayer pour la connexion. J'ai observé que quelque temps il y a une collecte de place qui provoque la déconnexion de BLE gatt, et mon code n'attend plus que de se connecter et de lire depuis mon périphérique. – Avijeet