Bureau d étude COO-POO COOKBOOK: BLUETOOTH POUR JAVA CHUI Rodney NGOM Moctar Sarr Groupe 1 4RT 09/10 Tuteur : M. ROMARIC
I. Introduction Ce document permet de découvrir le processus de connexion entre un PC et un téléphone mobile via le protocole de communication Bluetooth. En effet, dans le cadre du projet BE COO/POO, nous réaliserons cette connexion grâce au langage de programmation Java. Le sujet de notre projet étant de pouvoir créer un Quizz interactif entre le professeur et les élèves, nous nous sommes donc penchés sur l utilisation du Bluetooth pour pouvoir envoyer les réponses des élèves vers le serveur de traitement de données. Effectivement, un «client Bluetooth» installé sur le téléphone portable d un élève pourra envoyer ses réponses vers l ordinateur du professeur sur lequel sera installé un «proxy Bluetooth». Ce dernier sera chargé de rapatrier les réponses vers le serveur de traitement de données (cet échange sera fait en Wi-Fi). Pour programmer via le protocole de communication Bluetooth, nous avons décidé d utiliser la librairie JSR-82, ou plus particulièrement l API Bluecove qui reprend les différents éléments de cette librairie (Bluecove est utilisé pour programmer le proxy car initialement la librairie JSR-82 est dédié exclusivement au J2ME, alors que le proxy doit être programmer avec le J2SE). Voici la pile du protocole de communication:
L API JSR-82 est capable de multiples fonctions telles que l enregistrement des services disponibles, découvrir des périphériques et des services, établir des connexions entre des périphériques, utiliser ces connexions pour s échanger des données, contrôler ces connexions, et assurer un certain niveau de sécurité. Dans ce document, nous présenterons donc les principales phases d établissement de connexion entre le «client Bluetooth» et le «proxy Bluetooth». II. Etablissement de la connexion II.a Principales phases de connexion Initialisation de la pile Initialisation du périphérique Découverte de périphériques Bluetooth Recherche d un service Enregistrement d un service Assignation à un service II.b Initialisation de la pile (Client et Serveur) La pile Bluetooth (présenté ci-dessus) est responsable du contrôle de l équipement Bluetooth, donc besoin est de l initialiser pour pouvoir établir une connexion entre deux périphériques distants. La phase d initialisation comprend un certain nombre d étapes qui permettront par la suite au périphériques d établir une communication, mais souvent ce sont les fabricants de ces périphériques qui s occupent d effectuer tout cela. II.c Initialisation du périphériques (Client et Serveur) Après que la pile soit initialisée, il faut maintenant que notre périphérique Bluetooth soit détectable par d autres périphériques distants. Pour cela, la librairie fournit une classe LocalDevice permettant de récupérer plusieurs informations (adresse physique, nom du périphérique, «objet» périphériques). C est aussi cette classe qui initialisera le périphérique pour qu il soit détectable à distance. Voici un exemple: public static void main(string[] args) throws Exception{ /*méthode permettant de récupérer l «objet» périphériques*/ LocalDevice local = LocalDevice.getLocalDevice(); /*méthode permettant de mettre le périphérique en état d écoute*/ local.setdiscoverable(discoveryagent.giac); OU local.setdiscoverable(discoveryagent.liac); } Remarque: GIAC General Inquire Access Code, le périphérique est disponible tout le temps. LIAC Limited Inquire Access Code, le périphérique n est disponible qu un certain temps.
II.d Découverte de périphériques Bluetooth (Client et Serveur) Etant donné que le protocole de communication Bluetooth est sans-fil, il faut que chacun des périphériques puisse découvrir les autres périphériques communicant en Bluetooth. Pour cela, la librairie JSR-82 fournit la classe DiscoveryAgent et l interface DiscoveryListener. Bien-sûr, pour que le périphérique puisse en détecter un autre, il faut au préalable que celui-ci ait effectué l étape précédente (II.c). Voici un exemple: /*méthode permettant de récupérer l agent de découverte*/ DiscoveryAgent agent = local.getdiscoveryagent(); /*méthode permettant de faire la demande de recherche de périphériques*/ agent.startinquiry(discoveryagent.giac,(discoverylistener) this); Remarque: ici l agent ne recherche que des périphériques en mode GIAC, et le deuxième argument permet d appeler des méthodes de callback lorsque la recherche est fructueuse ou non. II.e Recherche d un service (Client) Lorsque l agent local a découvert un périphérique distant, il peut alors commencer à chercher des services présents sur le point terminal distant. Puisque la recherche de services est similaire à la recherche de périphériques distants, la classe DiscoveryAgent fournit aussi des méthodes pour découvrir des services, et pour initier l échange de services. Voici un exemple: /*méthode permettant de récupérer les services d un périphériques distant*/ agent.searchservices(null, uuids, remotedevice,(discoverylistener) this); Remarque: uuids représente la variable dans laquelle on va stocker l identifiant d un service, remotedevice le périphérique distant. II.f Enregistrement d un service (Serveur) Avant qu un service ne puisse être découvert, il faut d abord qu il soit enregistré dans un «server de périphérique bluetooth». Ce dernier permet de créer une base contenant la définition des services offert, ajouter les services dans cette base pour qu il soit disponible, accepter les connexions d un client, enlever un service de cette base. Voici les différentes étapes nécessaires pour mettre cela en place: 1. Créer une nouvelle instance d un service associée à une URL: StreamConnectionNotifier service = (StreamConnectionNotifier) Connector.open(«URLchoisi»); 2. Mettre le service en état de marche: StreamConnection connection = (StreamConnection) service.acceptandopen(); 3. Fermer le service lorsque le server va s arrêter: service.close(); II.g Assignation à un service (Client) Après avoir découvert les services disponibles grâce à la partie II.e, il faut maintenant pouvoir s enregistrer auprès de ce service pour lui indiquer qu on veut l utiliser. On récupère les informations de ce service (notamment son URL) puis on s y assigne. Voici un exemple : /*cette méthode retourne l URL du service*/ String url = record.getconnectionurl(record.noauthenticate_noencrypt, false);
/*cette méthode permet de s assigner au service choisi*/ StreamConnection connection = (StreamConnection) Connector.open(url) ; III. Communication Après avoir établit la connexion entre deux périphériques bluetooth, et après avoir choisi un service particulier, il faut maintenant choisir un protocole de communication pour pouvoir utiliser ce service. Plusieurs protocoles de communications existent tels que OBEX, RFCOMM ou encore L2CAP. C est selon les besoins du service que sera choisi le protocole de communication. Voici un exemple de communication avec le protocole de communication RFCOMM : /*On suppose que la connexion est déjà établi*/ /*Ce code est valable pour le client et le serveur*/ Try{ Byte buffer[] = new byte[100]; String msg = hello ; InputStream is = connection.openinputstream; OuptStream os = connection.openoutputstream; os.write(msg.getbytes); is.read(buffer); connection.close(); }catch(ioexception e){ e.printstacktrace(); }