92 votes

Android : Comment fonctionnent les UUIDs Bluetooth ?

Je ne comprends pas ce que signifie un UUID Bluetooth. Les UUIDs désignent-ils des protocoles (par ex. RFCOMM ) ? Dans l'affirmative, pourquoi les createRfcommSocketToServiceRecord() nécessitent des UUID, alors qu'elles spécifient rfcomm dans leur nom ? Pourquoi l'exemple de code BluetoothChat a-t-il un UUID codé en dur et apparemment arbitraire ?

Ma question se pose parce que, selon le cette question En effet, j'obtiens une exception de pointeur nul lorsque des appareils fonctionnant sous 4.0.4 essaient de se connecter (à un appareil externe, non Android) en utilisant la réflexion. Cependant, la solution à cette question ne fonctionne pas pour moi. UUID muuid = device.getUuids()[0].getUuid(); soulève une exception.

Editer : J'ai résolu ce problème en codant en dur l'UUID pour le service Serial port comme suit cette réponse (en utilisant UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); ).

Je ne comprends pas non plus pourquoi je dois fournir un UUID pour créer un socket rfcomm non sécurisé à l'aide de createInsecureRfcommSocketToServiceRecord(), mais pas en utilisant la méthode de réflexion.

Quelqu'un peut-il m'éclairer ?

36voto

Joseph82 Points 2517

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

Les appareils tels que les capteurs de santé peuvent fournir un service en remplaçant les huit premiers chiffres par un code prédéfini. Par exemple, un appareil qui offre une connexion RFCOMM utilise le code code court : 0x0003

Ainsi, un téléphone Android peut se connecter à un appareil et utiliser le protocole de découverte de services (SDP) pour savoir quels services il fournit (UUID).

Dans de nombreux cas, il n'est pas nécessaire d'utiliser ces UUID fixes. Si vous créez une application de chat, par exemple, un téléphone Android interagit avec un autre téléphone Android qui utilise la même application et donc 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 disponibles sur le web ( par exemple ).

24voto

iccthedral Points 6043

Il représente généralement un service commun (protocole) pris en charge par les appareils Bluetooth.

Lorsque vous créez 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 courants ont le même UUID, il suffit de trouver celui dont vous avez besoin et de l'utiliser.

Véase aquí

18voto

David C. Points 551

Dans Bluetooth, tous les objets sont identifiés par des UUID. Il s'agit notamment des services, des caractéristiques et de bien 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 pour les vendeurs (qui ont payé suffisamment pour une réservation). Vous pouvez consulter cette liste ici :

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

Si vous mettez en œuvre un service standard (par exemple un port série, un clavier, un casque, etc.), vous devez utiliser l'UUID standard de ce service - cela vous permettra d'être interopérable avec des dispositifs que vous n'avez pas développés.

Si vous mettez en œuvre un service personnalisé, vous devez générer des UUID uniques, afin de vous assurer que des appareils tiers incompatibles n'essaient pas d'utiliser votre service en pensant qu'il s'agit de quelque chose d'autre. La méthode la plus simple consiste à générer des UUID aléatoires, puis à coder en dur le résultat dans votre application (et à utiliser les mêmes UUID dans les appareils qui se connecteront à votre service, bien entendu).

8voto

Khaled Alanezi Points 79

La notion d'UUID est similaire à celle des numéros de port sur Internet. Toutefois, la différence entre Bluetooth et l'internet est que, dans Bluetooth, les numéros de port sont attribués dynamiquement par le serveur SDP (protocole de découverte de services) pendant l'exécution, où chaque UUID se voit attribuer un numéro de port. D'autres appareils demanderont au serveur SDP, qui est enregistré sous un numéro de port réservé, quels sont les services disponibles sur l'appareil et celui-ci répondra en proposant différents services qui se distinguent les uns des autres par le fait qu'ils sont enregistrés sous des UUID différents.

4voto

user909946 Points 31

L'UUID n'est qu'un numéro. Il n'a aucune signification, sauf si vous le créez du côté serveur d'une application Android. Ensuite, le client se connecte en utilisant ce 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 comme fb36491d-7c21-40ef-9f67-a63237b5bbea. Sauvegardez ensuite ce nombre et codez-le en dur dans votre programme d'écoute comme ceci :

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

Votre programme serveur Android écoutera les requêtes entrantes avec cet UUID comme suit :

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

BluetoothSocket socket = server.accept() ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X