para - manual de programacion android pdf
Android intervalo de tiempo de conexión BLE (5)
@Ashwini: Como se mencionó en el último comentario con el intervalo de conexión 7.5, está funcionando mejor por un período de tiempo. Después de algún tiempo, aparece el problema de L2CAP y la conectividad no funciona a menos que se reinicie el adaptador Bluetooth. Además, se ha observado un comportamiento extraño cuando el adaptador bluetooth se desactiva y se vuelve a habilitar nuevamente de manera programática. Obtenemos el siguiente error GKI a continuación:
> /GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception(): Task State Table
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [0] task name [BTU] state [0]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [1] task name [BTIF] state [1]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: TASK ID [2] task name [A2DP-MEDIA] state [1]
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: GKI_exception 65531 Sending to unknown dest#####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception:
> 02-05 15:49:24.466 E/GKI_LINUX( 2232):
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: * GKI_exception(): 65531 Sending to unknown dest
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): ##### ERROR : GKI_exception: ***************
> 02-05 15:49:24.466 E/GKI_LINUX( 2232): #####
Además, ¿esta API createBond ayuda a mejorar la conexión con el dispositivo BLE (que en realidad no necesita emparejamiento para la conexión)?
Estoy desarrollando una aplicación BLE en Nexus 4 usando la API BLE de Android. Tengo algunas preguntas / dudas:
1) ¿Hay alguna manera de establecer / anular la conexión o el intervalo de notificación del dispositivo central BLE? Descubrí que para Android, el intervalo de conexión predeterminado está fijado en 7,5 ms. ¿Hay alguna manera de cambiar esta configuración de intervalo de retardo de conexión / notificación.
2) Al conectarme al dispositivo remoto, me enfrento a un problema de desconexión después de un período de tiempo aleatorio. Hay muchas personas que enfrentan el problema de la caída de la conexión que indica que Android es inestable cuando está utilizando la API de Android 4.3 para la conexión BLE. ¿Hay alguna solución para esto?
EDITAR
Lo que más observo aquí es cuando se está demorando en reconectarse, luego viene con algún registro L2CAP ... siguiendo el registro
Trying to create a new connection laststate_ BOND_NONE
D/BluetoothGatt( 9620): connect() - device: 1C:BA:81:11:CA:36, auto: true
D/BluetoothGatt( 9620): registerApp()
D/BluetoothGatt( 9620): registerApp() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510
D/BtGatt.GattService( 3208): registerClient() - UUID=1adsds0911-4sdsc-41dc-8ac0-0sdsdf550510
D/BtGatt.btif( 3208): btif_gattc_register_app
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1000
D/BtGatt.btif( 3208): btif_gattc_upstreams_evt: Event 0
D/BtGatt.GattService( 3208): onClientRegistered() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510, clientIf=5
D/BluetoothGatt( 9620): onClientRegistered() - status=0 clientIf=5
D/BtGatt.GattService( 3208): clientConnect() - address=1C:BA:8C:1E:CA:36, isDirect=true
D/BtGatt.btif( 3208): btif_gattc_open
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1004
D/BtGatt.btif( 3208): btif_get_device_type: Device [1c:ba:8c:1e:ca:36] type 2, addr. type 0
W/bt-l2cap( 3208): L2CAP - LE - cannot start new connection at conn st: 3
¿Alguna idea de cómo se puede limpiar cahce por L2CAP?
Cuando estudié la API BLE de Android, no pude encontrar una API para cambiar el intervalo de conexión y el tiempo de espera de supervisión (tal vez también la latencia del esclavo, no puedo recordar desde la parte superior de mi cabeza). Si necesita cambiar esto, debe hacerlo desde el dispositivo esclavo.
La respuesta de Ashwini que puedes ignorar, lo que dice simplemente no es correcta. Un dispositivo maestro compatible con Bluetooth 4.0 debe admitir intervalos de conexión desde 7.5 ms hasta 4.0s. El dispositivo esclavo puede solicitar un cambio en los parámetros de conexión y envía una solicitud de actualización de parámetros de conexión, y el maestro actualizará el parámetro de conexión en consecuencia.
Por otro lado, el maestro (en su caso, el dispositivo Android) podría tener interés en cambiar el intervalo de conexión por su cuenta, para ahorrar energía, y le gustaría cambiar el intervalo de conexión a un intervalo más relajado.
En mi opinión, la API de Android e incluso la implementación de hardware en varios dispositivos son inmaduros y el uso de BLE, en el sentido de que BLE estaba destinado, atrae mucho poder en un dispositivo Android. En el futuro, creo que verá un soporte mucho mejor en el nivel de API y una división del host y el controlador para que el controlador pueda mantener la conectividad incluso cuando la CPU principal del dispositivo móvil está inactiva. Eso le ahorrará mucha energía y puede mantener la conectividad con sus dispositivos BLE las 24 horas del día, los 7 días de la semana, sin ningún tipo de restricción importante en la duración de la batería.
En cuanto a cambiar el intervalo de conexión:
Desde Android Lollipop API nivel 21 puede usar: requestConnectionPriority() con 3 niveles: CONNECTION_PRIORITY_BALANCED, CONNECTION_PRIORITY_HIGH o CONNECTION_PRIORITY_LOW_POWER.
Todavía no es tan versátil como quisiéramos los desarrolladores, pero al menos algo ...
Me encontré con el problema de desconexión automática igual que su segunda pregunta. Dos formas de resolverlo:
1) Empareje manualmente su dispositivo Android con el dispositivo remoto a través de la configuración de Bluetooth antes de ejecutar su aplicación.
2) O puede vincularlos programáticamente en su código. Aquí está el código de emparejamiento que encontré en línea, que funciona para mí
private void pairDevice(BluetoothDevice device) {
try {
Log.d("pairDevice()", "Start Pairing...");
Method m = device.getClass()
.getMethod("createBond", (Class[]) null);
m.invoke(device, (Object[]) null);
Log.d("pairDevice()", "Pairing finished.");
} catch (Exception e) {
Log.e("pairDevice()", e.getMessage());
}
}
Para su primera pregunta, como dijo OneWorld, es recomendable dejar que el teléfono inteligente maneje la configuración del intervalo de retardo de conexión. Esta configuración depende en gran medida del hardware bluetooth y la pila utilizada para un teléfono inteligente en particular.
Sobre el tema de la desconexión, también me enfrenté a problemas similares. Creo que esto se debe a un issue registrado en el enlace dado. Cuando el sistema operativo maneja la conexión y el emparejamiento, no puede desvincular el dispositivo y todos los intentos de reconexión fallarán después de esto. Esto no sucede si el dispositivo se emparejó (y no se emparejó) mediante el uso de API privadas en 4.3, suponiendo que haya manejado las conexiones de GATT correctamente. En Android 4.4.2, se ha agregado la API createBond para el emparejamiento. Así que con 4.4.2, la comunicación funciona bastante bien.
Con respecto a la estabilidad de Bluetooth de baja energía en Android, puedo confirmar que es bastante inestable. He probado una aplicación instalada en Nexus 4 y Nexus 5 con un sensor de baja energía. A pesar de tener el mismo sistema operativo versión 4.4.2, ambos dispositivos dieron resultados diferentes para la conexión. Observé que el dispositivo se desconectó después de cierto tiempo en Nexus 4, mientras que para Nexus 5 las cosas funcionaron bien.
Espero que esto te ayude a seguir adelante con tu problema.