Rapport du projet iFridge - DIUF
Transcription
Rapport du projet iFridge - DIUF
iFridge Informatique pervasive 6 mars 2007 Timothée Maret & Nicolas Martenet Prof. Béat Hirsbrunner Prof. Peter Kropf Dr. Vincenzo Pallotta Pascal Bruegger Marc Schiely iFridge Informatique pervasive Resumé Ce projet est basé sur la vision pervasive de l’informatique, présentée par Mark Weiser dans les années nonante. Les motivations sont d’offrir une interface non-obstrusive pour les utilisateurs et d’utiliser leurs localisations et mouvements comme entrée d’un système permettant de modifier de manière opportuniste et distribuée une liste de tâches à effectuer. Le scénario d’un appartement d’étudiant partageant le même frigo a été sélectionné. Chaque étudiant peut gérer la liste d’achats et est appelé à acheter certains des éléments de la liste lorsque le système le détecte à proximité d’un magasin. Les concepts principaux ont pus être implémentés et testés grâce au prototype réalisé dans ce projet. L’application est composée de plusieurs modules spécialisés et hétérogènes, communiquant entre eux de manière asynchrone par un espace de tuples. Ce projet s’inscrit dans le cadre du projet uMove mené par le groupe de recherche en intelligence artificielle et en informatique pervasive de l’Université de Fribourg. Mots clef : localisation, analyse du mouvement, gestion opportuniste et distribuée, architecture modulaire, espace de tuple, informatique pervasive Timothée Maret & Nicolas Martenet i iFridge Informatique pervasive Abstract This project is based on the Mark Weiser’s vision of Ubiquitous Computing. The main motivations are the creation of an unobstrusive user interface and the integration of the user’s localization and motions as input. The system manages in an opportunistic and distributed manner a list of daily tasks to do. A group of roommates sharing the same fridge has been selected as main scenario. Every student can manage the list of purchases and can be asked by the system to buy any items of the current list when he/she stands or pass nearby a grocery shop. The main concepts have been implemented and tested in a prototype. The application is built with four specialized and heterogeneous modules, communicating in an asynchronous manner through a tuple space. This project is a primarily developpement of the uMove project, presently carried out by the pervasive and artificial intelligence research group of the University of Fribourg. Keywords : localization, movement analysis, opportunistic and distributed task management, modular architecture, tuple space, ubiquitous computing Timothée Maret & Nicolas Martenet ii iFridge Informatique pervasive Table des matières 1 Introduction 1.1 Présentation . . . . . . . . . . . . 1.2 Caractéristiques principales . . . 1.3 Déroulement . . . . . . . . . . . 1.4 Logiciels utilisés . . . . . . . . . . 1.5 Matériel utilisé . . . . . . . . . . 1.5.1 Téléphone mobile et GPS 1.5.2 Tags RFID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 1 2 3 3 3 2 Spécification 2.1 Scénario . . . . . . . 2.2 Fonctionnalités clefs 2.3 Use case . . . . . . . 2.4 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 4 5 5 3 Implémentation 3.1 Jini/JavaSpaces . . . . . . . . . . . . . . . . . . . 3.2 Mobile Phone . . . . . . . . . . . . . . . . . . . . 3.2.1 Plateforme J2ME . . . . . . . . . . . . . 3.2.2 Développement sur le Nokia 6600 . . . . . 3.2.3 GPS bluetooth . . . . . . . . . . . . . . . 3.2.4 Architecture . . . . . . . . . . . . . . . . 3.2.5 Librairie Java GPS-Bluetooth . . . . . . . 3.2.6 Interface graphique . . . . . . . . . . . . . 3.2.7 Accès aux ressources depuis un MIDlet . . 3.3 User Manager . . . . . . . . . . . . . . . . . . . . 3.3.1 Communication avec le téléphone mobile . 3.3.2 Architecture . . . . . . . . . . . . . . . . 3.4 Fridge . . . . . . . . . . . . . . . . . . . . . . . . 3.4.1 Architecture . . . . . . . . . . . . . . . . 3.4.2 Base de données . . . . . . . . . . . . . . 3.4.3 Serveur . . . . . . . . . . . . . . . . . . . 3.4.4 Interface Web . . . . . . . . . . . . . . . . 3.5 Backend . . . . . . . . . . . . . . . . . . . . . . . 3.5.1 Architecture . . . . . . . . . . . . . . . . 3.5.2 Base de donnée . . . . . . . . . . . . . . . 3.5.3 Serveur . . . . . . . . . . . . . . . . . . . 3.5.4 Interface Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 13 14 14 15 16 17 17 18 18 18 18 23 24 24 25 25 26 26 26 27 28 28 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Tests 5 Conclusions 5.1 Développement 5.2 Fonctionnelles . 5.3 Personnelles . . 5.4 Perspectives . . 29 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 29 29 30 30 Annexes 30 Timothée Maret & Nicolas Martenet iii iFridge Informatique pervasive References A Utilisation du programme A.1 Compilation . . . . . . . A.2 Exécution . . . . . . . . A.2.1 Jini/JavaSpaces . A.2.2 UserManager . . A.2.3 Fridge . . . . . . A.2.4 Backend . . . . . A.2.5 MobilePhone . . 30 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 32 32 32 32 32 33 33 B Liste des figures 34 C Contenu du CD 34 Timothée Maret & Nicolas Martenet iv iFridge 1 Informatique pervasive Introduction 1.1 Présentation L’objectif de ce projet est de créer une application basée sur les principes de l’informatique pervasive1 définis par Mark Weiser dans son article, The Computer for the 21st Century (1991) [6]. Cette application consiste en un frigo partagé par plusieurs utilisateur disposant d’un téléphone mobile standard capable d’exécuter un MIDlet et disposant d’une connexion internet sans fil tel que GPRS, UMTS ou EDGE. Un GPS est requis pour communiquer la localisation des utilisateurs. Le frigo contient une base de donnée géographique de magasins d’alimentations et peut demander à un utilisateur d’acheter certains éléments de la liste lorsqu’il se trouve à proximité d’un magasin contenu dans sa base de données. L’architecture de ce projet est modulaire et basé sur les technologies suivantes permettant d’écrire des applications distribuées. Jini network technology [16] [5] fournit une architecture ouverte permettant de développer des applications distribuées hautement volatiles et flexibles. Cette technologie permet la gestion décentralisée de services pouvant êtres offerts par chaque participant au réseau, son infrastructure comprend des protocoles permettants à des clients d’enregistrer et de découvrir des services de manière transparente. Jini offre différents modèles de programmation tel que la gestion des transactions et la programmation événementielle. JavaSpaces [1] est une implémentation en Java du langage de coordination Linda. Cette implémentation est réalisée au dessus de Jini, par un service. Le principe du langage Linda est de faire communiquer différents processus à l’aide d’informations (tuples) insérées et retirées d’un espace commun dont la gestion est distribuée et transparente. 1.2 Caractéristiques principales Les principales caractéristiques de ce projet sont les suivantes • Utilisation de la localisation et du mouvement des utilisateurs comme entrée pour le système • Répartition distribuée et opportuniste d’une charge de travail • Non-obtrusif pour l’utilisateur • Gestion de la coordination par une communication asynchrone 1.3 Déroulement Ce projet s’est déroulé en parallèle du cours d’informatique pervasive [12] durant le semestre d’hiver de l’année académique 2006-2007. Ce cours est donné conjointement entre l’Université de Neuchâtel et l’Université de Fribourg. Les différents participants au cours et au projet sont listés ci-dessous. 1 Ubiquitous Computing Timothée Maret & Nicolas Martenet 1/34 iFridge Informatique pervasive Etudiants Timothée Maret Nicolas Martenet [email protected] [email protected] Professeurs Prof. Béat Hirsbrunner Prof. Peter Kropf [email protected] [email protected] Responable du projet Dr. Vincenzo Pallotta Assistants Pascal Bruegger Marc Schiely [email protected] [email protected] [email protected] Dans la phase de spécification, le projet a été dimensionné et réparti entre les deux étudiants pour l’implémentation. 1.4 Logiciels utilisés Ce projet est constitué de quatre applications (modules) développées en langage Java. Trois modules s’exécutent comme une application standalone, tandis que le dernier s’exécute comme un MIDlet sur un téléphone mobile. Les modules Backend et Fridge possèdent une interface web s’exécutant sur un serveur d’application JEE 5. Pour le développement de chacune de ces parties, l’environnement de développement NetBeans sous Windows XP a été utilisé. Cet environnement a été sélectionné car il dispose d’un bon support pour le développement d’applications pour les terminaux mobiles. Ce projet base son implémentation sur les technologies Jini et JavaSpaces, et utilise certaines fonctionnalités du langage Java tel que la généricité, apparues dans la version 1.5 [15]. Tous les logiciels et librairies utilisées pour ce projet sont listés ci-dessous et disponibles dans le répertoire lib. • Apache ANT v 1.6.5 • Wireless Toolkit v 2.2 Toolkit pour le développement d’applications Java pour terminaux mobiles • NetBeans v 5.5 et Sun Application Server 9.0 Environnement de développement et serveur d’application • JDK v 1.5.0.09 • Jini v 2.1 JavaSpaces y est intégré comme un service • MathFP v 2.0.6 Librairie de calcul en virgule flottante pour J2ME • MySQL v 5.0.27 • MySQL GUI Tools v 5.0 Outils d’administration pour MySQL • MySQL Java Connector v 5.0.4 Timothée Maret & Nicolas Martenet 2/34 iFridge 1.5 1.5.1 Informatique pervasive Matériel utilisé Téléphone mobile et GPS Le téléphone mobile à notre disposition est un modèle Nokia 6600 série 60 deuxième édition, possédant les caractéristiques listées ci-dessous. Les téléphones compatibles avec notre développement doivent les supporter au minimum. • • • • • Configuration CLDC 1.0 Profile MIDP 2.0 Bluetooth API (JSR-82) Support des connections TCP Symbian OS v7.0s Pour transférer 2 le MIDlet du PC de développement au téléphone mobile, nous utilisons un dongle bluetooth MITSUMI Bluetooth USB ADAPTOR. Le GPS utilisé est du type BTGPS II Trine de EMTAC. Ce modèle supporte les protocoles NMEA-0183 (V2.20) et les sentences suivantes GGA, GSV, RMC, VTG. Nous utilisons la sentence GGA. 1.5.2 Tags RFID Le kit PhidgetRFID distribués par Phidgets a été utilisé. Ce kit comprend une carte avec une antenne ainsi que des tags RFID. La carte est raccordée à l’ordinateur par à un câble USB. Tous les informations à propos de ce kit sont contenues dans le document [11]. Fig. 1 – Kit PhidgetRFID Pour le développement, le fichier phidget21.jar contient toutes les classes nécessaire. Il est important de noter que ces classes Java font en réalité appel à 2 L’implémentation du service de transfert de fichier par bluetooth sur ce téléphone mobile est imparfait. Avant de mettre à jour le MIDlet sur le téléphone mobile, il faudra commencer par effacer le message contenant l’ancien MIDlet dans la boîte de réception de messages. La mise à jour ne pourra se faire uniquement lorsque le MIDlet n’est pas en cours d’utilisation. Timothée Maret & Nicolas Martenet 3/34 iFridge Informatique pervasive des classes natives écrites en C, il faut donc également posséder cette librairie native. Elle est disponible sur le site du fabriquant, cependant le fichier est packagé dans un fichier msi utilisable uniquement avec le framework .Net. Nous avons extrait la dll nécessaire (phidget21.dll) disponible dans le répertoire lib. Ce fichier doit être placé dans le répertoire C:/WINDOWS/system32 de l’ordinateur qui va exécuter le programme. 2 Spécification 2.1 Scénario Prenons le cas d’un appartement d’étudiants partageant leurs repas et donc leur frigo. Cet exemple est intéressant car tous les étudiants vont êtres capables d’acheter les différents ingrédients et tous vont pouvoir ajouter des éléments à la liste d’achat. Le dimanche soir, un étudiant prépare les menus pour la semaine et entre les ingrédients nécessaires par l’interface web du frigo. Le frigo peut dès lors constater que des ingrédients sont manquants et dresser une liste d’achats. Le lundi matin, les étudiants se rendent à leurs cours respectifs. Sur sa route, un étudiant stressé passe à proximité d’un magasin d’alimentation, le frigo lui envoye alors un message lui proposant d’acheter les différents ingrédients de sa liste. L’étudiant étant en retard, il ne prend pas la peine de répondre à ce message. Le frigo détecte ce comportement et recherche un nouvel étudiant. C’est alors qu’un autre étudiant serviable, passe à proximité d’une petite épicerie, le système l’avertit par un message des éléments qu’il pourrait y acheter. Cet étudiant accepte la liste de course et achète les ingrédients dans l’épicerie. A ce moment, la frigo n’a pas encore pu faire acheter tous les ingrédients sur sa liste car l’épicerie ne dispose pas de tous les éléments nécessaires. A midi, un étudiant gastronome discute avec un amis des meilleurs recettes qu’ils aient réalisés. L’eau à la bouche, l’étudiant utilise sont téléphone portable pour ajouter des ingrédients à la liste d’achat du frigo. Au cours de l’après midi, l’étudiant serviable n’étant toujours pas rentré pour déposer les ingrédients achetés dans le frigo, celui-ci l’averti par un message que certaines des denrées achetées sont réfrigérées et qu’il faut les ramener au plus vite pour ne pas briser la chaîne du froid. L’étudiant se rend alors rapidement chez lui pour déposer les ingrédients dans le frigo. Le soir, après les cours, un étudiant passe à proximité d’un grand magasin ce qui lui permet d’acheter les éléments restant sur la liste, comme lui demande le frigo. 2.2 Fonctionnalités clefs Les fonctionnalités clefs du système sont listées ci-dessous • Gestion par le frigo de la liste d’achat • Répartition des achats en fonction de la localisation et du contenu des magasins • Possibilité de modification de la liste d’achat par chaque utilisateur depuis leurs téléphones ou l’interface du frigo. Timothée Maret & Nicolas Martenet 4/34 iFridge Informatique pervasive • Gestion des requêtes et des alertes envoyées aux utilisateurs par le frigo 2.3 Use case Fig. 2 – Use case de l’application 2.4 Architecture L’architecture de l’application visible sur la Figure 3 est divisée en quatres blocs interconnectés par un espace d’échange de tuples ou une connection GPRS. Les blocs communiquent entre eux par échange de messages. Tous les messages échangés par l’espace de tuples ont la forme suivante <from:String, to:String, msg:Message> Timothée Maret & Nicolas Martenet 5/34 iFridge Informatique pervasive Fig. 3 – Architecture générale du projet Timothée Maret & Nicolas Martenet 6/34 iFridge Informatique pervasive Les champs from et to sont utilisés pour identifier l’émetteur, le récepteur et donc le sens de la communication. Les messages peuvent êtres destiné à un acteur non déterminé du réseau en utilisant une valeur spécifique dans le champs to. Le champs msg va contenir l’information du message dont les différents types possibles sont listés sur la Figure 4. La communication entre le bloc Fridge et le bloc UserManager ne se fait jamais directement, mais doit passer par le bloc Backend. Fig. 4 – Messages échangés par les blocs de l’application Les structures de données utilisées dans les messages sont listées sur la Figure 5. La classe State contient les coordonnées de localisation x et y au format SwissGrid CH1903, la vitesse, l’accélération, la direction, l’altitude d’un utilisateur et la date EPOCH de la mesure. La classe Item définit un élément pouvant être placé dans le frigo. Le paramètre maxTimeOutOfFridge de la structure Item est utilisée pour spécifier le temps disponible en milli-secondes pour un élément hors d’un frigo, sans risquer de briser la chaîne du froid. L’interface Filter va permettre d’implémenter un filtre qui sera appliqué sur les données de localisation que recevra le bloc UserManager. La classe User définit un utilisateur du système par son nom et son mot de passe. Timothée Maret & Nicolas Martenet 7/34 iFridge Informatique pervasive Fig. 5 – Structures de données de l’application Bloc Fridge Ce bloc gère la liste des éléments disponibles dans le frigo, ainsi qu’un profile contenant les éléments à acheter. Une antenne RFID est utilisée pour déterminer lorsque les éléments associés à des tags RFID sortent ou entrent dans le frigo. Une base de donnée est utilisée pour sauvegarder les éléments gérés par le frigo, dont les champs correspondent à l’objet Item défini précédemment auxquels sont ajoutés des informations. Ces champs supplémentaires permettent notamment de savoir si l’élément est dans le frigo ou non ainsi que le tag RFID qui lui est associé. Lorsqu’un élément manque, ce bloc avertit le Backend avec un message ItemNeeded. Il reçoit en retour des message du type ItemsBought lui indiquant les éléments achetés. Les Figure 6 et Figure 7 présentent le comportement du frigo lorsqu’un événement RFID survient ou lorsqu’un élément a été acheté. Dans le cas ou des éléments critiques mettent trop de temps avant d’être placés dans le frigo après l’achat, un message ItemTimeOut est envoyé au Backend pour avertir la personne concernée. A la réception d’un message ListProfileItems, le bloc va retourner dans un message du même type, la liste des éléments contenus dans le profile. A la réception des messages AddProfileItems et RemoveProfileItems , le profile du frigo est mis à jour en fonction des éléments spécifiés. A la réception d’un message ListFridgeContentItems , ce bloc retourne dans un message du même type, la liste des éléments contenus dans le frigo. Bloc UserManager Ce bloc agit comme un proxy entre le Backend et le MobilePhone. Il gère les connexions des utilisateurs et traite les coordonnées de localisation qu’il reçoit. Il calcul et ajoute les informations de vitesse, d’accélération et de direction qui ne sont pas disponibles dans les messages du GPS. Ce bloc applique le filtre définit par le Backend sur tous les messages UserState afin de déterminer si l’information doit ou non être insérée dans l’espace des tuples. Dans le cas ou aucun filtre n’est définit, tous les messages de localisation sont directement insérés. Pour tous les autres types de messages, ce bloc fait la passerelle entre le bloc MobilePhone et le Backend. Bloc MobilePhone Ce bloc gère l’interaction avec l’utilisateur. Au démarrage de l’application, la connexion s’établit avec le bloc UserManager. Lorsqu’elle est établie, l’utilisateur doit entrer son nom d’utilisateur et son login pour pouvoir utiliser le système, ce qui va générer l’envoi d’un message UserLogin pour le contrôle. Un message du même type est retourné et contenant la validité du login dans le champs exists. Lorsque cette opération est effectuée, ce bloc Timothée Maret & Nicolas Martenet 8/34 iFridge Informatique pervasive Fig. 6 – Diagramme d’activité lors d’un événement RFID par le bloc Fridge Timothée Maret & Nicolas Martenet 9/34 iFridge Informatique pervasive Fig. 7 – Diagramme d’activité à la réception d’un message ItemBought par le bloc Fridge Timothée Maret & Nicolas Martenet 10/34 iFridge Informatique pervasive va entrer en connexion avec le GPS pour recevoir les données de localisation, puis va présenter un menu regroupant différentes actions permettant de mettre à jour le profile et de consulter la liste des éléments contenus dans le frigo. Lorsqu’un message AskUserToBuy est reçu, une alerte sonore est émise pour l’utilisateur, lui demandant s’il peut acheter certains des éléments de la liste. Si l’utilisateur confirme ce message, les éléments qu’il va acheter seront envoyés au bloc UserManager dans un message ItemsBought. Au bout d’un timeout, si l’utilisateur n’a pas quittancé le message, un quittancement implicite va envoyer un message GpsItemsBought contenant aucun éléments. A la réception d’une donnée de localisation depuis le GPS, une mesure de la distance entre ce nouveau point et le dernier point envoyé au bloc UserManager est calculée. Dans le cas ou cette distance dépasse un certain seuil, le dernier point est mis à jour puis envoyé au bloc UserManager. Ce mécanisme permet d’économiser le nombre de messages émis lorsque l’utilisateur n’est pas en mouvement. Lorsqu’un message AlertUser est envoyé depuis le bloc UserManager, une alerte sonore est émise et le message d’alerte est affiché sur l’interface utilisateur. L’utilisateur peut soit quittancer le message, soit le message se quittance automatiquement à l’échéance d’un timeout. Les utilisateurs ont la possibilité de modifier le profile du frigo, en envoyant des messages des types AddProfileItems et RemoveProfileItems. Ils ont la possibilité de voir le contenu du profile en envoyant un message du type ListProfileItems et de demander la liste des éléments gérés par le système en utilisant le message KnownItems. La liste des éléments contenus dans le frigo est obtenue par un message ListFridgeContentItems. Bloc Backend Ce bloc contient une base de données contenant les login et password de tous les utilisateurs pouvant êtres connectés, ainsi qu’une base de données des associations entre les différents éléments et les lieux géographiques permettant de les acheter. Une table est également prévue pour répertorier les noms des éléments gérés par le système. De cette manière tous les utilisateurs utilisent les même noms pour ajouter des éléments. Ce bloc maintient le profile à jour. A la réception d’un message UserState, si la liste des éléments à acheter est vide, aucun traitement n’est effectué. Dans le cas contraire, une requête est effectuée dans la base de donnée pour déterminer si l’utilisateur se trouve dans une zone lui permettant d’acheter le maximum d’éléments de la liste. Dans ce cas, ce bloc va faire envoyer à l’utilisateur une requête d’achat par un message AskUserToBuy. Ce comportement est illustré par la Figure 8. Dans le cas ou l’utilisateur accepte d’acheter certains des éléments de la liste, un message ItemsBought contenant les éléments est reçu. Dans le cas ou aucun éléments ne peut être acheté ou que l’utilisateur ne traite pas la requête, un message ItemsBought ne contenant aucun élément est reçu. Dans le cas ou le message ItemsBought contient des éléments, le Backend envoye un message ItemsBought au bloc Fridge contenant les éléments achetés, dans le cas contraire, il attend pour trouver un nouvel utilisateur potentiel et ne fera plus de demandes à cet utilisateur avant un certain temps. Afin de réduire la quantité d’information transmise dans le space, ou de détecter certains comportements des utilisateurs, le Backend va déterminer la politique de filtrage des informations de localisation des utilisateurs et l’envoyer Timothée Maret & Nicolas Martenet 11/34 iFridge Informatique pervasive Fig. 8 – Structogramme de la gestion des données de localisation par le bloc Backend Timothée Maret & Nicolas Martenet 12/34 iFridge Informatique pervasive par un message UserStateFilter au UserManager. En retour à un message du type KnownItems, ce bloc retourne la liste des éléments contenus dans sa base de donnée. Les messages ListFridgeContentItems, RemoveProfileItems et AddProfileItems sont simplement transférés aux blocs UserManager ou Fridge en fonction de la situation. Le Backend répond directement aux messages ListProfileItems en renvoyant un message du même type contenant la liste des éléments du profile. A la réception d’un message ItemNeeded, l’élément contenu dans le message est ajouté au profile. La réception d’un message ItemTimeOut signifie qu’un élément acheté n’a pas été apporté au frigo, le backend réagit en envoyant un message AlertUser au bloc UserManager qui s’occupe de notifier l’utilisateur sur le téléphone mobile. Lorsqu’un utilisateur se connecte, une demande d’identification d’un message UserLogin est reçu. Ce bloc contrôle que le nom d’utilisateur et le mot de passe du message correspondent à ce qui est inscrit dans sa base de donnée et renvoie un message du même type avec le champs exists mis à jour en fonction de la validité des informations de login. 3 3.1 Implémentation Jini/JavaSpaces Jini offre un mécanisme de recherche multicast des services sur toutes les machines disponibles sur le réseau. Cependant, le désavantage de cette démarche est rapidement apparu lors des premiers tests. En effet, plusieurs services JavaSpaces étaient disponibles sur le réseau. Nos modules ne pouvaient donc pas communiquer car ils ne se connectaient pas systématiquement au même service JavaSpaces. C’est pourquoi l’option d’une recherche de service Unicast permettant de spécifier la machine sur laquelle s’exécute JavaSpaces a été prise. L’implémentation de la classe UnicastLookupLocator.java permettant d’effectuer cette recherche a été effectuée par Pascal Bruegger selon une idée évoquée par Jan Newmarch dans son livre [3]. JavaSpaces [1] fournit de nombreuses fonctionnalités supplémentaires par rapport à son modèle Linda, telles que la possibilité de définir un temps maximum de vie d’un tuple dans l’espace (Lease time), et la possibilité de définir des listeners offrant une notification lorsqu’un tuple est inséré dans l’espace. La première fonctionnalité est utilisée pour les messages UserState envoyés par le bloc UserManager vers le bloc Backend. En effet, dans le cas ou le Backend n’est pas assez rapide pour gérer tous les messages de localisation, ceux-ci sont automatiquement effacé et ne seront pas traités. La fonctionnalité des listeners permet d’implémenter des évènements distribués. Elle est interressante car elle permet d’optimiser le délai entre l’insertion d’un tuple et le traitement de cet évènement. Dès les premiers tests, nous avons pu nous apercevoir que l’implémentation offerte par Jini/JavaSpaces de ces listeners n’est pas utilisable pour ce projet car de nombreux messages se perdent et il est impossible de les récupérer. Cette limitation est annoncée dans la documentation de JavaSpaces, le service n’est pas fiable et l’ordre d’arrivé des évènement n’est pas garanti. Ainsi, l’implémentation de chacun des listeners s’est effectuée avec un thread dont le code consiste à prendre continuellement un message dans l’espace de Timothée Maret & Nicolas Martenet 13/34 iFridge Informatique pervasive tuple, puis à invoquer une methode permettant de traiter ce message. Cette mise en oeuvre ce révèle efficace; ceci est du au fait que nous utilisons une méthode bloquante pour prendre le message dans l’espace des tuples. Ainsi, le passage d’un thread à un autre s’effectue directement lorsqu’aucun message adéquat n’est disponible. Le Listing 1 montre un extrait de l’implémentation du listener pour les messages AlertUser. import ... public class Al er tU ser Li s t e n e r implements Runnable { private Server server ; private boolean interrupted ; private AlertUser alertUser ; public Al er tU ser Li st en e r ( Server server ) { this . server = server ; interrupted = false ; } public void run () { while (! interrupted ) { process () ; } } /* * Wait for a AlertUser tuple then call the a l e r t U s e r C a l l b a c k method */ public void process () { try { alertUser = ( AlertUser ) server . getSpace () . take ( Server . ALERT_USER_TEMPLATE , null , Long . MAX_VALUE ) ; if (! interrupted ) server . a l e r t U s e r C a l l b a c k ( alertUser ) ; } catch ( Exception ex ) { ex . printStack T ra c e () ; } } ... } Listing 1 – Extrait AlertUserListener.java Un autre avantage qu’offre cette mise en oeuvre par rapport aux listeners de Jini/JavaSpaces tient dans le fait qu’elle permet une isolation totale des différents modules. En effet, l’ordre de leur démarrage n’a pas d’importance car aucun mécanisme d’enregistrement n’est requis. Aussi, lorsqu’un module se termine brusquement, il peut redémarrer et traiter les messages insérés durant son absence. 3.2 3.2.1 Mobile Phone Plateforme J2ME Ce chapitre permet de comprendre les choix de développement présentés plus tard. En fonction du matériel que nous avions à diposition, notre implémentation est prévue pour des terminaux mobiles supportant la plateforme Java J2ME. Cette plateforme définie par Sun est pensée pour correspondre à deux types de terminaux mobiles. Chaque type est associé à une configuration qui fournit un ensemble de base de librairies en fonction de leurs ressources matérielles. • CDC (Connected Device Configuration) pour des terminaux mobiles disposant de ressources relativement élevées tel que des PDA Timothée Maret & Nicolas Martenet 14/34 iFridge Informatique pervasive • CLDC (Connected Limited Device Configuration) pour des terminaux mobiles disposants de ressources limitées tel que les téléphones mobiles Sun définit des profiles au dessus des configurations, qui consistent en un ensemble d’API (fonctionnalités de réseau, interface graphique, etc.) spécifique à des terminaux. Le profil MIDP (Mobile Information Device Profile) est utilisé au dessus de la configuration CLDC, tandis que le profil Personal Profile est utilisé au dessus de la configuration CDC. Les applications écrites pour le profile MIDP sont appelées des MIDlet. Les spécifications des profiles utilisent trois niveaux d’intérêt (MUST, SHOULD, MAY) qui vont déterminer si une fonctionnalité est obligatoire, nécessaire ou optionnelle pour que l’implémentation du profile puisse être certifiée par Sun. Concernant les terminaux aux ressources limitées, il existe plusieurs version des profiles (MIDP 1.0, MIDP 2.0) et des configurations (CLDC 1.0, CLDC 1.1). La principale limitation de la CLDC 1.0 réside dans le fait qu’elle ne supporte pas les types à virgule flottante de Java (float et double). Cette limitation est absente de la CLDC 1.1. Au dessus des profiles sont définis les packages optionnels qui définissent des fonctionnalités spécifiques que le constructeur peut implémenter en fonction de ses désirs. Une de ces fonctionnalités est le support du protocole Bluetooth défini dans la JSR-82. 3.2.2 Développement sur le Nokia 6600 Le Chapitre 1.5 définit les caractéristiques principales du téléphone mobile que nous avions à disposition pour ce projet. L’implémentation des API sur les téléphones mobiles peut être partiellement effectuée ou varier en fonction du terminal. Les documents suivants constituent une aide essentielle pour le développement • Document permettant de contourner les principaux bugs d’implémentation des API sur le Nokia 6600 [9] • Document sur les spécificités de l’implémentation des API par Symbian [8] • Document contenant la sémantique des codes d’erreur de Symbian OS [17] Les limitations de ce type de téléphone mobile ont influencé l’implémentation. Le support des nombres à virgule flottante est primordiale pour ce module, afin d’assurer la conversion des coordonnées de la représentation en WGS84 vers CH1903, ainsi que pour le calcul de la distance entre les points de mesure du GPS. Cette fonctionnalité a pu être assuré avec la librairie MathFP [4] qui l’émule à partir de nombres entiers. Cette librairie est disponible dans le répertoire lib. • Le support non natif des nombres à virgule flottante, et le non support de l’interface Serializable ne permettent pas d’utiliser les mêmes classes que pour les messages transitant entre entre le bloc UserManager et le bloc MobilePhone. Chacune des classes de la Figure 4 et de la Figure 5 sont doublées. Les nouvelles classes sont disponibles dans les package ifridge.messages.betweengpsandserver et ifridge.util.betweengpsandserver. Chacune des classes porte le même nom que l’oriTimothée Maret & Nicolas Martenet 15/34 iFridge Informatique pervasive ginale, préfixées par Gps. La classe mère devient donc la classe GpsMessage. • Le non support de ObjectOutputStream ne nous permet pas d’échanger directement des objets. C’est pourquoi l’implémentation d’une couche de communication au dessus de TCP est requise , permettant de sérialiser les messages, et de les reconstruire. 3.2.3 GPS bluetooth Bluetooth est un protocole sans fil utilisant la bande ISM de 2.4GHz. Ce protocole permet d’interconnecter différents types d’appareils et nous allons l’utiliser pour la connexion entre notre téléphone mobile et notre GPS pour récupérer les informations de localisation. La norme Bluetooth définit des classes de périphériques (téléphone mobile, clavier, imprimante, etc.) ainsi qu’un ensemble de profiles associés aux services pouvant être offerts(Echange de fichier, etc.). La connexion à un nouvel appareil offrant un service s’effectue en plusieurs phases 1. Recherche des terminaux disponibles (inquiry), en utilisant un protocole définit dans le norme Bluetooth 2. Recherche des services disponibles sur un terminal donné, identifiés par des UUID 3. Connexion au service spécifié en utilisant le protocole L2CAP ou un protocole basé sur celui-ci 4. Réception des données La spécification de la norme Bluetooth en Java est contenue dans la JSR-82. Nous utilisons cet spécification pour notre développement et notamment deux classes d’exemple contenues dans le package bluetooth fournies par Symbian [7]. Les caractéristiques du GPS à disposition sont listées au Chapitre 1.5. Ce GPS supporte les standards NMEA. Ces standards définissent des formats de trames appelées sentences [2] qui permettent de formater l’information de localisation émises par le GPS dans un string. Il existe de nombreux types de sentences, la plus basique étant la GSV. La sentence GGA est cependant utilisée car elle contient toutes les informations de localisation nécessaires pour ce projet. Le string ci-dessous représente une sentence GGA. $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47 Sur la base de ces normes, une implémentation d’un parseur contenu dans la classe io.GGADataParser.java a été réalisée. Ce parser contient une méthode pour parser une sentence GGA, une méthode permettant d’effectuer la conversion entre le système de coordonnées WGS84 utilisé dans les sentences NMEA et le système CH1903, ainsi qu’une méthode de calcul de la distance entre deux points CH1903. Le format CH1903 est le système de coordonnées géographiques suisse et a l’avantage de les exprimer en mètre et dans un plan, ce qui simplifie le calcul des distances. Les points renvoyés par le parser sont contenus dans des Objets du type GpsGGAData. A la réception d’une sentence GGA, les coordonnées au format WGS84 sont transformées en système CH1903, ensuite, la distance avec le dernier point envoyé au UserManager est calculée. Si cette distance est plus grande qu’un seuil Timothée Maret & Nicolas Martenet 16/34 iFridge Informatique pervasive définit par la variable MIN_EXCURSION de la classe io.IOManagerWithGPS.java, les coordonnées seront envoyées au serveur dans un message GpsUserState, et les dernières coordonnées sont mises à jour. Ce mécanisme permet d’économiser la quantité d’information transmise par GPRS lorsque l’utilisateur ne bouge pas. 3.2.4 Architecture La Figure 9 montre les différents threads utilisés par le bloc MobilePhone. Le lancement du MIDlet va démarrer un thread IoManagerWithServer. La fonction de ce thread est de se connecter au serveur TCP du bloc UserManager puis d’ouvrir un stream bidirectionnel sur cette connection. Ensuite, ce thread lit continuellement les données sur le stream d’entrée afin de parser les messages. Lorsque qu’un message est arrivé, la méthode processMessage est appelée et va invoquer une méthode de callback correspondant au type de message reçu. Ce thread peut aussi envoyer des messages en utilisant la méthode sendMessageToServer. Les threads DeviceLookup et ServiceLookup sont utilisés pour la phase de connexion avec le GPS. Au terme de cette phase, ils se terminent tandis qu’un thread IoManagerWithGps est créé. Ce thread va continuellement lire les données émisent par le GPS, à la recherche d’une sentence GGA. Fig. 9 – Architecture du bloc MobilePhone 3.2.5 Librairie Java GPS-Bluetooth Il existe une API Open Source pour la plateforme J2ME permettant de simplifier le développement d’applications utilisant la localisation par GPS. Cette Timothée Maret & Nicolas Martenet 17/34 iFridge Informatique pervasive librairie est relativement récente (avril 2006) et a été développée durant un travail de licence à l’Université de Genève. Elle permet de se connecter à de nombreux types de GPS Bluetooth, de les paramétrer, et supporte tous les standard NMEA. Elle offre de nombreuses fonctionnalités de conversions entre la pluspart des systèmes de coordonées, ainsi que des méthodes permettant de calculer les distances. Cette librairie est de plus bien documentée, ce qui en fait un outil extrêmement performant pour le développement d’applications de localisation. Cependant, la configuration nécessaire pour la faire fonctionner 3 la rend incompatible avec le téléphone mobile à notre disposition. Le code source ainsi que le rapport et la documentation sont disponbiles en ligne [13] et dans le répertoire references/gpsapi/. 3.2.6 Interface graphique Les Figure 10, Figure 11 et Figure 12 montrent les séquences de l’interface du téléphone mobile lors de l’utilisation de l’application. 3.2.7 Accès aux ressources depuis un MIDlet Le modèle de sécurité des MIDlet restreint l’accès aux fonctions de l’API jugées sensibles (globalement toutes les fonctionnalités dérivées du Generic Connection Framework) et demande explicitement à l’utilisateur s’il accepte d’accéder aux ressources. Ce fonctionnement est inutilisable pour cette application car de nombreux accès au réseau et au GPS sont effectués. Un MIDlet peut être distribué sous deux forme, sécurisée ou non. Lorsqu’un MIDlet est sécurisé, il a été signé à l’aide d’un certificat électronique du type Sun Java Signing Digital ID que l’on peut obtenir à un certain prix chez des organismes tel que VeriSign http://www.verisign.com/products/signing/ code/. Dès lors, il pourra accéder sans encombres à toutes les fonctionnalités désirées. Un MIDlet non sécurisé peut lui aussi accéder aux ressources, mais l’utilisateur devra modifier certains paramètres du MIDlet dans le gestionnaire d’applications du téléphone mobile tel que représenté sur la Figure 13. Cette option a été sélectionnée car l’obtention d’un certificat électronique est une opération relativement onéreuse et qu’il est possible de s’en passer. Plus d’informations sur la signature des MIDlets peut être obtenue dans la documentation de Nokia [10]. 3.3 User Manager 3.3.1 Communication avec le téléphone mobile La communication avec le téléphone mobile s’effectue par GPRS. Il existe plusieurs protocoles pour la transmission dont leurs avantages et désavantages sont listés dans le Tableau 1. Ce tableau permet de conclure que le protocole HTTP doit être sélectionné car il est le seul à être supporté par tous les terminaux mobiles disposant de MIDP 2.0. Cependant, le faible rendement de ce protocole pour les quantités de données structurées qui seront transportées, poussent à implémenter une 3 CLDC 1.1, MIDP 2.0, JSR-82, GPS Bluetooth supportant les standards NMEA Timothée Maret & Nicolas Martenet 18/34 iFridge Informatique pervasive Fig. 10 – Séquence lors de la connection au GPS Timothée Maret & Nicolas Martenet 19/34 iFridge Informatique pervasive Fig. 11 – Séquence lors de l’utilisation non spontanée du service Fig. 12 – Séquence lors de l’utilisation spontanée du service Timothée Maret & Nicolas Martenet 20/34 iFridge Informatique pervasive Fig. 13 – Autoriser implicitement l’accès d’un MIDlet au réseau [10] Protocole Type HTTP Ce protocole peut être orienté connexion ou non, selon sa configuration. Le transfert d’information est fiable. TCP Ce protocole est orienté connexion. Le transfert d’information est fiable. UDP Ce protocole n’est pas orienté connexion. Le transfert d’information n’est pas fiable. Rendement Support Le rendement de l’information utile rapporté à l’information totale transférée est relativement faible sur les petites quantités de données que nous devons transporter. Le rendement est excellent. Le support est obligatoire (MUST) dans MIDP 2.0. Ce protocole pourrait être utilisé directement avec un Session Bean du serveur d’application. Le rendement est excellent. Le support est nécessaire (SHOULD) dans MIDP 2.0. Ce protocole demande l’écriture d’un serveur TCP pour le UserManager Le support est nécessaire (SHOULD) dans MIDP 2.0. Ce protocole demande l’écriture d’un mini serveur UDP pour le UserManager, et un mécanisme de mise en ordre des paquets. Tab. 1 – Comparaison des protocoles de communication Timothée Maret & Nicolas Martenet 21/34 iFridge Informatique pervasive solution qui devrait être complémentaire à la première, basée sur le protocole TCP. Pour ce projet, c’est ce protocole qui a été sélectionné car le téléphone à notre disposition le supporte. Une couche de communication simple offrant un service de transfert de messages spécifiques a été implémentée au dessus du protocole TCP. Cette couche est un cas particulier du service offert par un service de transfert d’objet générique tel que ObjectOutputStream non disponible sur notre plateforme. La sérialisation d’un message s’effectue par le biais de la classe TCPMessage. Cette classe englobe un vecteur contenant les différentes parties du messages. Les méthodes addToken et addTokens permettant d’ajouter une ou plusieurs parties, et la méthode getTCPMessage retourne un String structuré à partir du contenu du vecteur. Chacune des sous classes de GpsMessage doit implémenter la méthode public TCPMessage toTCPMessage(). Cette méthode va retourner un objet TCPMessage contenant ses champs. Le Listing 2 montre l’implémentation de cette méthode pour les messages GpsUserState. ... public class GpsUserState extends GpsMessage { public GpsUser user ; public GpsState state ; ... /* * * Build a TCP message for this object * @return */ public TCPMessage toTCPMessage () { TCPMessage out = new TCPMessage () ; out . addToken ( " US " ) ; // set the MSGID out . addTokens ( user . toTokens () ) ; out . addTokens ( state . toTokens () ) ; return out ; } } Listing 2 – Extrait GpsUserState.java Chacun des messages sérialisés aura la structure suivante: ◦MSGID∗TOKEN1∗TOKEN2∗ ... ∗TOKENn∗• dans laquelle le symbole ◦ représente le délimiteur de trame, (ASCII code STX), ∗ représente le délimiteur de token (ASCII code ETX) et • représente le délimiteur de fin de trame (ASCII code NULL). Les délimiteurs sont ajoutés lors de l’exécution de la méthode getTCPMessage. Le MSGID représente l’identificateur du type de message et les champs TOCKEN contiennent l’information utile. un exemple de message GpsUserState sérialisé est donné ci-dessous. Les informations utiles correspondent au nom et mot de passe de l’utilisateur, aux coordonées CH1903X et CH1903Y, à l’altitude et à l’heure de la mesure en millisecondes. ◦US∗ROGER∗MOORE∗571424∗174564∗634∗21684000∗• Timothée Maret & Nicolas Martenet 22/34 iFridge Informatique pervasive Dans cette trame, l’information utile représente 33/44 = 75% de l’information transmise. Ce rapport est bon pour ces faibles quantités d’informations structurées. La même information transmise avec HTTP aurait la forme minimale ci-dessous et aurait un rendement de 33/102 = 32%. GET /page.jsp?n=ROGER&p=MOORE&x=571424&y=174564&a=634&h=21684000 HTTP/1.1 Host: diuflx-vm07.unifr.ch 3.3.2 Architecture La Figure 14 montre les différents threads de l’application. Ce bloc détient une connexion avec l’espace de tuples et une connexion avec chacun des terminaux mobiles. Au démarrage, la connexion est établie avec JavaSpaces , puis un thread est démarré pour chacun des listeners du space, enfin le serveur TCP est démarré et va continuellement attendre des connexions. Lorsqu’un utilisateur se connecte, un thread Service puis un thread KeepAlive sont démarrés. Le premier va lire continuellement les données reçues du téléphone mobile afin de reconstruire les messages. Ce thread permet aussi d’envoyer des messages au MobilePhone par la méthode sendMessageToMobile. Le thread KeepAlive va périodiquement déclencher l’envoi d’un message de heartbeat GpsKeepAlive afin de maintenir la connexion TCP active. Fig. 14 – Schéma bloc du bloc UserManager Ce bloc tient à jour le dernier message UserState pour chaque utilisateur afin de pouvoir calculer les valeurs de vitesse et d’accélération. A la réception Timothée Maret & Nicolas Martenet 23/34 iFridge Informatique pervasive d’un nouveau message UserState, ces calculs sont effectués puis le filtre est appliqué pour déterminer si le message doit être placé ou non dans l’espace des tuples. Le filtre est définit par le bloc Backend qui l’envoie à la fin de son initialisation. Ce filtre est contenu dans la classe OurFilter.java et laisse passer uniquement les messages dont la vitesse est inférieure à 18km/h. Le reste du travail de ce bloc est essentiellement de transformer les messages du type Message vers des messages GpsMessage et inversément. Cette fonctionnalité est assurée par des méthodes de la classe MessageParser.java. 3.4 3.4.1 Fridge Architecture Fig. 15 – Schéma du bloc Fridge Le frigo est équipé d’une antenne RFID et tous les aliments ajoutés au frigo doivent être équipés de tags. L’antenne permet de détecter si un aliment entre ou sort du frigo et transmet l’événement au serveur. C’est le serveur sur la base des informations contenues dans le base de donnée qui va déterminer le sens, il va utiliser le champ IsIn de la table Item. Lorsqu’un évènement est généré, si le champ est à faux alors cela signifie que l’élément est entré dans le frigo et que le champ devra être mis à jour à la valeur vrai et inversément pour le sens inverse. En connaissant le sens, le serveur pourra alors appeler la fonction correspondante. Timothée Maret & Nicolas Martenet 24/34 iFridge 3.4.2 Informatique pervasive Base de données La base utilisée par le serveur permet de garder une sauvegarde des éléments présents dans le frigo. Une table est nécessaire pour les éléments et une pour les tags RFID. Fig. 16 – Relation entre les tables dans la base de données pour le bloc Fridge La permanence est un champ important pour les éléments car c’est lui qui va déterminer si le frigo doit demander son achat lorsqu’il n’est plus disponible. La base de donnée est gérée de manière à ce qu’elle ne contienne que les éléments présents actuellement dans le frigo ou ceux qui ont été ajoutés à la liste d’achat. Lorsqu’un élément est ajouté au frigo, un tag lui est automatiquement attribué parmis les tags dispobiles. Nous avons utilisé un champ label plus facilement utilisable pour les utilisateurs. Le label du tag auquel il est associé est retourné à l’utilisateur. C’est à lui qu’incombe la charge de fixer le tag à l’élément avec de l’introduire dans le frigo. 3.4.3 Serveur Le serveur est évidemment la partie la plus importante. Il centralise les fonctionnalités qui sont ensuite offertes à l’utilisateur. Nous avons démarré l’implémentation en utilisant le serveur d’applications. Ainsi plusieurs SessionBeans ont été créé mais nous avons abandonné cette implémentation car le débuggage était trop pénible et le serveur posait de nombreux problèmes pour se connecter au space. Nous avons donc conservé le serveur d’application uniquement pour fournir l’interface web. Le serveur est une application standalone et l’interface web utilise cette application. La partie très importante du serveur est l’interaction avec l’espace des tuples. Le serveur va l’utiliser pour demander des éléments mais également pour recevoir les informations du backend. La création de message se fait très simplement en créant une instance de la classe voulue, tous les messages étant définis précédemment. Un listener est créé pour chaque type de message que le serveur pourrait recevoir. Le serveur définit pour chaque type de message une méthode correspondante. Lorsque le thread lit un message il appelle cette méthode. Ce sont ces méthodes qui implémentent le comportement du frigo. Timothée Maret & Nicolas Martenet 25/34 iFridge 3.4.4 Informatique pervasive Interface Web Nous avons utilisé des pages JSP associés à des tags, le tout déployé sur un serveur d’applications. Les tags ont principalement accès à la base de donnée pour y recueillir les informations nécessaire mais également au serveur pour ajouter un élément et demander ainsi demander la création du message correspondant. 3.5 3.5.1 Backend Architecture La Figure 17 présente l’architecture du Backend tel qu’il a été implémenté pour ce projet. Fig. 17 – Schéma du bloc Backend Une des fonctions les plus importantes du backend est la gestion de la localisation des utilisateurs. Si des éléments doivent être achetés il faut avertir les utilisateurs lorsqu’ils se trouvent à proximité d’un magasin leur permettant d’acheter au moins un des éléments. Cela nécessite de connaître à la fois la position de l’utilisateur, celle des magasins et enfin de connaître quels sont les éléments proposés par chaque magasin. De plus afin de filtrer les demandes, nous avons conçu un système basé sur des aires. Les aires sont des cercles caractérisés par la position de leur centre et de leur rayon Ces aires sont définies de manière à indiquer les zones d’intérêts. Chaque magasin du système sera ainsi associé à une ou plusieurs aires et c’est en se basant sur ces aires que le système va décider d’alerter ou non l’utilisateur. Grâce à ces aires, lorsque le système alerte un utilisateur pour un achat, il a la certitude que l’utilisateur se trouve au maximum à la valeur du diamètre du cercle. Il faut donc définir les aires de manière réfléchie pour faciliterle travail de l’utilisateur. La figure ci-dessous Timothée Maret & Nicolas Martenet 26/34 iFridge Informatique pervasive présente un exemple présentant deux aires. Fig. 18 – Représentation d’une zône dans la base de données Deux aires ont été définies, les bâtiments 2 et 3 sont associés à l’aire 2 et le bâtiment 1 à l’aire 1. Si on considère que tous les éléments sont disponibles dans chaque bâtiment alors un utilisateur qui entre dans l’aire 2 recevra un message l’invitant à acheter les éléments de la liste d’achats. Il aura ensuite le choix d’aller dans le magasin qu’il désire, même dans une autre aire puisque la délimitation est arbritraire et totalement transparente pour l’utilisateur. L’intérêt est de pouvoir filtrer plus facilement les positions reçues pour l’utilisateur et d’assurer qu’il trouve un magasin dans un certain rayon. 3.5.2 Base de donnée Le Backend utilise plusieurs tables car ses fonctions sont plus étendues. La première fonction consiste à gérer la liste des achats ce qui nécessite une première table. Il doit ensuite gérer les positions. Cette fonction nécessite donc de nombreuses informations qui sont toutes stockées dans les différentes tables. La Figure 19 suivant présente les relations entre les différentes tables. La table du sommet est la table des achats, elle reprend exactement les champs définis par le message Item. Elle ne contient donc que les objets devant être achetés, un objet y est ajouté lors d’un message ItemNeeded et est supprimé lors d’un message ItemBought. Ensuite les 4 tables principales représent respectivement la liste des noms d’éléments supportés par le système, les bâtiments, les aires et enfin les utilisateur. La table knownItems sert à uniformiser les noms des objets ajoutés par les utilisateurs. La table user représente les données des objets User et State. Enfin les 3 tables intermédiaires permettent de lier respectivement les items avec les bâtiments, les bâtiments et les aires et enfin les utilisateurs avec les aires. Le calcul des relations entre aires et bâtiments ou utilisateurs se fait automatiquement en fonctions des positions. Il est important de noter qu’il faut entrer Timothée Maret & Nicolas Martenet 27/34 iFridge Informatique pervasive Fig. 19 – Relations entre les tables de la base de données pour le bloc Backend tout d’abord les aires. Lors de l’insertion d’une nouvelle aire, aucune relation par rapport aux utilisateurs ou aux bâtiements n’est calculée. Par contre lorsqu’un bâtiment est ajouté les relations sont calculées de même lorsqu’un nouvel état pour un utilisateur est reçu. Une requête spéciale est prévue pour fournir les éléments disponibles dans une certaine aire pour un utilisateur particulier. 3.5.3 Serveur Le serveur du bloc Backend a comme principale fonction la gestion des utilisateurs et de leur localisation. Mais il sert également de relais entre le bloc Fridge et le bloc UserManager. La totalité des messages vont donc passer par le Backend, il devra soit les transmettre plus loin soit y répondre directement. Pour chaque type de message un listener est créé. La particularité du Backend est qu’il peut recevoir des messages provenant de plusieurs modules, il faut donc vérifier la provenance pour diriger correctement la requête. Grâce au modèle donné au listener il est possible de filtrer les messages uniquement par rapport à la destination. Ainsi le backend retire du space tous les messages dont le change TO vaut BACKEND. 3.5.4 Interface Web l’interface web tout comme pour le frigo est minimale. Elle permet simplement d’ajouter des aires, des bâtiments ou des utilisateurs de manière plus aisée que d’entrer les commandes SQL. Timothée Maret & Nicolas Martenet 28/34 iFridge 4 Informatique pervasive Tests Les quatres blocs ont été testé indépendamment durant la phase de développement. Des tests réels mettant en place les éléments du scénario ont été effectués avec tous les bloc et un utilisateur. La validité des coordonnées mesurées, ainsi que l’insertion de zones dans la base de données a été contrôlée à l’aide de la base de géodonnées de l’office fédéral de topographie disponible en ligne http://www.swisstopogeodata.ch/geodatenviewer/. Une dizaine d’ingrédient, plusieurs zônes ainsi que des bâtiments associés à des sous ensembles d’ingrédients ont été insérés dans notre base de donnée. Ces tests ont permis de valider toutes les fonctionnalités clef définies au Chapitre 2.2. Cependant notre GPS ne possédant pas d’antenne, offrait de faibles performances. Une zone de couverture a due être trouvée et la stabilité des coordonnées mesurées était mauvaise puisque sans bouger, les points variaient d’environs deux mètres entre deux mesures. C’est pourquoi les optimisations mises en oeuvre pour économiser la quantité d’information ne fonctionne pas de manière optimale. Une solution à ce problème serait d’implémenter un simple filtre sur les données, effectuant une moyenne sur les derniers points pour déterminer la valeur actuelle. 5 5.1 Conclusions Développement Ce projet a demandé la mise en oeuvre de nombreux éléments hétérogènes. Cependant, l’architecture modulaire, reliée par un espace d’échange de tuples pour gérer la communication s’est révélé très souple. Les phases de tests nous ont permis d’apprécier cette souplesse permettant de redémarrer uniquement les blocs défectueux ou à modifier, nous épargnant une perte de temps considérable. La coordination entre les blocs s’est déroulée uniquement en définissant le format de messages (tuples) échangés. Cette technologie présente cependant une difficulté pour le développement, en effet, il n’est pas possible d’accéder simplement à la liste des tuples contenus dans l’espace. Les caractéristiques limitées de la plateforme utilisée pour le téléphone rendent le MIDlet portable, mais ont compliqué passablement le développement. L’utilisation d’un téléphone plus performant (Linux, J2ME CDC|CLDC1.1) aurait permis d’utiliser JMatos de PsiNaptic [14], une implémentation de Jini pour les terminaux mobiles, afin de connecter directement le terminal mobile à l’espace de tuples. La librairie de l’Université de Genève aurait pu être utilisée et aurait offert un gain de temps considérable. 5.2 Fonctionnelles Les fonctionnalités clef définies lors de la spécification ont toutes été implémentées et testées avec succès. La liste d’achat est gérée correctement par le frigo et peut être mise à jour soit par une interface web, soit par le téléphone mobile de chaque utilisateur. Les demandes d’achat contiennent les bons éléments et sont envoyées correctement à l’utilisateur lorsqu’il se trouve dans une zone concernée. Le système gère correctement les cas ou l’utilisateur ne lui réTimothée Maret & Nicolas Martenet 29/34 iFridge Informatique pervasive pond pas, et envoye correctement des alertes lorsqu’un élément sensible tarde à être placé au frigo. Dans cette implémentation, la représentation des aires contenant des bâtiments est très simple. Il serait possible de l’étendre la puissance de description des aires par une description géométrique plus complexe tel qu’un polygone. Les caractéristiques de ce prototypes nous paraissent particulièrement intéressantes, il serait possible d’adapter ce projet pour pour d’autres tâches demandant à être réparties entre plusieurs utilisateur de manière opportuniste. 5.3 Personnelles Ce projet a été réalisé par un groupe de deux étudiants. Les blocs Backend et Fridge ont été implémentés par Nicolas Martenet, tandis que les blocs UserManager et MobilePhone ont été implémentés par Timothée Maret. La spécification, le rapport, la présentation ainsi que la vidéo de démonstration ont étés réalisé à part égale entre ces deux étudiants. Au final, ce projet a représenté environs 250 heures de travail personnel pour chacun des deux étudiants. 5.4 Perspectives Ce projet a posé des bases et a abouti à un prototype fonctionnel. Il est possible d’améliorer de nombreux points de l’implémentation ou d’augmenter les fonctionnalités. Concernant l’implémentation de la communication entre les bloc UserManager et UserMobile, le support de HTTP ou HTTPS devra être réalisé pour garantir une portabilité de l’application. Pour la partie TCP, la solution mise en oeuvre est relativement figée et demande certaines adaptation pour transférer d’autres types de messages que ceux spécifiés. Une solution serait de rechercher une implémentation de ObjectOutputStream pour J2ME afin de pouvoir transférer tous types de messages. Les fonctionnalités du bloc Fridge sont restées volontairement sobres, cependant les extensions envisageables sont nombreuses, tel que la gestion de menus, d’un agenda ou l’état de contenance des ingrédient. Références [1] Freeman, Hupfer, Arnold. JavaSpaces Principles, Patterns, and Practice. Addison-Wesley, 1999. [2] Glenn Baddeley. NMEA sentence information. [en ligne]. http://home.mira.net/~gnb/gps/nmea.html (02 décembre 2006). [3] Jan Newmarch. Foundations of Jini 2 Programming. Apress, 2006. [4] jScience Technologies. MathFP Fixed Point Integer Math. [en ligne]. http://mywebpages.comcast.net/ohommes/MathFP (7 novembre 2006). [5] Ken Arnold, Robert Scheifler, Jim Waldo, Bryan O’Sullivan, Ann Wollrath. The Jini Specification. Addison-Wesley, 1999. [6] Mark Weiser. The Computer for the 21st Century. [en ligne]. http://www.ubiq.com/hypertext/weiser/SciAmDraft3.html (9 novembre 2006). Timothée Maret & Nicolas Martenet 30/34 iFridge Informatique pervasive [7] Martin de Jode. An Introduction to Programming the Java APIs for Bluetooth Wireless Technology (JSR 82) on Symbian OS. [en ligne]. http://www.symbian.com/developer/techlib/papers/JABWT/JABWT_ 1_0.pdf (26 novembre 2006). [8] Martin de Jode. What Java developers need to know about MIDP on Symbian OS. [en ligne]. developer.symbian.com/main/downloads/papers/midpjava/ WhatJavaDevelopersNeedToKnow_1.0.pdf (22 décembre 2006). [9] Nokia Corporation. Known Issues In The Nokia 6600 MIDP 2.0 Implementation v1.7. [en ligne]. sw.nokia.com/id/94d3bcbe-41e3-4522-bc8e-d6c45948d9ce/Known_ Issues_In_The_Nokia_6600_v1_7_en.pdf (21 décembre 2006). [10] Nokia Corporation. MIDP 2.0: Tutorial On Signed MIDlets. [en ligne]. http://www.forum.nokia.com (18 décembre 2006). [11] Phidgets Inc. PhidgetRFID. [en ligne]. http://www.phidgets.com/documentation/1023.pdf 2006). (11 novembre [12] Prof. B. Hirsbrunner , Prof. P. Kropf, Dr V. Pallotta, M. Schiely, P. Bruegger. Ubiquitous Computing, Master Course. [en ligne]. http://diuf.unifr.ch/pai/uc/index.php (9 novembre 2006). [13] Stéphan Velen, Christophe Praplan. Librairie Java pour l’utilisation d’un récepteur GPS Bluetooth sur téléphone mobile. Master’s thesis, Université de Genève, avril 2006. http://www.universal-locator.com (03 décembre 2006). [14] Steve Hashman, Steven Knudsen. PsiNaptic, The Application of JiniTM Technology to Enhance the Delivery of Mobile Services. [en ligne]. http://www.sun.com/software/jini/whitepapers/PsiNapticMIDs. pdf (7 novembre 2006). [15] Sun Microsystems. Enhancements in JDK 5. [en ligne]. http://java.sun.com/j2se/1.5.0/docs/guide/language/generics. html (15 novembre 2006). [16] Sun Microsystems. Jini Network Technology. [en ligne]. http://java.sun.com/developer/products/jini/ (15 novembre 2006). [17] Symbian. Comprehensive List Of Symbian OS Error Codes. [en ligne]. http://www.symbian.com/developer/techlib/papers/error_codes/ ErrorCodesLatest.zip (16 décembre 2006). A Utilisation du programme Chacun des modules ayant été développé avec NetBeans, vous trouverez dans le répertoire code du CD, les quatres projets correspondant chacun à un module. Ces projets peuvent êtres directement ouverts par NetBeans. Ils contiennent les sources, les classes compilées, les librairies, ainsi que des scripts ANT permettant de compiler et d’exécuter chacun des projets. Les interfaces web sont également des projets NetBeans. Ce sont les projets se terminant par Web, iFridgeWeb pour le module Fridge et iFridgeBackenWeb Timothée Maret & Nicolas Martenet 31/34 iFridge Informatique pervasive pour le module Backend. Le fichier war déployable se trouve pour chacun des projets dans le répertoire dist. Ils peuvent être déployés sur le serveur soit en utilisant NetBeans soit en utilisant la console du serveur. A.1 Compilation Pour compiler et créer un fichier jar exécutable des projets correspondant aux modules Backend, Fridge et UserManager, il faut se placer le répertoire code/<project> et utiliser la commande ant jar Pour le module MobilePhone, la commande suivante doit être utilisée depuis le répertoire code/MobilePhone ant deploy A.2 Exécution La première étape avant de lancer les différent modules est de démarrer Jini et JavaSpaces. Ensuite, L’exécution des différents modules interconnectés par l’espace de tuples peuvent se lancer dans un ordre quelconque et sur des machines différentes car elles sont reliées entre elles par JavaSpaces. A.2.1 Jini/JavaSpaces L’installation de Jini fournit un exécutable qui va lancer les principaux services, dont JavaSpaces. Cet utilitaire se trouve sous <repertoire d’installation de Jini>/installverify/Launch-All. L’adresse de la machine sur laquelle s’exécute Jini va devoir être mise à jour dans le code des différents modules, car la nous avons opté pour une recherche de services Unicast. A.2.2 UserManager Ce module comporte un mini serveur TCP ouvert sur le port 9001 qui va gérer les connection GPRS avec les téléphones mobiles. Ce port doit donc être ouvert pour l’exécution 4 . La variable javaSpaceURL contenant l’adresse de la machine exécutant Jini/JavaSpaces doit être mise à jour dans la classe tcpserver.Server.java. Pour lancer ce module, il faut se placer dans le répertoire code/UserManager et lancer la commande suivante ant run A.2.3 Fridge Ce module comprend un programme principal qui fait office de serveur pour le frigo et également une interface web ainsi qu’une base de donnée. Le serveur d’application de Sun doit donc être préalablement installé et le fichier war peut être déployé. Il faut ensuite créer la base de donnée à l’aide du script SQL fourni 4 Il est aussi possible de modifier le port d’écoute spécifié dans la variable TCP_LISTENING_PORT de la classe tcpserver.Server.java Timothée Maret & Nicolas Martenet 32/34 iFridge Informatique pervasive dans le répertoire lib, pour cela l’outil MySQL Administrator est particulièrement indiqué puisque l’option Restore permet d’exécuter facilement le script. Le contenu de la table RFID sont disponibles dans cette sauvegarde, cependant la table des éléments est vide. La connexion à la base de donnée se fait grâce à JDBC, le nom JDBC est définit dans le fichier ifridge.db.DBManagerBean.java. Dans notre cas il contient la valeur jdbc:mysql://localhost/ifridge. De la même manière que pour le bloc UserManager, l’URL du serveur exécutant JavaSpaces doit être mis à jour dans le fichier ifridge.manager.ManagerBean. Enfin il faut placer la librairie native phidgets dans le répertoire C:/WINDOWS/system32 L’interface web n’est pas obligatoire pour utiliser ce module, cependant elle permet de simplifier les modifications de la base de données. Pour utiliser l’interface web du frigo, il faut tout d’abord déployer le fichier war du projet iFridgeWeb comme expliqué précédemment. L’URL a utiliser dans un navigateur web est http://nom_du_serveur/iFridgeWeb/ la page d’accueil sera automatiquement chargée. A.2.4 Backend Au niveau de l’exécution, ce module est très proche du bloc Fridge puisqu’il nécessite également le serveur d’application pour déployer l’interface web. Un script SQL est également disponible pour créer les différentes tables nécessaires. Les données de test ont été conservées à l’exception des utilisateurs. La variable pour la connexion à la base de donnée se trouve dans le fichier backend.db.BackendDBManagerBean.java et celle pour JavaSpaces dans le fichier backend.manager.BackendManagerBean.java. L’interface web n’est pas obligatoire pour utiliser ce module, cependant elle permet de simplifier la gestion de la base de données. Pour utiliser l’interface web du Backend, il faut tout d’abord déployer le fichier war du projet iFridgeBackendWeb comme expliqué précédemment. L’URL a utiliser dans un navigateur web est http://nom_du_serveur/iFridgeBackendWeb/ la page d’accueil sera automatiquement chargée. A.2.5 MobilePhone Avant la compilation, la variable SERVER_URL de la classe ifridge.IFridge.java doit être mise à jour avec l’adresse et le port d’écoute de la machine sur laquelle s’exécute le bloc UserManager. Après avoir transféré puis installé le MIDlet disponible sous dist/iFridgeMiddlet.jar sur le téléphone mobile, il faut modifier les droits d’accès aux ressources du MIDlet afin qu’il puisse y accéder sans confirmation de l’utilisateur. Les paramètres à modifier sont les suivants • Network access = Ask first time • Connectivity = Always allowed Ensuite, le GPS peut être démarré et enfin, le MIDlet nommé iFridge peut être lancé. Timothée Maret & Nicolas Martenet 33/34 iFridge B Informatique pervasive Liste des figures Table des figures 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 C Kit PhidgetRFID . . . . . . . . . . . . . . . . . . . . . . . . . . . Use case de l’application . . . . . . . . . . . . . . . . . . . . . . . Architecture générale du projet . . . . . . . . . . . . . . . . . . . Messages échangés par les blocs de l’application . . . . . . . . . . Structures de données de l’application . . . . . . . . . . . . . . . Diagramme d’activité lors d’un événement RFID par le bloc Fridge Diagramme d’activité à la réception d’un message ItemBought par le bloc Fridge . . . . . . . . . . . . . . . . . . . . . . . . . . Structogramme de la gestion des données de localisation par le bloc Backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Architecture du bloc MobilePhone . . . . . . . . . . . . . . . . . Séquence lors de la connection au GPS . . . . . . . . . . . . . . . Séquence lors de l’utilisation non spontanée du service . . . . . . Séquence lors de l’utilisation spontanée du service . . . . . . . . . Autoriser implicitement l’accès d’un MIDlet au réseau [10] . . . . Schéma bloc du bloc UserManager . . . . . . . . . . . . . . . . . Schéma du bloc Fridge . . . . . . . . . . . . . . . . . . . . . . . . Relation entre les tables dans la base de données pour le bloc Fridge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Schéma du bloc Backend . . . . . . . . . . . . . . . . . . . . . . Représentation d’une zône dans la base de données . . . . . . . . Relations entre les tables de la base de données pour le bloc Backend 3 5 6 7 8 9 10 12 17 19 20 20 21 23 24 25 26 27 28 Contenu du CD Le contenu du CD est réparti dans cinq répertoires principaux. • code Contient les sources, les exécutables et la javadoc pour chacun des quatre modules • lib Contient les librairies et programmes externes utilisés pour le développement • presentation Contient la présentation ainsi qu’un petit film présentant le fonctionnement du système • rapport Contient le présent rapport ainsi que ses sources LATEX • references Contient la documentation citée dans les références Timothée Maret & Nicolas Martenet 34/34