Android: ¿Cómo funcionan los UUID de bluetooth?

81

No entiendo lo que denota un UUID bluetooth. ¿Los UUID denotan protocolos (por ejemplo, RFCOMM )? Si es así, ¿por qué los createRfcommSocketToServiceRecord()métodos requieren UUID, cuando especifican rfcomm directamente en sus nombres? ¿Por qué el código de muestra de BluetoothChat tiene un UUID codificado aparentemente arbitrario?

Mi pregunta surge porque, según esta pregunta , obtengo una excepción de puntero nulo cuando los dispositivos que ejecutan 4.0.4 intentan conectarse (a un dispositivo externo que no sea Android) mediante la reflexión. Sin embargo, la solución a esa pregunta no me funciona. UUID muuid = device.getUuids()[0].getUuid();plantea una excepción.

Editar : resolví ese problema codificando el UUID para el servicio de puerto serie según esta respuesta (usando UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");).

Me desconcierta aún más por qué necesito proporcionar un UUID para crear un socket rfcomm no seguro usando createInsecureRfcommSocketToServiceRecord(),pero no usando el método de reflexión.

¿Alguien puede arreglarme?

ForeverWintr
fuente
Nunca usé la conexión bluetooth excepto con fines académicos, pero lo que sé es que UUID es el identificador del dispositivo, algo así como una dirección del dispositivo, y sigue siendo el mismo para un dispositivo.
novato
@Creator: Eso contradice esta respuesta: stackoverflow.com/a/4963069/1286571
ForeverWintr
3
Bueno, eso es todo lo que sabía sobre los UUID de bluetooth, puede intentar leer este pdf para comprender mejor los protocolos de Bluetooth y los UUID: people.csail.mit.edu/rudolph/Teaching/Articles/PartOfBTBook.pdf
noob
Pregunta: ¿Tiene alguna consecuencia que el teléfono Android no admita el UUID del dispositivo remoto? (UUID no aparece en Android ... getUuids ())?
Orri
¡Hey hey hey! Quiero preguntar algo, @ForeverWintr, ¿está bien si defino un solo UUID con mi propio formato y lo uso en dos dispositivos Android? Quiero decir, ¿podrían comunicarse entre sí?
gumuruh

Respuestas:

7

En Bluetooth, todos los objetos se identifican mediante UUID. Estos incluyen servicios, características y muchas otras cosas. Bluetooth mantiene una base de datos de números asignados para objetos estándar y asigna subrangos para proveedores (que han pagado lo suficiente por una reserva). Puede ver esta lista aquí:

https://www.bluetooth.com/specifications/assigned-numbers/

Si está implementando un servicio estándar (por ejemplo, un puerto serie, teclado, auriculares, etc.), entonces debe usar el UUID estándar de ese servicio, que le permitirá ser interoperable con dispositivos que no desarrolló.

Si está implementando un servicio personalizado, debe generar UUID únicos, para asegurarse de que los dispositivos de terceros incompatibles no intenten usar su servicio pensando que es otra cosa. La forma más fácil es generar aleatorios y luego codificar el resultado en su aplicación (y usar los mismos UUID en los dispositivos que se conectarán a su servicio, por supuesto).

David C.
fuente
¿Dónde obtengo estos UUID y por qué siempre son cadenas que parecen ser aleatorias?
Luke Cross
Los UUID se generan de acuerdo con RFC 4122. Hay cinco versiones diferentes de UUID para elegir. Los más populares son la versión 1 (basada en la marca de tiempo y una dirección MAC) y la versión 4 (aleatoria). Consulte también en.wikipedia.org/wiki/Universally_unique_identifier . Una página web que puede generar UUID para usted es uuidgenerator.net . Si es miembro de Bluetooth SIG, proporcionan un algoritmo para generar UUID vinculados a su ID de membresía.
David C.
29

El UUID se utiliza para información de identificación única. Identifica un servicio particular proporcionado por un dispositivo Bluetooth. El estándar define un básico BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB.

Los dispositivos como los sensores sanitarios pueden proporcionar un servicio, sustituyendo los primeros ocho dígitos por un código predefinido. Por ejemplo, un dispositivo que ofrece una conexión RFCOMM usa el código corto: 0x0003

Entonces, un teléfono Android puede conectarse a un dispositivo y luego usar el Protocolo de descubrimiento de servicios (SDP) para averiguar qué servicios ofrece (UUID).

En muchos casos, no es necesario utilizar estos UUID fijos. En el caso de que esté creando una aplicación de chat, por ejemplo, un teléfono Android interactúa con otro teléfono Android que usa la misma aplicación y, por lo tanto, el mismo UUID.

Por lo tanto, puede establecer un UUID arbitrario para su aplicación utilizando, por ejemplo, uno de los muchos generadores de UUID aleatorios en la web ( por ejemplo ).

GVillani82
fuente
Entonces, ¿el UUID completo para un servicio RFCOMM es: 00000003-0000-1000-8000-00805F9B34FB?
gyozo kudor
1
Nota: enumeran la forma abreviada del ID de servicio, que es de 32 bits. Se combina con el UUID base 00000000-0000-1000-8000-00805F9B34FB de BT SIG reemplazando los primeros 4 dígitos del GUID. Ex. RFCOMM es 0x0003, por lo que el UUID para el servicio RFCOMM es 00030000-0000-1000-8000-00805F9B34FB
sam msft
22

Por lo general, representa algún servicio (protocolo) común que admite el dispositivo bluetooth.

Al crear su propio servidor rfcomm (con listenUsingRfcommWithServiceRecord), debe especificar su propio UUID para que los clientes que se conectan a él puedan identificarlo; es una de las razones por las que createRfcommSocketToServiceRecordrequiere un parámetro UUID.

De lo contrario, algunos servicios comunes tienen el mismo UUID, solo busque uno que necesite y utilícelo.

Ver aqui

nulopotente
fuente
3
por lo general lo hace? ¿Cuándo no es así? Lo que no entiendo es por qué, si estoy creando un servidor RCOMM, no usaría el UUID RFCOMM.
ForeverWintr
1
Bueno, UUIDes un identificador universal . RFCOMM es solo una capa en la pila de protocolos de bluetooth y tiene un UUID asociado según la especificación de bluetooth; y es utilizado por el SDP, no estoy completamente seguro para qué; pero siempre puedes leerlo en las especificaciones. Ahora, si está creando un servicio además del protocolo RFCOMM, tendrá que proporcionar un UUID como lo requiere SDP, de lo contrario, su servicio no será descubierto.
nulpotente
3
Encontré este en la web. ¿¿Todas?? los UUID para BT. sviluppomobile.blogspot.de/2012/11/…
Orri
El enlace está muerto: ¿era una lista de UUID comunes?
user1725145
7

UUID es similar en noción a los números de puerto en Internet. Sin embargo, la diferencia entre Bluetooth e Internet es que, en Bluetooth, el servidor SDP (protocolo de descubrimiento de servicios) asigna dinámicamente los números de puerto durante el tiempo de ejecución, donde a cada UUID se le asigna un número de puerto. Otros dispositivos preguntarán al servidor SDP, que está registrado con un número de puerto reservado, sobre los servicios disponibles en el dispositivo y responderá con diferentes servicios que se distinguen entre sí por estar registrados bajo diferentes UUID.

Khaled Alanezi
fuente
4

UUID es solo un número. No tiene ningún significado, excepto que crea en el lado del servidor de una aplicación de Android. Luego, el cliente se conecta usando ese mismo UUID.

Por ejemplo, en el lado del servidor, primero puede ejecutar uuid = UUID.randomUUID () para generar un número aleatorio como fb36491d-7c21-40ef-9f67-a63237b5bbea. Luego guárdelo y luego codifíquelo en su programa de escucha de esta manera:

 UUID uuid = UUID.fromString("fb36491d-7c21-40ef-9f67-a63237b5bbea"); 

Su programa de servidor de Android escuchará las solicitudes entrantes con ese UUID como este:

    BluetoothServerSocket server = mBluetoothAdapter.listenUsingRfcommWithServiceRecord("anyName", uuid);

Toma BluetoothSocket = servidor.accept ();

Walker Rowe
fuente
1

En resumen: UUidse utiliza para identificar aplicaciones de forma única. Cada aplicación tiene unUUid

Entonces, use lo mismo UUidpara cada dispositivo

aykut
fuente
0

UUID son las siglas de Universal Unique Identifier. UUID es un dígito simple de 128 bits que se distribuye de forma única en todo el mundo.

Bluetooth envía datos por aire y todos los dispositivos cercanos pueden recibirlos. Supongamos que a veces tienes que enviar algunos archivos importantes a través de Bluetooth y todos los dispositivos cercanos pueden acceder a ellos dentro del alcance. Entonces, cuando se empareja con los otros dispositivos, simplemente comparten el número UUID y coinciden antes de compartir los archivos. Cuando envía cualquier archivo, su dispositivo cifra ese archivo con el UUID del dispositivo apropiado y lo comparte a través de la red. Ahora todos los dispositivos Bluetooth en el rango pueden acceder al archivo cifrado, pero requerían el número UUID correcto. Por lo tanto, solo los dispositivos UUID correctos tienen acceso para cifrar el archivo y otros rechazarán la causa del UUID incorrecto.

En resumen, puede usar UUID como contraseña secreta para compartir archivos entre dos dispositivos Bluetooth.

Karan Nassa
fuente