Unterschied zwischen close() und disconnect()?

Lesezeit: 4 Minuten

Benutzer-Avatar
Artur Vancans

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?

  • ich vermute Close bedeutet, dass Sie das Gatt-Objekt nicht mehr verwenden werden

    – Konstantin Konopko

    17. April 2014 um 10:50 Uhr


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.

  • Super hilfsbereit – habe nur angerufen disconnect() und es liefen ständig BT-Schnittstellen aus, die neue Verbindungen verhinderten. Berufung close() verhindert dies.

    – dgel

    11. September 2014 um 21:42 Uhr

  • Wann immer ich benutze disconnect() oder close() die Callback-Methode onConnectionStateChange niemals angerufen werden, was auf STATE_DISCONNECTED hinweist.

    – DavidF

    8. Dezember 2014 um 14:31 Uhr

  • close() erhält keinen Aufruf von onConnectionStateChange, aber disconnect() sollte. Sind Sie sicher, dass Sie wirklich verbunden waren, als Sie disconnect() aufgerufen haben?

    – Douglas Jones

    8. Dezember 2014 um 17:58 Uhr

  • @AlexanderFarber Sie können close() ohne disconnect() aufrufen, aber meiner Erfahrung nach erhalten Sie keinen onConnectionStateChange-Rückruf.

    – Douglas Jones

    23. Juni 2015 um 14:09 Uhr


  • Ich habe auch mit inkonsequentem Verhalten zu kämpfen. Wenn Sie gatt.close() aufrufen, müssen Sie bei der nächsten Verbindung mit demselben Gerät die Diensterkennung wiederholen. Verbundene BTLE-Geräte sollten dies nicht tun oder nicht Merkmale aktiviert wurden) und kann (per Spezifikation) sofort beliebige Daten senden. Es wird davon ausgegangen, dass Sie seine Dienste kennen. Wenn Sie einen Gatt-Abschluss durchgeführt haben, kennen Sie seine Dienste nicht und können diese Daten verlieren. Ich weiß nicht, was Android im unteren Bereich macht, aber bei der Arbeit mit eingebetteten Low-Level-Stacks ist dies definitiv der Fall.

    – Brian Reinhold

    28. März 2019 um 10:03 Uhr

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

  • Es ist ein wenig verwirrend, dass Sie die Methode aufrufen disconnectGatt wenn du wirklich anrufst close() Anstatt von disconnect().

    – Herr Blond

    27. Mai 2019 um 18:03 Uhr

1135790cookie-checkUnterschied zwischen close() und disconnect()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy