2015-02-26 13 views
6

Ich bin auf der Suche nach einem Android-Weg, die Eigenschaften der App von einem Ble-Gerät zu spülen, oder zumindest aus den Daten wissen, dass die Verbindung verloren gegangen ist sobald es tatsächlich ist, außer etwa 15 Sekunden nachdem es getrennt wurde. Wenn es eine Möglichkeit gibt, das GATT-Verbindungstimeout zu ändern, wäre das wesentlich besser.Ändern von Bluetooth Low Energy Gatt Timeout oder Flushing Stream lesen, um Disconnect-Ereignis schneller zu erkennen

Um in einer anderen Form zu wiederholen, möchte ich eine Lösung (oder eine Verbindung, die erklären kann), eine Trennung der BLE-Gerät schneller als was auch immer der Timeout-Wert derzeit ist, erkennen, ob der Wert I Ich bekomme es frisch, indem ich die Charakteristik spüe, oder das Zeitlimit für Verbindungsunterbrechungen auf der gatt-Seite ändere, damit ich innerhalb einer Sekunde sehen kann, dass die Verbindung unterbrochen wird, um anderen Code auszulösen.

Antwort

1

Andere Antworten hier sind vielleicht besser als diese, aber das war meine Lösung für das Problem. Stellen Sie sicher, dass Sie versuchen, Emil's antworten, bevor Sie dies verwenden.

Was ich seit der Zeit getan habe, war zu langsam, um darauf zu warten, das Rssi zu überprüfen, da es sich immer ändert. Wenn es einen Zeitraum von 3 Sekunden gibt, bei dem der Wert gleich bleibt, wird die Verbindung zum Gerät getrennt. Dies dauert etwa 15 Sekunden und fügt unser eigenes Timeout hinzu.

Dies wäre erforderlich, um die Signalstärke zu überprüfen. Dies wurde vor ein paar Jahren geschrieben, daher müssen einige Dinge geändert werden.

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

Irgendwo in einer Schleife, rufen

mBluetoothGatt.readRemoteRssi() 
-1

Es gibt einen Rückruf in Android ist:

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

Dies ist, was ich habe ziemlich viel gerade jetzt in meinem Code. Ich verwende den Beispiel-Bluetooth-Niedrigenergie-Code, der in den Android-SDK-Beispielen bereitgestellt wird. Es dauert derzeit 20 Sekunden nach der Trennung für das, was Sie angegeben haben, um beim letzten Mal, als ich die Zeit gemessen habe, angerufen zu werden.Da die Signalstärke fast nie den gleichen Wert für 20 Lesungen oder so ist, werde ich versuchen zu sehen, ob das funktioniert. – btelman96

0

Sie wissen nicht, ob dies eine Hilfe sein würde, aber Sie können die Vorteile nehmen (wenn Sie es haben) einer periodischen Daten, die in der gatt übertragen wird . Also, wenn Sie zum Beispiel eine Messung von 1 Sekunde der Periodizität haben, können Sie so etwas wie tun:

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

So ist das „measurement_timeout“ wird als eine tatsächliche Timeout arbeiten, dass, wenn es die 0 erreicht bedeutet, dass Sie nicht haben, Daten im Zeitraum von 3000 ms erhalten. Beachten Sie, dass Sie eine Wiedergabezeit von> 2 * Daten haben müssen.

0

Die einzige Möglichkeit, einen schnellen Gatt-Disconnect zu erreichen, bestand darin, sicherzustellen, dass das Peripheriegerät eine BLE-Disconnection-Anweisung sendet, bevor es die Verbindung abschaltet oder trennt.

Sobald Android die Trennanweisung erhält, räumt das gatt sofort auf, anstatt 15 Sekunden zu nehmen, um zu erkennen, dass das Peripheriegerät fehlt.

Es scheint, dass die meisten Peripheriegeräte nicht stören und einfach verschwinden.

Dieser Ansatz ist natürlich nur möglich, wenn Sie das Peripheriegerät ändern können.

0

Der richtige Weg besteht darin, die Verbindungsparameter-Aktualisierungsanforderung von der peripheren Seite zu verwenden, um die Zeitüberschreitung auf einen niedrigeren Wert zu ändern.

Verwandte Themen