Comment créer une Socket RFCOMM non sécurisée dans Android?

je suis en train de chercher un moyen de me connecter sur la prise rfcomm de manière peu sûre. J'ai été en mesure de trouver le chemin mentionné ci-dessous

Method m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);

pour le moment, c'est faire ce que je veux. Même la documentation sur ici dit que nous devons utiliser createInsecureRfcommSocketToServicerecord pour les connexions non sécurisées. Mais il n'y a pas une telle méthode. La seule façon que j'ai découvert était d'utiliser la réflexion comme montré ci-dessus. Et même dans cela la méthode qui est passée dans createInsecureRfcommSocket et non createInsecureRfcommSocketToServicerecord. Je voulais juste savoir quelle est la fiabilité de cette façon. Si je mentionne createInsecureRfcommSocketToServicerecord dans la méthode la connexion ne se produit jamais.

18
demandé sur JJJ 2011-03-15 09:49:20

3 réponses

createInsecureRfcommSocketToServiceRecord() a été inclus à partir de L'API Android Niveau 10, de sorte que la documentation vous encouragera à l'utiliser puisque les docs suivent toujours la dernière version de l'API. Si vous ciblez une API inférieure à 10 (a. K. A. 2.3.3 ou Gingerbread), alors cette méthode n'est pas accessible au public pour vous.

la méthode que vous appelez via réflexion createInsecureRfcommSocket() est une méthode privée à l'intérieur de BluetoothDevice qui a été présent depuis environ Android 2.0. Problème avec l'appel méthodes cachées est qu'ils ne sont pas garantis d'être là sur tous les appareils, ou dans le futur...donc, vous jouez un peu. Ma conjecture est votre méthode fonctionnera probablement la plupart du temps sur la plupart des appareils 2.0+, puisque les services nécessaires pour mettre en œuvre son cousin public createRfcommSocketToServiceRecord() sont tellement similaires à la couche de pile.

en bref, si vous voulez une compatibilité universelle garantie avec votre mise en œuvre Bluetooth, vous devrez cibler 2.3.3 (API Niveau 10) avec votre application. Avec une API publique maintenant exposée pour RFCOMM non sécurisée, il est difficile de dire s'il est plus ou moins probable que l'implémentation privée sous-jacente change.

29
répondu Devunwired 2011-03-15 23:04:05

Eh bien, la plupart des réponses ont répondu ici, sont avant le 30 mars 2011, dans ce post.

tout en cherchant la solution du même problème dans mon application, j'ai trouvé ce blog écrit le 30 mars.

il aidera tous ceux qui sont encore à la recherche de cette solution de problème sur SO

http://mobisocial.stanford.edu/news/2011/03/bluetooth-reflection-and-legacy-nfc/

le la solution est devenue très simple maintenant. Incluez juste InsecureBluetooth.java dans votre projet et changer 2 lignes dans BluetoothChatService.Java.

tmp = InsecureBluetooth.listenUsingRfcommWithServiceRecord(mAdapter, NAME, MY_UUID, true);

et

tmp   = InsecureBluetooth.createRfcommSocketToServiceRecord(device, MY_UUID, true);

That's it !

5
répondu Sourab Sharma 2011-12-28 07:49:44
0
répondu Dennis Mathews 2011-03-15 22:23:49