30 votes

Comment créer un socket RFCOMM Android sans aucune entrée de l'utilisateur?

Voici le scénario :

Je dois écrire une application pour Android pour créer un socket RFCOMM vers un PC avec un dongle Bluetooth (je vais également écrire le serveur).

Ma demande est que l'utilisateur n'ait pas à apparier les appareils manuellement.

En fait, avec un gros bidouillage, j'utilise le createInsecureRfcommSocket.

Un petit scénario : j'ai une application Android qui échange des informations avec un boîtier Linux avec un socket RFCOMM ouvert. Je peux définir manuellement le code PIN sur les appareils (le codage en dur est une option)

Je recherche différentes alternatives :

Écrire un wrapper JNI

Comme cela a été fait ici par Max Kellermann, je peux écrire une couche JNI pour faire toute la phase d'appariement. Cela devrait être une bonne option, mais il y a un problème :

La NDK 4b ne fournit pas de bibliothèques libbluetooth, donc -lbluetooth échoue, tout comme la NDK v.3.

Options :

  1. Trouver la NDK 1.5 (qui inclut lib bluetooth). Après des jours de recherche sur le web, je n'ai pas réussi à trouver. Quelqu'un l'a ou sait où je peux le trouver ?
  2. Compiler libbluetooth pour Android moi-même et les utiliser pour -lbluetooth. Pas de chance là, je ne suis pas capable de les compiler. Des idées ?

Utiliser quelque chose exposé par les API

Quelqu'un sait comment je peux utiliser createRfcommSocketToServiceRecord et faire en sorte que l'utilisateur n'ait pas à apparier manuellement l'appareil ? Est-ce possible ? Comment devrais-je écrire le serveur ?

Quelque chose que je ne connais pas

Peut-être (certainement !) il y a quelque chose que je ne sais pas. Peut-être que je peux utiliser autre chose ? Pas de RFCOMM ? SDP ?

Peut-être que je peux appairer manuellement avec l'API Android ?

J'espère avoir été assez clair, sinon n'hésitez pas à demander. Et encore une fois, comme ce n'est pas la première fois, je suis entre vos mains :)

Merci pour tout le soutien les gars !

9 votes

Je fais une supposition, mais je ne serais pas surpris si c'était intentionnellement conçu de sorte que l'implication de l'utilisateur (l'approbation) soit nécessaire pour l'appariement. Au moins, cela serait cohérent avec d'autres endroits où la conception Android nécessite une interaction de l'utilisateur pour des raisons de sécurité.

0 votes

Oui, mais les api "officielles" ne sont pas le seul moyen. C'est pourquoi je me renseigne sur ndk 1.5, pour compiler la libbluetooth ou les autres fonctions @hide.

0 votes

Si libbluetooth a été supprimée, il est très probable que l'ancienne version ne fonctionnerait pas sur une version plus récente d'Android même si vous la trouviez. C'est l'avertissement constant contre l'utilisation d'API non publiques - des changements futurs peuvent les rendre inutilisables.

2voto

Enrico Carlesso Points 3182

À la fin, je peux dire que vous ne pouvez pas.

Même si vous trouvez un moyen, en utilisant des wrappers, en écrivant des modules C, etc., l'évolution d'Android changera probablement la chose que vous utilisez.

Et donc, il n'y a pas d'option. Malheureusement.

Voyons comment l'API Bluetooth d'Android évoluera à l'avenir.

0voto

Parvesh Khan Points 725

Oui, nous pouvons le créer Rfcomsocket et écouter le socket sans que l'utilisateur ait à s'en soucier et également sans appareils à appairer. https://code.tutsplus.com/tutorials/create-a-bluetooth-scanner-with-androids-bluetooth-api--cms-24084

Suivez ceci !!

-2voto

Kannu Points 1380

L'API Bluetooth Android n'est pas finalisée et va changer. Utilisez-la à vos risques et périls. Cette classe implémente une API vers la couche RFCOMM Bluetooth. Un socket RFCOMM est similaire à un socket normal en ce qu'il prend une adresse et un numéro de port. La différence est bien sûr que l'adresse est une adresse de périphérique Bluetooth et que le numéro de port est un canal RFCOMM. L'API permet l'établissement de sockets d'écoute via les méthodes bind, listen et accept, ainsi que la création de connexions sortantes avec connect, connectAsync et waitForAsyncConnect. Après la construction d'un socket, vous devez le créer et le détruire lorsque vous avez fini de l'utiliser. À la fois create et accept renvoient un FileDescriptor pour les données réelles. Alternativement, vous pouvez appeler getInputStream et getOutputStream pour récupérer les flux respectifs sans passer par le FileDescriptor.

0 votes

Avez-vous lu la question? Parce que je ne comprends pas la réponse... Elle ne correspond pas du tout.

0 votes

Cela a été copié et collé de androidjavadoc.com/1.0_r1_src/android/bluetooth/…. Veuillez ajouter votre propre entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X