2017-06-27 1 views
0

Je suis en train de suivre Android's BLE apis en essayant de connecter à un périphérique une donnée lue. La numérisation, la connexion et la lecture sont correctes mais le problème est qu'après 30 secondes exactement, la connexion tombe - seulement pour se reconnecter momentanément (< 10 sec). Voici mon code pour la connexion au serveur du GATT de l'appareil:Le périphérique Android BLE se déconnecte et se reconnecte continuellement toutes les 30 secondes

protected BluetoothGatt initGattServer(BluetoothDevice device, final ConnectionCallback callback, final DataCallback dataCallback) { 
    Log.d("INIT GATT SERVER", device.getName()); 
    this.gatt = device.connectGatt(context, true, new BluetoothGattCallback() { 
     @Override 
     public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState){ 
      Log.d("GATT CONNECTION", "CHANGED -- status: " + status + " newState: " + newState); 
      if(callback != null){ 
       callback.onConnectionStateChanged(newState); 
      } 
      gattConnectionState = newState; 
      if(status == BluetoothGatt.GATT_SUCCESS){ 
       if(newState == BluetoothProfile.STATE_CONNECTED){ 
        gatt.discoverServices(); 
       } 
      } 
     } 

     @Override 
     public void onServicesDiscovered(BluetoothGatt gatt, int status){ 
      gattServices.clear(); 
      gattServices.addAll(gatt.getServices()); 
      callback.onServicesDiscovered(gatt); 
     } 

     @Override 
     public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){ 
      handleCharacteristicChanged(characteristic, status, dataCallback); 
     } 

     @Override 
     public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status){ 
      handleCharacteristicChanged(characteristic, status, dataCallback); 
     } 

     @Override 
     public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic){ 
      handleCharacteristicChanged(characteristic, BluetoothGatt.GATT_SUCCESS, dataCallback); 
     } 
    }); 

    refreshDeviceCache(gatt); 

    return this.gatt; 
} 

La question est que je reçois des callbacks inattendues à onConnectionStateChange avec BluetoothProfile.STATE_DISCONNECTED, suivi par BluetoothProfile.STATE_CONNECTED. Cette phase de déconnexion-reconnexion se répète pendant la durée du service dans lequel elle s'exécute et la connexion n'est donc pas solide. Le fournisseur de l'appareil auquel j'essaie de me connecter a une application qui maintient sa connexion mais la mienne ne l'est pas. Quelle pourrait être la raison?

+0

À quel périphérique essayez-vous de vous connecter? Peut-être que l'appareil attend une sorte d'écriture, sinon il se déconnecte? – Emil

+0

Un lecteur de diagnostic moteur - destiné à surveiller le compteur kilométrique du véhicule, l'état du moteur et autres. [link] (http://wlius.com/bluelink) – Ron

+0

Il est assez courant que les périphériques BLE implémentent un délai d'inactivité, car ils sont conçus pour durer longtemps avec souvent une batterie de petite capacité. L'exécution d'une caractéristique en lecture ou en écriture peut suffire à maintenir le lien en vie. À quelle fréquence effectuez-vous une lecture? –

Répondre

0

Il s'avère que Mark Ch a raison de suggérer qu'il peut y avoir un délai d'inactivité. Dans le cas de cet appareil, il s'agissait de 30 secondes, donc une lecture toutes les 29 secondes ou moins empêchait les déconnexions. Juste souhaiter qu'ils auraient mentionné cela dans les docs!