2012-03-14 4 views

Répondre

0

Les connexions Bluetooth Android sont exclusivement effectuées via UUID. Chaque périphérique Bluetooth possède un UUID pour chaque service qu'il exécute (voir Bluetooth SDP).

Vous venez de donner à Android l'UUID à surveiller et, en mode client, il trouvera une socket à connecter automatiquement (port compris). En mode serveur, il attend que le périphérique spécifié initie une connexion à l'aide de l'UUID spécifié. L'objet BluetoothSocket est également valide lorsque la connexion est établie (utilisez getInput/Output Stream) Voir Server Socket documentation et Client Socket documentation.


Si vous voulez vraiment tout vérifier, vous pouvez voir ce que Android SDP décode de l'autre appareil et l'UUID que vous avez fourni. Utilisez this tutorial pour obtenir l'interface Bluetooth (très facile à faire). Ensuite, le code devrait ressembler à ceci:

IBluetooth ib =getIBluetooth(); 
Int otherDevicePort = ib.getRemoteServiceChannel(otherDeviceAddress, UUID); 
+0

Merci! J'ai effectivement trouvé une solution au problème (maintenant comme une réponse ci-dessous). Lorsque j'ai essayé d'utiliser UUID, j'ai continué à obtenir une exception IOException de la découverte du service a échoué, mais je vais vérifier votre suggestion et voir si cela résout l'exception .. – dcoder

+0

Je ne sais pas à ce sujet ....Je veux dire, il corrige votre problème, mais, comment diable connaissez-vous le port de l'autre appareil sans SDP? Supposez-vous que c'est toujours 1 (parce que vous ne faites rien d'autre avec l'autre périphérique sur Bluetooth?) – Radu

+0

Mon problème était en effet rare et très spécifique, puisque j'ai besoin de communiquer avec un périphérique personnalisé, qui écoute toujours sur un port spécifique et n'expose pas un UUID d'enregistrement de service. Vous avez raison de dire que dans la plupart des cas, le standard (et probablement le moyen recommandé) est d'utiliser SDP pour trouver un enregistrement de service que le périphérique expose et trouver le port basé sur cet enregistrement. – dcoder

8

Ok, ça a été un certain temps, mais je l'ai trouvé une solution au problème. J'avais l'intention d'abandonner et d'utiliser UUID, mais j'ai continué à obtenir une exception Service Discovery Failed (IO), et quand j'ai essayé de trouver une solution au problème de découverte de service, j'ai trouvé la solution à ma question initiale ...

Quoi qu'il en soit, this is the link I stumbled upon, bien que vous devriez noter qu'il y a une erreur dans la réponse (ils se sont simplement connectés au port 1, au lieu d'utiliser un UUID de service).

Après cette courte leçon d'histoire, voici la solution:

utilisant la réflexion, il est possible de créer la prise de rfcomm connexion à un numéro de port au lieu de UUID:

int bt_port_to_connect = 5; // just an example, could be any port number you wish 
BluetoothDevice device = ... ; // get the bluetooth device (e.g., using bt discovery) 
BluetoothSocket deviceSocket = null; 
... 
// IMPORTANT: we create a reference to the 'createInsecureRfcommSocket' method 
// and not(!) to the 'createInsecureRfcommSocketToServiceRecord' (which is what the 
// android SDK documentation publishes 
Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class}); 

deviceSocket = (BluetoothSocket) m.invoke(device,bt_port_to_connect); 

Quelques choses à noter:

  1. puisque nous utilisons Invoke, le premier paramètre est l'objet sur lequel nous appelons la méthode, le deuxième paramètre de invoke est en fait le premier paramètre de la fonction)
  2. Il existe également une version sécurisée disponible ('createRfcommSocket'), qui accepte un numéro de canal bluetooth en tant que paramètre unique (encore une fois, puisqu'il s'agit d'un style d'appel, vous devez passer l'objet pour appeler la méthode mentionné dans -1-)
  3. J'ai trouvé ce qui semble être a link to these functions' prototypes

Bonne chance à tous.

Questions connexes