2016-06-27 1 views
0

Je crée une application pour communiquer des appareils mobiles Android avec des balises Bluetooth. Je l'ai réussi avec succès entre une balise (qui agit comme un client) et un appareil mobile Android (agit en tant que serveur, en écoutant la connexion). S'il vous plaît trouver le extrait de code ci-dessous,Connexion Android Bluetooth utilisant createInsecureRfcommSocketToServiceRecord sans adresse MAC

application client

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(MACaddress); 
BluetoothSocket socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("f3c74f47-1d38-49ed-8bbc-0369b3eb277c")); 
mBluetoothAdapter.cancelDiscovery(); 
socket.connect(); 

app Server

mmServerSocket = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("NAME", UUID.fromString("f3c74f47-1d38-49ed-8bbc-0369b3eb277c")); 
socket = mmServerSocket.accept(); 

Cela fonctionne très bien avec un appareil mobile (serveur) où je suis en mesure d'obtenir son MACaddress en scannant les périphériques Bluetooth à proximité. Mais considérons le cas quand il y a environ 20-25 dispositifs mobiles présents dans la gamme - le balayage prendrait beaucoup de temps. Je voudrais le faire sans effectuer d'analyse.

Existe-t-il un moyen d'y parvenir sans utiliser le MACaddress du serveur? La connexion peut-elle être établie avec l'unique UUID seul? Veuillez noter que je ne veux pas jumeler les appareils.

Toute autre solution à cet égard est également la bienvenue. Merci!

Répondre

0

Vous ne pouvez pas créer une connexion socket à un périphérique Bluetooth sans identifier le périphérique Bluetooth lui-même, et l'identifiant unique du périphérique Bluetooth est une adresse MAC. Même s'il y avait une API Android qui vous permettrait de le faire via UUID seul, l'implémentation sous-jacente devrait toujours rechercher des périphériques proches (par exemple, scan) et en trouver un qui accepte les connexions socket en utilisant l'UUID. Ainsi, le balayage mentionné dans la question devrait encore se produire.

Oui, la numérisation peut consommer un peu d'énergie et nécessiter beaucoup de ressources processeur si un certain nombre de périphériques Bluetooth sont présents. Vous pouvez limiter ces deux façons:

  1. Scannez seulement brièvement. Pour votre cas d'utilisation, il semble que vous pourriez simplement scanner pendant quelques secondes puis arrêter une fois que vous avez trouvé un périphérique de support. Cela ne devrait pas être trop exigeant en ressources.

  2. Utiliser les filtres d'analyse sur Android 5.0+ pour correspondre uniquement les périphériques qui vous intéressent.

+0

Merci David! Je vais essayer les filtres d'analyse dans BLE. Cependant, en tant que travail temporaire, est-il possible de simuler/usurper l'adresse MAC du serveur via le code? De cette façon, j'ai pu éviter le scan puisque je connais le MAC à l'avance. J'ai trouvé plusieurs méthodes d'usurpation de MAC à travers l'enracinement de l'appareil et diverses applications tierces, mais aucune via le code java! – deadpool

+0

Mon expérience est la même. Vous avez besoin d'un accès de bas niveau avec root pour usurper le MAC. – davidgyoung

+0

J'ai créé un filtre d'analyse en utilisant UUID et il faut 3-4 secondes pour obtenir un résultat avec un seul serveur. Cela a soulevé un autre doute: le filtre ralentit-il le balayage? puisque le fragment du scanner doit vérifier l'UUID correspondant. J'espérais pouvoir numériser 1 appareil par seconde, est-ce possible? vos pensées s'il vous plaît .. @davidgyoung – deadpool