2015-02-26 25 views
6

Sto cercando un modo Android per svuotare le caratteristiche che l'app riceve da un dispositivo Ble, o almeno sapere dai dati che la connessione è stata persa non appena è in realtà tranne 15 secondi dopo la disconnessione. Se c'è un modo per cambiare il timeout della connessione gatt, sarebbe molto meglio.modifica del timeout gatt a bassa energia bluetooth o flusso di lettura in lettura per rilevare l'evento di disconnessione più veloce

Per ripetere in un modulo diverso, vorrei che una soluzione (o un collegamento che può spiegare) per rilevare una disconnessione del dispositivo BLE più veloce di qualsiasi valore corrente sia, per vedere se il valore I sto ottenendo è fresco con il flushing della caratteristica, o modificando il timeout di disconnessione sul lato gatt, così posso vedere in un secondo che si disconnette per attivare altro codice.

risposta

1

Altre risposte qui potrebbero essere migliori di questa, ma questa era la mia soluzione al problema. Assicurati di provare la risposta Emil's prima di utilizzare questo.

Quello che ho fatto da quando il tempo era troppo lento per aspettare era controllare l'RSI visto che cambia sempre. Se c'è un periodo di tempo, diciamo 3 secondi, dove il valore rimane lo stesso, si disconnette dal dispositivo. Questo aggira il timeout di 15 secondi e aggiunge il nostro timeout.

Questo sarebbe ciò che sarebbe necessario per controllare la potenza del segnale. Questo è stato scritto un paio di anni fa, quindi potrebbe essere necessario modificare alcune cose.

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { 

    @Override 
    public void onReadRemoteRssi(BluetoothGatt gatt, int rssi, int status){ 
      //check for signal strength changes. It will stay the same if we 
      //are getting no updates 
      if(mLastRssi == rssi){ 
       disconnectCounter++; 
       if(disconnectCounter> 140) { 
        //disconnect logic as if we are done with connection 
        //maybe start listening for device again to reconnect 
        disconnectCounter = 0; 
       } 
      } 
      else{ 
       //we are connected. reset counter 
       disconnectCounter = 0; 
      } 
      //store last value as global for comparison 
      mLastRssi= rssi; 
    } 
} 

Da qualche parte in un ciclo, chiamata

mBluetoothGatt.readRemoteRssi() 
-1

C'è una richiamata in Android:

BluetoothGattCallback btleGattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt,int status,int newState){ 
     if(newState == BluetoothProfile.STATE_DISCONNECTED){ 
      //your code here 
     } 
    } 
} 
+2

Questo è quello che praticamente ho nel mio codice in questo momento. Sto usando il codice di bassa energia bluetooth di esempio fornito negli esempi di sdk di Android. Attualmente ci vogliono 20 secondi dopo la disconnessione per ciò che hai fornito per essere chiamato l'ultima volta che ho misurato il tempo.Poiché la potenza del segnale non è quasi mai lo stesso valore per 20 letture o giù di lì, cercherò di vedere se funziona. – btelman96

0

Non so se questo sarebbe di aiuto, ma si può usufruire (se lo avete) di un data periodica che viene trasmesso nel GATT . Così, se per esempio si dispone di una misura di 1 secondo di periodicità si può fare qualcosa di simile:

// runnable to detect the lack of activity: 
private final Runnable watchDog = new Runnable() { 
    @Override 
    public void run() { 
     measurement_timeout--; 
     if(measurement_timeout==0) { 
      Log.d("BLE_CONTROLLER", "PROBE WITH NO ACTIVITY"); 

     } 
    } 
}; 

// this should be in the reception of the periodic data: 
measurement_timeout++; 
mHandler.postDelayed(watchDog, 3000); 

Così il "measurement_timeout" funzionerà come un timeout reale che quando raggiunge lo 0 significa che non si dispone di dati ricevuti nel periodo di 3000 ms. Si noti che è necessario un tempo di visualizzazione> 2 * periodo di dati.

0

L'unico modo in cui sono riuscito a ottenere una disconnessione rapida gatt è stato quello di garantire che il dispositivo periferico invii un'istruzione di scollegamento BLE prima che si spenga o interrompa la connessione.

Una volta che Android ha ricevuto l'istruzione di disconnessione, il gatt riordina immediatamente invece di impiegare 15 secondi per capire che manca la periferica.

Sembrerebbe che la maggior parte delle periferiche non si preoccupi e semplicemente scompaia.

Chiaramente questo approccio è possibile solo se si è in grado di modificare la periferica.

0

Il modo corretto è utilizzare la richiesta di aggiornamento dei parametri di connessione dal lato periferico per modificare il timeout su un valore inferiore.