Diferencia entre close() y disconnect()?


Android Bluetooth Low Energy API implementa 1 método para conectarse al dispositivo connectGatt() pero 2 métodos para cerrar la conexión disconnect() y close().

La documentación dice:

  • disconnect(): Desconecta una conexión establecida, o cancela un intento de conexión actualmente en curso.

  • close(): Aplicación debe llamar a este método tan pronto como sea posible después de que se hace con este cliente del GATT.

El código fuente de BluetoothGatt.java muestra que close() anula el registro de la aplicación y disconnect() desconecta el cliente. Sin embargo no dice lo que realmente significa. Quiero decir, si solo hay 1 manera de conectarse al cliente, ¿por qué hay 2 maneras de cerrar/desconectar la conexión?

Author: Chisko, 2014-04-16

2 answers

Con disconnect() puede llamar más tarde a connect() y continuar con ese ciclo.

Una vez que llames close() has terminado. Si desea conectarse de nuevo tendrá que llamar a connectGatt() en el BluetoothDevice de nuevo; close() liberará cualquier recurso retenido por BluetoothGatt.

 51
Author: Douglas Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 14:11:58

Aquí hay algo para pensar:

Mientras usted no haya llamado cerca en el Gatt, usted todavía puede intentar conectar con él, o descubrir. Por lo tanto, cuando intento descubrir servicios para una máquina, generalmente ejecutaré un subproceso o ejecutable que realiza la solicitud para conectarse a la máquina durante un cierto período de tiempo.

El primer intento con una conexión de máquina, devolverá un objeto BluetoothGatt que puede usar más tarde para intentar descubrir los servicios para el objeto BluetoothDevice. Se parece bastante fácil de conectar, pero mucho más difícil de descubrir los servicios de la máquina.

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

Así que en mi thread / runnable, comprobaré si el BluetoothGatt es null. Si lo es, volveré a llamar a la línea de código anterior, de lo contrario intentaré descubrir los servicios BluetoothGatt como tales.

mBluetoothGatt.discoverServices();

Oh, y SIEMPRE me aseguro de llamar a BluetoothAdapter.cancelDiscovery () antes de cualquier intento de conexión para descubrir el servicio.

mBluetoothAdapter.cancelDiscovery();

Aquí hay un método que se usa para conectar en mi runnable etc:

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

Por último, asegúrese de cerrar cualquier objeto BluetoothGatt al que se haya conectado. Parece que Android puede manejar cinco objetos BluetoothGatt antes de que comience a decir "no se puede conectar al servidor Gatt" u otra cosa por el estilo.

En cada BluetoothGatt que cree, llamaré a close y luego transmitiré una actualización indicando que la conexión está cerrada. Parece que hay muchas veces donde el BluetootGatt no responderá con un el estado cambia cuando se desconecta. Mi método de cerrar el BluetoothGatt es algo así. Dejo el método abierto para que la Actividad llame al servicio y se desconecte si una máquina no responde y no se llama al estado de desconexión.

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

    broadcastUpdate(ACTION_STATE_CLOSED);
}
 12
Author: Droid Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-28 02:09:48