La publicidad Bluetooth LE falla cuando se inicia y se detiene cíclicamente

He probado la publicidad Bluetooth LE, es decir, usando un teléfono Android como dispositivo "periférico" BLE. Comenzar y detener una publicidad constante una vez funciona bien, pero si quisiera transmitir algunos datos variables, necesitaría comenzar, detener y reiniciar la publicidad en un ciclo y siempre cambiar el paquete de publicidad.

Estoy usando estos métodos, por supuesto:
BluetoothLeAdvertiser.startAdvertising ()
BluetoothLeAdvertiser.stopAdvertising ()

Al menos en un Motorola Moto G 4G de 2a generación. (XT1072) con Android 5.0.2 el ciclo solo se ejecuta durante un tiempo y luego algo sale mal en la pila de Bluetooth y ya no se puede iniciar una nueva publicidad. Cuando se ejecuta el ciclo rápidamente, esto sucede rápidamente y si se ejecuta lentamente, lleva más tiempo, por lo que podría estar relacionado con el llenado de un búfer.

Mi pregunta es: ¿Esto también sucede en otros dispositivos que no sean Motorola?

(Y cualquier otro comentario relacionado es, por supuesto, bienvenido).

Teóricamente, podría depender de la implementación de HAL específica del fabricante, etc., por lo que me gustaría saber si debería obtener otro dispositivo para poder trabajar en esto, ya que cualquier solución de Google / Motorola tomaría algún tiempo, por supuesto.

Esta aplicación de prueba. se puede usar para probar esto:

https://bitbucket.org/MarkusKauppinen/bleadvertisertest

Si todo va bien, felizmente seguirá publicitando para siempre y si este problema se reproduce, mostrará un cuadro de diálogo en un par de minutos más o menos. Si su dispositivo no es compatible con la publicidad Bluetooth LE o BLE, simplemente se bloqueará. (Es solo una aplicación de prueba rápida y sucia).

Otra forma fácil de reproducir esto es ejecutar la aplicación "bluetoothadvertiser" desdehttps://github.com/devunwired/accessory-samples y sigue tocando rápidamente el botón "Actualizar anuncio" en la interfaz de usuario por un tiempo.

Detalles adicionales:

El soporte de modo periférico Bluetooth LE (necesario para publicidad) se agregó en Lollipop y no está disponible en 4.x. Solo ciertos dispositivos tienen soporte para modo periférico. La compatibilidad está cubierta al menos en:

https://altbeacon.github.io/android-beacon-library/beacon-transmitter-devices.html Chipsets / dispositivos compatibles con el modo periférico Android 5 BLE Conjuntos de chips que admiten la función periférica BLE en Android 5

Por ejemplo, estos dispositivos deben tener soporte: Motorola Moto E 4G (2015), Motorola Moto G 4G (2da generación), Sony Xperia M4 Aqua, ZTE Blade S6, Motorola Moto X (2014), Samsung Galaxy S6, Google Nexus 6 , Google Nexus 9, HTC One M9, Samsung Galaxy S6 Edge.

En cuanto a los "detalles sucios", siempre puedo ver una "GKI_Exception" en LogCat antes de que esto suceda:

GKI_exception (): 65524 getbuf: sin buffers

Poco después de la primera "GKI_Exception", el anuncio falla con AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR. La línea...

E / BtGatt.btif? ### ASSERT: externo / bluetooth / bluedroid / main /../ btif / src / btif_gatt_client.c línea 803 ¡Error en la transferencia de contexto! (3) ###

... probablemente sea relevante, pero no estoy familiarizado con BlueDroid. Dicha afirmación está aquí:

https://android.googlesource.com/platform/external/bluetooth/bluedroid/+/android-5.0.2_r1/btif/src/btif_gatt_client.c#803

Algunos problemas posiblemente relacionados:
https://code.google.com/p/android/issues/detail?id=65455 <- Agregué algunos comentarios y archivos de registro a este.
https://code.google.com/p/android-developer-preview/issues/detail?id=1753
Escaneo de gran cantidad de etiquetas BLE
Bloqueo de Bluetooth en Samsung S4

Respuestas a la pregunta(1)

Su respuesta a la pregunta