Android Marshmallow ScanSetting
Me gustaría crear mi configuración de escaneo en Android M para que pueda obtener devoluciones de llamada independientes para tres eventos diferentes en un objeto ScanCallback
:
- Cuando el dispositivo remoto coincidía primero con el filtro
- Cuando el teléfono Android recibió anuncios después del primer descubrimiento (en este caso estoy comprobando si los datos del anuncio han cambiado o no)
- Cuando el dispositivo remoto está fuera de rango
Hay tres opciones en la API :
- Android lolipop java.lang.SecurityException: Ni el usuario ni el proceso actual tiene android.permission.BLUETOOTH_PRIVILEGED
- Android: Límite de conexiones BLE simultáneas
- Obtención de datos de byte scanRecord diferentes para el mismo dispositivo BLE al escanear con diferentes versiones del dispositivo android
- Envío de más de 20 bytes a través de BLE
- Programáticamente, ¿Cómo identificar si un faro pertenece a Eddystone o iBeacon?
CALLBACK_TYPE_ALL_MATCHES CALLBACK_TYPE_FIRST_MATCH CALLBACK_TYPE_MATCH_LOST
Desafortunadamente, no hay una buena documentación acerca de si estas tres opciones pueden ser utilizadas todas juntas o no. De acuerdo con mis experimentos, debo elegir sólo uno de ellos. ¿La API requiere que CALLBACK_TYPE_ALL_MATCHES
exploraciones simultáneas para obtener la devolución de llamada para CALLBACK_TYPE_ALL_MATCHES
y CALLBACK_TYPE_MATCH_LOST
al mismo tiempo? ¿Alguien tiene alguna experiencia en cómo usar estas opciones?
EDIT :
Después de comprobar el código fuente de la API descubrí que CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST
CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST
es también una combinación válida. Sin embargo, el uso de CALLBACK_TYPE_FIRST_MATCH
hace mucho más lento (~ 30 segundos) para descubrir en comparación con CALLBACK_TYPE_ALL_MATCHES
. Además, se llama a CALLBACK_TYPE_MATCH_LOST
aunque el dispositivo está promocionando activamente. No creo que esta API sea fiable.
Estos son mis resultados:
12: 02: 50.179 31627-31655 D / BluetoothLeScanner: onClientRegistered () – estado = 0 clientIf = 6
12: 03: 24.877 31627-31627 D / ScanCallbackMarshmallow: ScanResult {mDevice = E8: A8: C9: 82: 17: 61, …}
12: 03: 24.878 31627-31627 D / ScanCallbackMarshmallow: CALLBACK_TYPE_FIRST_MATCH
12: 03: 29.905 31627-31627 D / ScanCallbackMarshmallow: ScanResult {mDevice = C0: B6: 43: 1E: 45: 28, …}
12: 03: 29.906 31627-31627 D / ScanCallbackMarshmallow: CALLBACK_TYPE_FIRST_MATCH
12: 03: 39.721 31627-31627 D / ScanCallbackMarshmallow: ScanResult {mDevice = D8: 35: 26: 9D: 55: B4, …}
12: 03: 39.722 31627-31627 D / ScanCallbackMarshmallow: CALLBACK_TYPE_FIRST_MATCH12: 04: 21.889 718-730 D / BluetoothLeScanner: onClientRegistered () – status = 0 clientIf = 6 12: 04: 22.073 718-718 D / ScanCallbackMarshmallow: ScanResult {mDevice = D8: 35: 26: 9D: 55: B4, …} 12: 04: 22.073 718-718 D / ScanCallbackMarshmallow: CALLBACK_TYPE_ALL_MATCHES 12: 04: 22.316 718-718 D / ScanCallbackMarshmallow: ScanResult {mDevice = E8: A8: C9: 82: 17: 61, …} : 04: 22.316 718-718 D / ScanCallbackMarshmallow: CALLBACK_TYPE_ALL_MATCHES 12: 04: 24.740 718-718 D / ScanCallbackMarshmallow: ScanResult {mDevice = E8: A8: C9: 82: 17: 61, …} 12: 04: 24.740 718 -718 D / ScanCallbackMarshmallow: CALLBACK_TYPE_ALL_MATCHES
EDIT 2 :
Establecer el modo de exploración como ScanSettings.SCAN_MODE_LOW_LATENCY
realiza el descubrimiento utilizando CALLBACK_TYPE_FIRST_MATCH
tan rápido como utilizando CALLBACK_TYPE_ALL_MATCHES
. Sin embargo, si establezco el tipo de devolución de llamada como ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST
ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST
No podré comprobar si los datos del anuncio han cambiado o no en caso de que los datos del anuncio sean dinámicos. Creo que este es el problema con la API. Cabe señalar que los datos de anuncio no es predecible, así que no puedo filtrar los datos de publicidad basados en su contenido.
- Cómo escribir consecutivos Característica rápida y estable para BLE en Android?
- Android BLE inesperada y repetidamente se vuelve a conectar a dispositivos periféricos
- BLE GATT onCharacteristicChanged no se llama después de suscribirse a la notificación
- Bluetooth de baja energía para Samsung Galaxy S3 y TI CC2540 monitor de ritmo cardíaco
- La exploración de dispositivos Android BLE con filtro no funciona
- ¿Cómo obtener el nivel de la batería después de conectarse al dispositivo BLE?
- El dispositivo Android BLE recibe resultados extremadamente irregulares
- ¿Funciona BluetoothLeAdvertiser en un Nexus 5 con Android 5.0?
- Cómo ignorar el atributo Ignorar InnerClasses
- Uso de DBFlow, ¿cómo cifrar una base de datos ya existente?