2015-02-26 17 views
6

Szukam sposobu na spłukiwanie charakterystyki aplikacji otrzymywanej z urządzenia Ble lub przynajmniej na podstawie danych, że połączenie zostało utracone tak szybko, jak to możliwe, z wyjątkiem około 15 sekund po rozłączeniu. Jeśli istnieje sposób na zmianę limitu czasu połączenia Gatt, byłoby to znacznie lepsze.zmiana limitu czasu gatt o niskim zużyciu energii lub przepłukanie strumienia odczytu, aby szybciej wykryć zdarzenie rozłączenia

Aby powtórzyć w innej formie, chciałbym rozwiązanie (lub łącze, które może wyjaśnić), aby wykryć rozłączenie urządzenia BLE szybciej niż cokolwiek wartość timeout obecnie jest, poprzez sprawdzenie, czy wartość I Dostaję świeżą przez wypłukanie charakterystyki lub zmianę limitu czasu rozłączenia po stronie GAT, dzięki czemu widzę w ciągu sekundy od rozłączenia, aby wywołać inny kod.

Odpowiedz

1

Inne odpowiedzi tutaj mogą być lepsze niż ten, ale to było moje rozwiązanie problemu. Przed skorzystaniem z tej opcji należy spróbować odpowiedzieć na Emil's.

Co zrobiłem, ponieważ czas był zbyt wolny, aby czekać na to, aby sprawdzić rssi, ponieważ zawsze się zmienia. Jeśli jest okres czasu, powiedzmy 3 sekundy, gdzie wartość pozostaje taka sama, odłącza się od urządzenia. Obejmuje to 15-sekundowy limit czasu i dodaje nasz własny limit czasu.

To będzie potrzebne do sprawdzenia siły sygnału. Zostało to napisane kilka lat temu, więc niektóre rzeczy mogą wymagać zmiany.

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

Gdzieś w pętli, zadzwoń

mBluetoothGatt.readRemoteRssi() 
-1

Jest zwrotna w Androidzie:

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

To właśnie dość dużo w moim kodu teraz. Używam przykładowego kodu niskiej energii Bluetooth dostarczonego w przykładach sdk dla Androida. Obecnie trwa 20 sekund po rozłączeniu, ponieważ to, co dostałeś, nazywa się ostatnim razem, gdy mierzyłem czas.Ponieważ siła sygnału prawie nigdy nie jest taka sama dla 20 odczytów, spróbuję sprawdzić, czy to działa. – btelman96

0

Nie wiem, czy byłoby to pomocne, ale można skorzystać (jeśli masz) okresowej danych, które są przesyłane w GATT . Więc jeśli na przykład masz pomiar 1 sekundę okresowości można zrobić coś takiego:

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

więc „measurement_timeout” będzie działać jako rzeczywisty czas oczekiwania, że ​​gdy dojdzie do 0 oznacza, że ​​nie masz dane otrzymane w okresie 3000 ms. Zwróć uwagę, że musisz mieć czas oglądania> 2 * okres danych.

0

Jedynym sposobem, w jaki udało mi się uzyskać szybkie rozłączenie z gatt, było zapewnienie, że urządzenie peryferyjne wysyła instrukcję rozłączenia BLE, zanim wyłączy lub zerwie połączenie.

Po otrzymaniu instrukcji odłączenia od androida, gracz natychmiast sprząta, zamiast czekać 15 sekund, aby zdać sobie sprawę, że brakuje urządzenia peryferyjnego.

Wygląda na to, że większość urządzeń peryferyjnych nie zawraca sobie głowy i po prostu znika.

Oczywiście takie podejście jest możliwe tylko wtedy, gdy jesteś w stanie zmodyfikować urządzenie peryferyjne.

0

Właściwy sposób polega na użyciu żądania aktualizacji parametrów połączenia od strony peryferyjnej w celu zmiany limitu czasu na niższą wartość.