Estoy trabajando con BluetoothLe en Android (API mínima: 21+). Actualmente, el procedimiento de filtrado del uuid del servicio funciona, pero no del todo como se esperaba. A continuación se muestra un segmento de código utilizado para configurar los parámetros básicos del escáner, esto es lo que funciona actualmente. Según áreas de otros trabajos con Ble (iOS, hardware integrado), se hace evidente que existen capacidades para filtrar dispositivos Ble según sus asignaciones de UUID de 16 bits únicamente. Lo que me lleva a Android... Me di cuenta de que Android ha tenido un comienzo bastante difícil con Ble y su ecosistema de dispositivos bastante segmentado, pero no veo cómo/por qué Android no puede seguir caminos similares con los UUID como otras plataformas. Como todos los UUID que provienen de Bluetooth SIG son identificadores de 16 bits solo con una mera definición de UUID_BASE (00000000-0000-1000-8000-00805F9B34FB).
... // devices UUID service ParcelUuid parcelUuid = new ParcelUuid(UUID.fromString("1F0E0D0C-0B0A-0909-0807-060504030201")); // devices UUID service mask ParcelUuid parcelUuidMask = new ParcelUuid(UUID.fromString("00000D0C-0000-0000-0000-000000000000")); // Filters and Settings scanFilter = new ScanFilter.Builder().setServiceUuid(parcelUuid, parcelUuidMask).build(); scanFilterList.add(scanFilter); scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build(); // Scanning Started mBluetoothLeScanner.startScan(scanFilterList, scanSettings, scanCallback); ...Con todo lo mencionado anteriormente, tengo dos dispositivos de hardware integrado que transmiten dos de sus propios servicios UUID que son muy similares entre sí pero no menos diferentes. A continuación se muestran esos UUID, en todas las cuentas solo el MSB (Byte más significativo) es el diferenciador entre todos ellos. También hay nombres de dispositivos diferentes.
Device One: Service 1 - 1F0E0D0C-0B0A-0909-0807-060504030201 Service 2 - 2F0E0D0C-0B0A-0909-0807-060504030201 Device Two: Service 1 - EF0E0D0C-0B0A-0909-0807-060504030201 Service 2 - FF0E0D0C-0B0A-0909-0807-060504030201 Common Identifier amongst the UUID's: 0x0D0CDel segmento de código proporcionado anteriormente, el ParcelUuid que se usa en el método setServiceUuid parece requerir una coincidencia exacta para que el escáner incluso devuelva un dispositivo, a pesar de la máscara de coincidencia necesaria. Entonces, ¿cómo hace la solicitud a los controladores/hardware para filtrar solo por identificadores de 16 bits en lugar de los identificadores completos de 128 bits? Porque el modelo que he presentado arriba con los dos dispositivos diferentes, cada uno con su propio Servicio UUID diferente del otro, no es capaz de escanear y devolver todos los dispositivos deseados o esperados.
Siento que el problema que tengo es doble, pero debe abordarse, porque parece que no puedo encontrar la respuesta en ninguna parte. He buscado alto y bajo para todas las publicaciones del foro, apilé preguntas/respuestas que tocan este tema, pero ninguna de ellas parece aparecer como lo que estoy buscando. No estoy seguro de si mi comprensión del filtrado en Android es defectuosa, si a Android le faltan funciones o si no puedo encontrar dichas funciones en las clases proporcionadas de Android. Tengo algunas ideas sobre cómo lograr esta "característica" en el software, pero será bastante feo, consumirá mucho tiempo y gastará mucha batería. Un ejemplo de ello es escanear abiertamente y filtrarlo manualmente. Pero creo que hay o debería haber una función para admitir el filtrado UUID de 128 bits Y 16 bits al escanear a través de dispositivos.
Alguien puede ayudar a arrojar luz sobre esto????
Además, disculpas por la longitud de esta pregunta publicada...
La máscara i debe ser opuesta: use 1 para incluir bits y 0 para aquellos que deben ignorarse.
filter: 1F0E0D0C-0B0A-0909-0807-060504030201 mask: 0000FFFF-0000-0000-0000-000000000000El resultado es que se incluye cualquier dispositivo que tenga '0D0C'. Probablemente desee un filtro "más estricto" con más similitudes que este.
No estoy seguro exactamente sobre qué desea filtrar, pero si simplemente desea aplicar el filtro ????0D0C-????-????-????-??????? ?????, debe tener el paqueteUuid establecido en 00000D0C-0000-0000-0000-000000000000 y el paqueteUuidMask establecido en 0000FFFF-0000-0000-0000-000000000000.
Debe filtrar el BLE en función de las direcciones MAC, filtran a la perfección y, tal vez, si ha encontrado la solución para el filtrado de UUID, compártala.