Völlig Trennen der Verbindung zu einem Bluetooth Low Energy-Gerät
Verbinde ich zu einem BLE-Gerät mit der connectGatt()
Methode in Android. Das funktioniert großartig.
Wenn ich die Verbindung nutze ich das folgende:
private void disconnectDevice() {
gatt.disconnect();
}
Wenn ich Sie erhalten den Rückruf habe ich nicht.
private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
switch (newState) {
case BluetoothProfile.STATE_CONNECTED:
Log.d("BLED-GATT", "STATE_CONNECTED");
setUIConnectionStatus("Discover services on device...", Color.YELLOW);
checkEnableAddButton(simpleTrackEditText.getText().toString());
gatt.discoverServices();
break;
case BluetoothProfile.STATE_DISCONNECTED:
Log.d("BLED-GATT", "STATE_DISCONNECTED");
setUIConnectionStatus("Not Connected!", Color.RED);
gatt.close();
break;
default:
Log.d("BLED-GATT", "STATE_OTHER");
}
}
}
Diese ausgeführt wird, und ich kann es nicht länger kontrollieren Sie das Gerät nach dem Aufruf disconnectDevice()
. Das Gerät selbst scheint zu denken, dass es verbunden ist, da kann ich nicht steckte es in Rundfunk-Sicht-Modus (was passiert, wenn es bereits eine Verbindung). Wenn ich allerdings töten Sie die Anwendung und öffnen Sie es erneut, dann kann ich das Gerät im Rundfunk-Modus. Das sagt mir die app wurde nicht richtig getrennt.
Irgendeine Idee, was ich hier verpasst?
Danke, aber ja, ich nenne stopScan bei erfolgreicher Verbindung.
InformationsquelleAutor nilsi | 2016-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem war, dass ich während des Scans wurde die Verbindung auf dem gleichen Gerät mehrere Male, wodurch mein Antrag auf die viele verbindungen gleichzeitig öffnen. Hinzufügen
!isConnected()
das problem gelöst:isConnected()
Gegenzug eine Art private variable, die Sie verfolgen? Können Sie erläutern, wie weiter...??? Thx!!!Kann mich nicht erinnern, aber ich denke, das war nur eine utility-Methode, die ich gemacht habe. Die überprüfung, ob
gatt
null war, wenn ja, dann war ich sicher, es war keine Verbindung bereits. Ich sollte auch gesetzt habengatt
zu null inonConnectionStateChange
denke ichDas ist nicht korrektes Verhalten von der peer nach dem spec. Wenn ein peer erhält eine Verbindung Ereignis, es ist halt Werbung. Da viele BTLE Geräte, die sich schlecht Verhalten (wie funktioniert die Android-API), die als work-a-round Ignoriere ich alle empfangenen Werbung aus einem bereits verbundenen Gerät. Ich tun, drehen von Scans während der Verbindung aber einmal angeschlossen, schalte ich es wieder auf. Ansonsten kann man nicht mehrere gleichzeitige verbindungen unterstützen.
InformationsquelleAutor nilsi
Ist das ganz und Logik, weil Sie nicht trennen Sie vor dem schließen des Gatt.
versuchen Sie diese Methode aufrufen, bevor Sie schließen Ihre
GATT
close()
? Ihre Antwort ist nur das hinzufügen einer null-check zu meinem code?Nein, Nein, in der Tat müssen Sie rufen Sie die disconnect-Methode, die es sonst nur in der Nähe des Gatt ohne abklemmen !! probieren Sie es einfach
InformationsquelleAutor Fakher
Erlebte ich dasselbe problem und ich fand zwei mögliche Ursache wie folgt:
1. War das gleiche wie @nilsi Antwort, die Verbindung zu dem Gerät mehr als einmal in einem scan.
→ lösen von lock & Liste
2. schließen Sie das Gerät in einer Abfrage und nicht onConnectionStateChange, als ich erneut gescannt, führte es im zweiten Verbindung mit demselben Gerät.
→ gelöst indem BluetoothGatt Objekt, wenn ich rufe Gerät.connectGatt(), und rufen Sie Objekt.disconnect () - Objekt.close() vor dem Scannen.
Mein test-Handy ist 4 Jahre alt, also manchmal braucht es mehr als 20 Sekunden zurück onConnectionStateChange....
InformationsquelleAutor Ray Chung