Est-il possible de configurer l'application Android Bluetooth Chat sample pour connecter plus d'une personne à la fois et avoir un mini salon de discussion ? Qu'est-ce que cela impliquerait ?
Réponses
Trop de publicités?Version tl;dr : Bluetooth est nul pour ça, ne l'utilisez pas, utilisez plutôt le wifi, probablement soutenu par un backend web.
J'ai étudié cette question de manière approfondie au fil des ans dans le cadre d'un projet de recherche sur les réseaux sociaux sans fil. Mon conseil général est le suivant : cela ne fonctionne pas avec plus de deux/trois personnes. Bluetooth n'a tout simplement pas été conçu pour les réseaux sans fil de pair à pair.
En général, il semble que les contrôleurs Bluetooth bon marché inclus dans les appareils Android ( notamment Les appareils de HTC, je crois) ne gèrent pas vraiment plus de deux ou trois connexions à la fois. Je ne sais pas s'il s'agit d'un problème de matériel ou de firmware, mais je peux raconter quelques anecdotes de base. Je travaillais à la mise en œuvre de cette idée au niveau du SDK (c'est-à-dire sans modification du firmware) vers le début de 2011, et j'ai pu faire en sorte qu'un pair obtienne deux connexions supplémentaires (c'est-à-dire trois périphériques, chacun se connectant aux deux autres) pour une période de quelques minutes à une heure avant que les connexions ne meurent soudainement et que le socket ne devienne inutilisable, nécessitant une reconnexion. Malheureusement, 20 minutes était une limite supérieure et, en général, il était impossible d'obtenir des connexions à plus d'une heure. un autre appareil de manière fiable.
L'objectif du projet était de permettre à plusieurs personnes d'interagir silencieusement en arrière-plan, mais cela ne s'est jamais concrétisé. Nous avons abandonné le Bluetooth au profit du wifi, qui a beaucoup mieux fonctionné. mucho mieux. Dans l'abstrait, je pense que les gens considèrent Bluetooth comme un moyen possible de communication fiable de pair à pair, mais il n'a pas vraiment été conçu de cette façon : il s'agit plutôt d'un moyen utilisé pour les communications à courte portée entre petits appareils (pensez aux casques).
Sachez que si vous voulez faire cela, le nombre maximum de dispositifs auxquels vous pouvez vous connecter est fixe, car selon la spécification Bluetooth, un piconet supporte un maximum de sept dispositifs. (Voir l'article de wikipedia).
Le changement requis est simple : vous utilisez un différents UUID pour chaque appareil. Cela peut être mis en œuvre de plusieurs façons, en utilisant un mécanisme d'échange hors bande, ou un schéma simple dans lequel vous attribuez des UUID de manière croissante et, lorsque vous vous connectez au réseau, vous les essayez l'un après l'autre.
Voici quelques fils de discussion pertinents des groupes Google :
Je me souviens d'avoir posté un document plus élaboré détaillant comment faire (avec du code) que je pourrais aussi retrouver si je peux le trouver. Il devrait être de la fin 2010 ou début 2011.
Donc la réponse est, dans l'absolu, oui, vous pouvez essayez pour y parvenir, en utilisant plusieurs UUID (après en avoir utilisé un, c'est fini, et vous devez en essayer un autre en utilisant un protocole d'affectation). Cependant, dans la pratique, après de nombreux essais et erreurs, cela ne fonctionne pas vraiment pour ce pour quoi vous voulez probablement l'utiliser, et c'est un problème de taille. lot Il est préférable d'opter pour un backend Internet. Au fait, c'est également une bonne chose pour une autre raison, la plupart des utilisateurs n'aiment pas vraiment allumer leur Bluetooth de peur que leur batterie ne se vide
Je laisse ceci ici, au cas où cela aiderait quelqu'un d'autre.
J'ai pu créer mon propre salon de discussion en suivant les instructions suivantes tutoriel officiel sur le bluetooth et en le modifiant un peu. Malheureusement, je ne peux pas fournir la plupart de mon code, mais l'idée principale est la suivante :
Chaque appareil agit à la fois comme serveur et comme client. Lorsque le Chat est lancé, le périphérique démarre son fil d'exécution serveur. Le thread du serveur est le même que celui de l'officiel mais ne se termine pas quand il accepte la connexion. Il continue à écouter.
Le fil du client est identique à celui du tutoriel.
Les fils du serveur et du client gèrent la même connexion. J'ai créé des threads séparés pour accepter les messages en suivant ce tutoriel et une pour les envoyer.
private void manageConnectedSocket(BluetoothSocket socket) {
//create thread responsible for sending messages.
SendingThread w = new SendingThread(socket);
MainActivity.addSendingThread(w);
//Creates listener for messages to accept.
MainActivity.addListener(socket);
}
Maintenant, dans l'activité principale, lorsque l'utilisateur clique sur le bouton d'envoi, chaque travailleur (thread d'envoi) envoie un message au dispositif distant. L'écoute se fait de manière asynchrone.
IMPORTANT :
- Vous devez gérer les exceptions lorsque l'envoi du message échoue et supprimer le fil d'envoi et de réception du périphérique lorsque vous détectez qu'il est déconnecté. Dans mon cas, j'ai utilisé l'UUID bien connu "00001101-0000-1000-8000-00805f9b34fb". Pour chaque appareil.
- Vous devez attendre 3 secondes entre les tentatives de connexion en tant que client car certains appareils ont un matériel Bluetooth faible et refusent de se connecter en tant que client.