studio scanner por dispositivos developer detectar conectar con buscar bluetoothadapter java android bluetooth bluetooth-lowenergy

java - scanner - ¿Diferencia entre cerrar() y desconectar() en Android Bluetooth API?



detectar dispositivos bluetooth android studio (2)

Android Bluetooth Low Energy API implementa 1 método para conectarse al dispositivo connectGatt() pero 2 métodos para cerrar la disconnect() 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() : la aplicación debe llamar a este método lo antes posible después de que se haya realizado con este cliente GATT.

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


Con disconnect() puede llamar a connect() y continuar con ese ciclo.

Una vez que llames close() ya terminaste. Si desea volver a conectarse, deberá volver a conectar connectGatt() en el connectGatt() BluetoothDevice ; close() liberará todos los recursos que posea BluetoothGatt .


He aquí algunos elementos de reflexión:

Siempre y cuando no haya llamado cerca al Gatt, aún puede intentar conectarse o descubrir. Por lo tanto, cuando intento descubrir servicios para una máquina, generalmente ejecuto un hilo o ejecutable que hace que la solicitud se conecte 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 luego puede usar para tratar de descubrir los servicios para el objeto BluetoothDevice. Parece bastante fácil de conectar, pero es mucho más difícil descubrir los servicios de la máquina.

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

Entonces, en mi hilo / ejecutable, verificará si BluetoothGatt es nulo. Si es así, volveré a llamar a la línea de código anterior, de lo contrario intentaré descubrir los servicios de BluetoothGatt como tales.

mBluetoothGatt.discoverServices();

Ah, 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 para usar en mi ejecutable, 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" o algo así.

En cada BluetoothGatt que creo, voy a llamar de cerca y luego transmitir una actualización que indica que la conexión está cerrada. Parece que hay muchas veces en que BluetootGatt no responde con un cambio de estado cuando se desconecta. Mi método para cerrar el BluetoothGatt es algo como esto. Dejo el método abierto para que la Actividad llame al servicio y desconecte si una máquina deja de responder 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); }