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:
- 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)
- 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-)
- J'ai trouvé ce qui semble être a link to these functions' prototypes
Bonne chance à tous.
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
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
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