2014-04-16 4 views
31

Android Bluetooth Low Energy API implementiert 1 Methode zum Verbinden mit dem Gerät connectGatt() aber 2 Methoden zum Schließen der Verbindung disconnect() und close().Unterschied zwischen close() und trennen() in Android Bluetooth API?

Dokumentation sagt:

  • disconnect(): Trennt eine bestehende Verbindung oder bricht einen Verbindungsversuch derzeit im Gange.

  • close(): Die Anwendung sollte so früh wie möglich diese Methode aufrufen, nachdem sie mit dieses GATT-Client durchgeführt wird.

Der Quellcode BluetoothGatt.java zeigt, dass close() hebt die Registrierung der Anwendung und disconnect() trennen den Client. Es sagt jedoch nicht, was das eigentlich bedeutet. Ich meine, wenn es nur eine Möglichkeit gibt, sich mit dem Client zu verbinden, warum gibt es 2 Möglichkeiten, die Verbindung zu trennen/zu trennen?

+0

Ich denke, 'Close' heißt, dass Sie nicht mehr Gatt –

Antwort

35

Mit disconnect() können Sie später connect() aufrufen und mit diesem Zyklus fortfahren.

Sobald Sie close() anrufen, sind Sie fertig. Wenn Sie sich erneut verbinden möchten, müssen Sie erneut connectGatt() auf dem BluetoothDevice aufrufen; close() wird alle von BluetoothGatt gehaltenen Ressourcen freigeben. Hier

+2

Super-Objekt verwenden, hilfsbereit, nur wurde Aufruf' disconnect() 'und lief weiter aus BT-Schnittstellen keine neuen Verbindungen zu verhindern. Der Aufruf von 'close()' verhindert dies. – dgel

+7

Immer wenn ich 'disconnect()' oder 'close()' verwende, wird die Callback-Methode 'onConnectionStateChange' niemals aufgerufen, was STATE_DISCONNECTED anzeigt. – DaviF

+1

close() ruft nicht onConnectionStateChange auf, aber disconnect() sollte. Sind Sie sicher, dass Sie wirklich verbunden waren, als Sie disconnect() anriefen? –

9

ist etwas zum Nachdenken:

Solange Sie nicht in der Nähe auf der Gatt genannt, können Sie immer noch versuchen, eine Verbindung herzustellen oder 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, sich zu verbinden, aber es ist viel schwieriger, die Maschinen zu finden.

mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback); 

Also in meinem Thread/runnable, werde ich überprüfen, um zu sehen, ob die BluetoothGatt null ist. Wenn dies der Fall ist, rufe ich die obige Codezeile erneut an, sonst werde ich versuchen, die BluetoothGatt-Dienste als solche zu entdecken.

mBluetoothGatt.discoverServices(); 

Oh, und ich IMMER sicher, dass BluetoothAdapter.cancelDiscovery() vor jedem Versuch, rufen bei Verbindung des Service zu entdecken.

mBluetoothAdapter.cancelDiscovery(); 

Hier ist eine Methode in meinem runnable etc verbinden zu verwenden ist:

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

Schließlich stellen Sie sicher, dass Sie alle BluetoothGatt Objekte in der Nähe aus, die Sie angeschlossen haben. Es scheint, dass Android fünf BluetoothGatt-Objekte verwalten kann, bevor es anfängt zu sagen, dass "keine Verbindung zum Gatt-Server hergestellt werden kann" oder etwas Ähnliches.

Auf jedem BluetoothGatt, das ich erstelle, werde ich nah darauf anrufen und dann ein Update senden, das besagt, dass die Verbindung geschlossen ist.Es scheint, dass es viele Zeiten gibt, in denen der BluetootGatt nicht mit einer Statusänderung reagiert, wenn die Verbindung getrennt wird. Meine Methode, das BluetoothGatt zu schließen, sieht ungefähr so ​​aus. Ich lasse die Methode offen, damit die Aktivität den Service aufruft und die Verbindung trennt, wenn eine Maschine nicht mehr reagiert und der Status der Trennung nicht aufgerufen wird.

public void disconnectGatt(BluetoothGatt gatt) { 
    if(gatt != null) { 
     gatt.close(); 
     gatt = null; 
    } 

    broadcastUpdate(ACTION_STATE_CLOSED); 
} 
Verwandte Themen