Die Android Bluetooth Low Energy API implementiert 1 Methode zum Herstellen einer Verbindung mit dem Gerät connectGatt()
aber 2 Methoden, um die Verbindung zu schließen disconnect()
und close()
.
Dokumentation sagt:
-
disconnect()
: Trennt eine bestehende Verbindung oder bricht einen gerade laufenden Verbindungsversuch ab.
-
close()
Hinweis: Die Anwendung sollte diese Methode so früh wie möglich aufrufen, nachdem sie mit diesem GATT-Client ausgeführt wurde.
Der Quellcode von BluetoothGatt.java zeigt, dass close() die Registrierung der Anwendung aufhebt und disconnect() den Client trennt. Was das genau bedeutet, sagt sie aber nicht. Ich meine, wenn es nur 1 Möglichkeit gibt, eine Verbindung zum Client herzustellen, warum gibt es dann 2 Möglichkeiten, die Verbindung zu schließen/zu trennen?
Mit disconnect()
Sie können später anrufen connect()
und fahre mit diesem Zyklus fort.
Einmal anrufen close()
du bist fertig. Wenn Sie erneut eine Verbindung herstellen möchten, müssen Sie anrufen connectGatt()
auf der BluetoothDevice
wieder; close()
wird alle Ressourcen freigeben, die von gehalten werden BluetoothGatt
.
Hier ein paar Denkanstöße:
Solange Sie das Gatt nicht nahe angerufen haben, können Sie immer noch versuchen, sich damit zu verbinden oder es zu entdecken. Wenn ich also versuche, Dienste für eine Maschine zu finden, führe ich normalerweise einen Thread oder eine ausführbare Datei aus, die die Anfrage stellt, sich für eine bestimmte Zeit mit der Maschine zu verbinden.
Beim ersten Versuch mit einer Computerverbindung wird ein BluetoothGatt-Objekt zurückgegeben, mit dem Sie später versuchen können, die Dienste für das BluetoothDevice-Objekt zu ermitteln. Es scheint ziemlich einfach zu sein, eine Verbindung herzustellen, aber viel schwieriger, die Maschinendienste zu entdecken.
mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
Also werde ich in meinem Thread / Runnable prüfen, ob das BluetoothGatt null ist. Wenn ja, rufe ich die obige Codezeile erneut auf, ansonsten versuche ich, die BluetoothGatt-Dienste als solche zu entdecken.
mBluetoothGatt.discoverServices();
Oh, und ich stelle IMMER sicher, dass ich BluetoothAdapter.cancelDiscovery() aufrufe, bevor ich versuche, eine Verbindung herzustellen oder den Dienst zu entdecken.
mBluetoothAdapter.cancelDiscovery();
Hier ist eine Methode, um eine Verbindung in meinem Runnable usw. herzustellen:
public void connectToMachineService(BLEMachine machine) {
Log.i(SERVICE_NAME, "ATTEMPTING TO CONNECT TO machine.getDevice().getName());
mBluetoothAdapter.cancelDiscovery();
if(mBluetoothGatt == null)
mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
else
mBluetoothGatt.discoverServices();
}
Stellen Sie abschließend sicher, dass Sie alle BluetoothGatt-Objekte schließen, mit denen Sie verbunden sind. Es scheint, dass Android fünf BluetoothGatt-Objekte verarbeiten kann, bevor es anfängt zu sagen, dass keine Verbindung zum Gatt-Server hergestellt werden kann oder ähnliches.
Bei jedem BluetoothGatt, das ich erstelle, rufe ich Close an und sende dann eine Aktualisierung, die besagt, dass die Verbindung geschlossen ist. Es scheint, dass es viele Fälle gibt, in denen das BluetootGatt nicht mit einer Statusänderung reagiert, wenn es getrennt wird. Meine Methode zum Schließen des BluetoothGatt geht ungefähr so. Ich lasse die Methode für die Aktivität offen, um den Dienst aufzurufen und die Verbindung zu trennen, wenn ein Computer nicht mehr reagiert und der Trennungsstatus nicht aufgerufen wird.
public void disconnectGatt(BluetoothGatt gatt) {
if(gatt != null) {
gatt.close();
gatt = null;
}
broadcastUpdate(ACTION_STATE_CLOSED);
}
ich vermute
Close
bedeutet, dass Sie das Gatt-Objekt nicht mehr verwenden werden– Konstantin Konopko
17. April 2014 um 10:50 Uhr