web-dev-qa-db-fra.com

Comment créer un socket RFCOMM non sécurisé dans Android?

Je cherche un moyen de se connecter via socket rfcomm de manière non sécurisée. J'ai pu 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, cela fait ce que je veux. Même la documentation sur ici indique 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 dont j'ai découvert a été d'utiliser la réflexion comme indiqué ci-dessus. Et même dans ce cas, la méthode qui est passée dans createInsecureRfcommSocket et non par createInsecureRfcommSocketToServiceRecord. Je voulais juste savoir à quel point cette méthode est fiable. Si je mentionne createInsecureRfcommSocketToServiceRecord dans la méthode, la connexion ne se produit jamais.

18
sunil

createInsecureRfcommSocketToServiceRecord() a été inclus à partir de l’API Android Niveau 10, aussi la documentation vous encouragera-t-elle à l’utiliser, car la documentation suit toujours la dernière version de l’API. Si vous ciblez une API inférieure à 10 (a.k.a. 2.3.3 ou Gingerbread), cette méthode ne vous est pas publiquement accessible.

La méthode que vous appelez via reflection createInsecureRfcommSocket() est une méthode privée dans BluetoothDevice qui existe depuis à peu près Android 2.0. Le problème avec l'appel des méthodes cachées est qu'elles ne sont pas toujours présentes sur tous les périphériques, ni dans le futur ... alors vous jouez un peu. À mon avis, votre méthode fonctionnera probablement la plupart du temps sur la plupart des périphériques 2.0+, car les services requis pour mettre en œuvre son cousin public createRfcommSocketToServiceRecord() sont si similaires au niveau de la couche pile.

En bout de ligne, si vous souhaitez une compatibilité universelle garantie avec votre implémentation Bluetooth, vous devez cibler la version 2.3.3 (API niveau 10) avec votre application. Avec une API publique exposée maintenant pour RFCOMM non sécurisé, il est difficile de dire s'il est plus ou moins probable que l'implémentation privée sous-jacente change.

29
Devunwired

La plupart des réponses à ces questions se trouvent avant le 30 mars 2011, dans ce billet.

En cherchant la solution à un problème similaire dans mon application, j'ai trouvé ce blog écrit le 30 mars.

Cela aidera tous ceux qui recherchent encore cette solution de problème sur SO 

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

La solution est devenue très simple maintenant. Il suffit d’inclure InsecureBluetooth.Java dans votre projet et de modifier 2 lignes dans BluetoothChatService.Java. 

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

et 

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

C'est tout !

5
Sourab Sharma
0
Dennis Mathews