web-dev-qa-db-fra.com

Android: Comment fonctionnent les UUID Bluetooth?

Je ne comprends pas ce que désigne un UUID Bluetooth. Les UUID désignent-ils des protocoles (par exemple, RFCOMM )? Si tel est le cas, pourquoi les méthodes createRfcommSocketToServiceRecord() nécessitent-elles des UUID, lorsqu'elles spécifient rfcomm dans leur nom? Pourquoi le code exemple BluetoothChat contient-il un UUID apparemment codé en dur?

Ma question se pose parce que, conformément à cette question , je reçois une exception de pointeur nul lorsque des périphériques exécutant la version 4.0.4 tentent de se connecter (à un périphérique externe non Android) à l'aide de la réflexion. Cependant, la solution à cette question ne fonctionne pas pour moi. UUID muuid = device.getUuids()[0].getUuid(); déclenche une exception.

Edit : J'ai résolu ce problème en codant en dur l'UUID pour le service de port série conformément à cette réponse (en utilisant UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");).

Je suis également intrigué par la nécessité de fournir un UUID pour créer une socket rfcomm non sécurisée à l'aide de createInsecureRfcommSocketToServiceRecord(), sans utiliser la méthode de réflexion.

Quelqu'un peut-il me redresser?

73
ForeverWintr

Il représente généralement un service commun (protocole) pris en charge par un périphérique Bluetooth.

Lors de la création de votre propre serveur rfcomm (avec listenUsingRfcommWithServiceRecord), vous devez spécifier votre propre UUID afin que les clients qui s'y connectent puissent l'identifier. c'est l'une des raisons pour lesquelles createRfcommSocketToServiceRecord nécessite un paramètre UUID.

Sinon, certains services communs ont le même UUID. Trouvez-en un et utilisez-le.

Voir ici

21
nullpotent

L'UUID est utilisé pour identifier les informations de manière unique. Il identifie un service particulier fourni par un périphérique Bluetooth. La norme définit une base BASE_UUID: 00000000-0000-1000-8000-00805F9B34FB.

Des appareils tels que les capteurs de soins de santé peuvent fournir un service en substituant aux huit premiers chiffres un code prédéfini. Par exemple, un périphérique offrant une connexion RFCOMM utilise le code court: 0x00

Ainsi, un téléphone Android peut se connecter à un appareil, puis utiliser le protocole SDP (Service Discovery Protocol) pour déterminer les services qu’il fournit (UUID).

Dans de nombreux cas, vous n'avez pas besoin d'utiliser ces UUID fixes. Si vous créez une application de chat, par exemple, un téléphone Android interagit avec un autre Android téléphone qui utilise la même application et, par conséquent, le même UUID.).

Vous pouvez donc définir un UUID arbitraire pour votre application en utilisant, par exemple, l'un des nombreux générateurs d'UUID aléatoires sur le Web ( par exemple ).

25
GVillani82

UUID est une notion similaire aux numéros de port sur Internet. Cependant, la différence entre Bluetooth et Internet réside dans le fait que, dans Bluetooth, les numéros de port sont attribués de manière dynamique par le serveur SDP (service discovery protocol) lors de l'exécution, chaque numéro UUID recevant un numéro de port. Les autres périphériques interrogeront le serveur SDP, qui est enregistré sous un numéro de port réservé, sur les services disponibles sur le périphérique et répondra avec différents services distincts les uns des autres en étant enregistrés sous différents UUID.

6
Khaled Alanezi

UUID est juste un nombre. Cela n'a aucune signification, sauf que vous créez du côté serveur d'une application Android. Ensuite, le client se connecte à l'aide du même UUID.

Par exemple, côté serveur, vous pouvez d’abord exécuter uuid = UUID.randomUUID () pour générer un nombre aléatoire tel que fb36491d-7c21-40ef-9f67-a63237b5bbea. Puis enregistrez cela, puis codez-le dans votre programme d’écoute de la manière suivante:

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

Votre programme serveur Android écoute les demandes entrantes avec cet UUID comme ceci:

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

BluetoothSocket socket = server.accept ();

4
Walker Rowe

En Bluetooth, tous les objets sont identifiés par des UUID. Ceux-ci incluent des services, des caractéristiques et beaucoup d'autres choses. Bluetooth gère une base de données de numéros attribués pour les objets standard et attribue des sous-gammes aux fournisseurs (qui ont payé suffisamment pour une réservation). Vous pouvez voir cette liste ici:

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

Si vous implémentez un service standard (par exemple, un port série, un clavier, un casque, etc.), vous devez utiliser l'UUID standard de ce service, ce qui vous permettra d'être interopérable avec des périphériques que vous n'avez pas développés.

Si vous implémentez un service personnalisé, vous devez générer des UUID uniques, afin de vous assurer que les périphériques tiers incompatibles n'essayent pas d'utiliser votre service en pensant qu'il s'agit d'une autre solution. Le moyen le plus simple consiste à générer des valeurs aléatoires, puis à coder en dur le résultat dans votre application (et à utiliser les mêmes UUID dans les périphériques qui se connecteront à votre service, bien entendu).

2
David C.

En résumé: UUid est utilisé pour identifier les applications de manière unique. Chaque application a un unique UUid

Donc, utilisez le même UUid pour chaque périphérique

1
aykut