La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Hankaa S. Formation ITIN Java mobile Hugues Sansen.

Présentations similaires


Présentation au sujet: "Hankaa S. Formation ITIN Java mobile Hugues Sansen."— Transcription de la présentation:

1 hankaa S. Formation ITIN Java mobile Hugues Sansen

2 Formation ITIN Hugues Sansen Fondateur de la société Peer2Phone, éditeur du logiciel de convergence fixe mobile GoSIP et du portail de téléphonie éponyme (www.go- sip.com).www.go- sip.com Fondateur et CEO de SHANKAA, opérateur télécoms, Secrétaire général du club des utilisateurs Java. Conseil en stratégie et en stratégie dinnovation.

3 Formation ITIN Objectif de ce cours à la fin de ce cours : –vous connaîtrez les solutions pour développer des applications Java sur les mobiles, larchitecture de la technologie Java Micro Edition et lAPI de base MIDP. –Vous explorerez les possibilités de MIDP au cours du développement dune MIDlet, application Java ME pour mobile.

4 Formation ITIN Agenda Quelles sont les performances Java de votre téléphone : TastePhone notre première MIDlet, Hello world. les solutions pour développer en Java sur mobile, J2ME : –CLDC –CDC –la machine virtuelle CLDC HotSpot –MIDP Faisons évoluer notre application.

5 Formation ITIN Testez les capacités java de votre téléphone TastePhone de Thibaut Régnier : Lapplication de référence mondiale pour tester les capacités Java de votre téléphone : –sur directement sur wap.club-java.com –ou java.com/TastePhone/TastePhone.jad ou recherchez votre mobile sur : –http://www.club- java.com/TastePhone/J2ME/MIDP_Benchmark.jsp

6 Formation ITIN Notre première application J2ME Hello World Chargez J2ME et la documentation des APIs correspondantes Chargez NetBeans, avec lextension pour mobile. Chargez le Wireless Toolkit : WTK… Créez un « projet mobile » et une « application mobile ». Regardez le programme Hello proposé en exemple. Testez votre application dans lémulateur. Chargez la MIDlet sur votre mobile.

7 Formation ITIN Notre première application J2ME Hello World examinons le code

8 Formation ITIN * * HelloMidlet.java * Created on 1 octobre 2006, 12:09 */ package hello; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** * Hugues Sansen */ public class HelloMidlet extends MIDlet implements CommandListener { /** Creates a new instance of HelloMidlet */ public HelloMidlet() { } private Form helloForm; private StringItem helloStringItem; private Command exitCommand; /** This method initializes UI of the application. */ private void initialize() { // Insert pre-init code here getDisplay().setCurrent(get_helloForm()); // Insert post-init code here } /** Called by the system to indicate that a command has been invoked on a particular displayable. command the Command that ws invoked displayable the Displayable on which the command was invoked */ public void commandAction(Command command, Displayable displayable) { // Insert global pre-action code here if (displayable == helloForm) { if (command == exitCommand) { // Insert pre-action code here exitMIDlet(); // Insert post-action code here } // Insert global post-action code here } /** * This method should return an instance of the display. */ public Display getDisplay() { return Display.getDisplay(this); } /** * This method should exit the midlet. */ public void exitMIDlet() { getDisplay().setCurrent(null); destroyApp(true); notifyDestroyed(); }

9 Formation ITIN /** This method returns instance for helloForm component and should be called instead of accessing helloForm field directly. Instance for helloForm component */ public Form get_helloForm() { if (helloForm == null) { // Insert pre-init code here helloForm = new Form(null, new Item[] {get_helloStringItem()}); helloForm.addCommand(get_exitCommand()); helloForm.setCommandListener(this); // Insert post-init code here } return helloForm; } /** This method returns instance for helloStringItem component and should be called instead of accessing helloStringItem field directly. Instance for helloStringItem component */ public StringItem get_helloStringItem() { if (helloStringItem == null) { // Insert pre-init code here helloStringItem = new StringItem("Hello", "Hello, World!"); // Insert post-init code here } return helloStringItem; } /** This method returns instance for exitCommand component and should be called instead of accessing exitCommand field directly. Instance for exitCommand component */ public Command get_exitCommand() { if (exitCommand == null) { // Insert pre-init code here exitCommand = new Command("Exit", Command.EXIT, 1); // Insert post-init code here } return exitCommand; } public void startApp() { initialize(); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } }

10 Formation ITIN Regardons les exemples Créez un projet, importez un WT project

11 Formation ITIN Regardons les exemples Dans le WTK choisissez lapplication BluetoothDemo

12 Formation ITIN Regardons les exemples lancez lapplication deux fois, en mode serveur et en mode client dans le serveur, sélectionnez les images à publier, dans le client, lancez une recherche, acceptez une des images proposées.

13 Formation ITIN Regardons les exemples Chargez lexemple 3D demo lancez le jeux de la vie

14 Formation ITIN Java mobile, introduction Il existe plusieurs options pour déployer du JAVA embarqué: –J2ME : SUN, Esmertec etc.. –votre machine virtuelle ex : ewe (www.ewe.com) machine virtuelle opensource utilisée dans les ordinateurs de voiture (GM) et dans Peer2Phone (même environnement sur PC, Mac, Linux, Windows mobile), permet dutiliser des dll.www.ewe.com Mysaifu JVM (windows mobile), GPLv2 IST (http://www.ist-eu.com) : fournit des micro JVM personnalisées, XML est intégré dans la VM pour de meilleures performances.

15 Formation ITIN Java Mobile Edition, SUN

16 Formation ITIN Java Mobile Edition Java ME a été conçu par SUN pour fonctionner dans les contraintes imposées par les petits appareils et les mobiles. Il retient les bases de Java et permet de développer des applications sur des appareils limités en taille mémoire, en capacité de calcul, de visualisation et de batterie. La plate-forme Java ME regroupe des technologies et des spécifications afin de construire un environnement dexécution pour répondre aux besoins dappareils ou de marchés particuliers. Ceci permet la diffusion du même environnement sur différentes plates-formes afin de permettre une industrialisation du déploiement dapplications dans des environnements différents.

17 Formation ITIN Java Mobile Edition La technologie Java Mobile Edition repose sur trois éléments : – Une configuration offre un ensemble de base de librairies et de capacité de machine virtuelle pour une large gamme dappareils. –un profile est un ensemble dAPI qui sapplique à une gamme plus étroite dappareils. –des paquetages optionnels, qui regroupent un ensemble dAPI spécifiques à une technologie.

18 Formation ITIN Java Mobile Edition La plate-forme Java ME a été divisée en deux types de configurations : –lune pour les petits appareils mobiles, appelée « Connected Limited Device Configuration » (CLDC) –et lautre pour des appareils mobiles plus évolués comme les smart phones et les set-top box (boîtier canal plus) appelée « Connected Device Configuration » (CDC).

19 Formation ITIN Java Mobile Edition, CLDC La configuration pour les appareils mobiles à ressources réduites est appelée Connected Limited Device Configuration (CLDC). Elle a été spécifiquement conçue pour remplir les besoins dexécution dapplications sur les appareils limités en mémoire, capacité de calcul et capacité graphique. Sur les mobiles on associe généralement le Mobile Information Device Profile (MIDP) qui fournit un environnement complet au développement dapplications pour les téléphones mobiles. Les applications reposent ainsi sur la configuration et le profile. CLDC et MIDP représentent lenvironnement le plus courant et les applications de cet environnement sont appelées MIDlet. Une MIDlet est une application Java dont le champ peut couvrir les jeux, les applications métier comme dautres domaines (plan de métro interactif, calcul de marée, interaction avec un serveur Bluetooth etc.). Ces applications peuvent ainsi être exploitée sur toutes les plates-formes qui respectent les spécifications Java ME. Une MIDlet peut-être téléchargée depuis un serveur accessible par WAP, Bluetooth etc. –wap.club-java.com –les bornes Velib munies de Bluetooth.

20 Formation ITIN Java Mobile Edition, CLDC La technologie J2ME est délivrée en API appelée configurations, profils et paquetages optionnels. Lenvironnement dune application J2ME comprends à la fois : –une configuration comme CLDC –et un profil comme Mobile Information Device Profile (MIDP). De plus des paquetages additionnels apportent des fonctionnalités spécifiques supplémentaires comme –le wireless messaging, –la capture multimédia et le playback. La possibilité de choisir parmi différentes API permet aux concepteurs et aux développeurs dapplications dadapter les capacités de leur logiciels à celles des machines cibles. Ils peuvent utiliser des API qui leur donnent un accès facilité aux composants de certains types dappareils, sans la surcharge dAPI conçues pour des fonctionnalités que lappareil ne supporte pas.

21 Formation ITIN Java Mobile Edition, CLDC La configuration CLDC –Une configuration apporte les librairies de base et les fonctionnalités de la machine virtuelle nécessaire à limplantation de chaque environnement J2ME. –Quand il est couplé à un ou plusieurs profils, le « Connected Limited Device Configuration » donne au développeur une plate-forme solide pour la création dapplications délectronique grand public et dapplications embarquées. Profils –Un profil est une ensemble dAPI standard qui supportent une catégorie déterminée dappareils à lintérieur dune configuration donnée. –Un profil spécifique est couplé à une configuration comme CLDC pour apporter un environnement Java pour une classe donnée dappareil. –MIDP est un profil pour mobile qui avec CLDC apporte un environnement parfaitement adapté au développement dapplicaiton sur mobile. Paquetages Optionnels –Un paquetage optionnel est un ensemble dAPIs adapté à une technologie spécifique qui étendent les fonctionnalités. –CLDC supporte un certain nombre de paquetages optionnels qui permettent au concepteur dapplications dadapter précisément les besoins de son application aux ressources physiques disponibles. Les paquetages optionnels de CLDC incluent : Wireless Messaging API (WMA) et Mobile Media API (MMAPI).

22 Formation ITIN Java Mobile Edition, CLDC Objectifs –La spécification CLDC a pour but de standardiser une plate- forme Java hautement portable avec une empreinte minimale pour les appareils connectés à ressources contraintes. –Il est développé au travers du « Java Community Process (JCP) » qui regroupe 500 membres dont des opérateurs de téléphonie mobile, des constructeurs de téléphones mobiles et des éditeurs de logiciels. –CLDC a été conçu en gardant les objectifs suivant à lesprit : La réduction de lempreinte à un niveau acceptable pour un déploiement mass-market, La facilitation de la portabilité par labstraction des opérations natives du système au travers dAPI standardisées. Étendre les fonctionnalités en permettant un téléchargement dynamique dapplications.

23 Formation ITIN Java Mobile Edition, CLDC Target Devices –La configuration CLDC est conçue pour apporter les avantages de la plate-forme Java aux appareils connectés dotés de capacités de calcul et graphiques limités : les téléphones mobiles, les pageurs, les organiseurs personnels de base et les équipement machine-to- machine. –De plus la configuration CLDC peut aussi être déployée sur les appareils de maisons comme les set-top boxes TV et les terminaux point de vente. Les cibles ont généralement les capacités suivantes : un processeur 16-bit or 32-bit cadencés à 16MHz ou plus, au moins 160kB de mémoire non volatile dédiée aux librairies CLDC et à la machine virtuelle au moins 192kB de mémoire disponible pour la plate-forme Java, une consommation électrique faible, généralement alimenté par batterie, une connectivité à un type donné de réseau, généralement sans fil et intermittente avec une bande passante limitée.

24 Formation ITIN Limplantation CLDC HotSpot de SUN La première génération de machines virtuelles du CLDC et dont les développement se poursuivent, était la KVM (Kilo Virtual Machine). Sun a développé une nouvelle machine virtuelle optimisée pour les déploiement commerciaux appelée la Sun CLDC HotSpot Virtual Machine. Elle a pour objectif daméliorer les performances en minimisant lempreinte mémoire. Elle apporte un gain en performance doublé par rapport à la KVM tout en réduisant lempreinte mémoire. Elle respecte les spécification CLDC et inclut un certain nombre de fonctionnalités brevetées qui accélèrent lexécution et utilise les ressources plus efficacement. Elle est disponible sur un certain nombre de machines ce qui permet aux fabricants de matériels de réduire substantiellement les délais de mise sur le marché.

25 Formation ITIN CLDC HotSpot Implementation de SUN J2ME sinscrit dans la famille des éditions Java comme J2SE et J2EE. La KVM (kilo VM) est la machine virtuelle originellement déployée sur les petits appareils à batterie. La KVM supportait le « Mobile Information Device Profile (MIDP) »

26 Formation ITIN Les challenges de la VM CLDC HotSpot de SUN Vitesse contre empreinte. Il y a un conflit entre la vitesse dexécution et les besoins en mémoire (empreinte mémoire). Comment concevoir un compilateur dynamique rapide sans faire exploser les coûts de mémoire? Le portage tel quel de la technologie HotSpot disponible sur les PC auraient résulté en une empreinte mémoire trop importante pour les appareils grand public à batterie. De la bonne gestion du cache. La mémoire augmente le coût des appareils tandis que la loi de Moore tente les développeurs à gaspiller de la mémoire. Plus de mémoire augmente aussi la consommation des appareils avec un impact important sur la batterie. Limplantation du CLDC HotSpot a eu pour principal objectif de conception de garantir une utilisation optimale du cache de telle façon que la pile puisse tenir dans le cache primaire (dans le processeur) ou additionnel. Cette disposition améliore la tenue de la batterie en évitant les écritures et lectures sur la mémoire principale. Les objectifs de conception dune bonne gestion du cache impliquent les stratégies suivantes: –concevoir une machine virtuelle avec des objets les plus compacts possibles, –lutilisation dun ramasse-miettes générationnel qui ne touche la mémoire que localement, –garder le code compilé dans le tas des objets ou il sera facilement repositionné et effacé Améliorer la durée de la batterie. Lamélioration de la vitesse dexécution de la machine HotSport du CLDC a un impact direct sur la durée de la batterie : une exécution plus rapide consomme moins dénergie. Le besoin dadapter les paramètres. Une conception de haut niveau doit se faire en considérant les appareils réels: –Le comportement du cache varie énormément dun appareil à lautre, –La conception de la machine HotSpot du CLDC permet un réglage par famille dappareil.

27 Formation ITIN Limplémentation de la VM CLDC HotSpot de SUN Une véritable machine virtuelle 32 bits –Ce qui lui procure un espace dadressage important et évolutif et une architecture bien adaptée aux téléphones depuis le milieu de gamme jusquau haut de gamme. Une organisation compacte des objets –Limplantation de la machine virtuelle HotSpot supporte une organisation compacte des objets ce qui diminue la consommation mémoire. Un objet est composé : dune entête qui donne les informations de réflexivité, le hashcode et les statuts de verrouillage, dun corps qui contient les champs de lobjet. –La plupart des machines virtuelles utilisent des entêtes de deux mots. Mais comme la taille moyenne des objets est faible, lentête occupe un pourcentage important de son empreinte mémoire. La machine HotSpot CLDC nutilise quun seul mot. Lempreinte des objets est non seulement plus faible mais cette approche permet aussi des allocations mémoires plus rapides. Une gestion unifiée des ressources –Toutes les données allouées résident dans le tas dont : Les objets Java les objets réflectifs comme les méthodes et les classes, le code généré par le compilateur, Les structures de données internes à la machine virtuelle. –Lunification des ressources a pour avantage de permettre au ramasse-miettes de nettoyer toutes les ressources allouées et même le code compilé. A lopposée, la plupart des machines virtuelles désignent des espaces pour les objets, les données réflectives, les données temporaires et le code généré. Ceci résulte dans une fragmentation de la mémoire, des stratégies de nettoyage multiple etc. La machine virtuelle HotSpot CLDC résout ce point par lutilisation dun ramasse-miettes unique qui marque, nettoie et compacte. Lespace du code compilé peut aussi être récupéré dynamiquement pour y allouer des objets créés par lutilisateur.

28 Formation ITIN Limplantation de la VM CLDC HotSpot, le ramasse-miette Un ramasse-miettes libère automatiquement la mémoire des objets qui ne sont plus pointés pour de nouvelles allocations. La machine HotSpot de CLDC utilise un ramasse- miettes qui marque, nettoie et compacte avec pour résultat : –une allocation de mémoire plus rapide, –des pauses nettoyage courtes, –pas de fragmentation de la mémoire. Précision –Un ramasse-miettes précis mémorise tous les pointeurs au moment du nettoyage : La récupération de la mémoire des objets inaccessibles est fiable, Tous les objets peuvent être repositionnés, ce qui permet de compacter la mémoire et élimine la fragmentation. La fragmentation sur des espaces mémoire contraints peut conduire à des fuites mémoire imprévisibles. Un ramasse-miettes qui marque, nettoie et compacte –La VM HotSpot utilise une ramasse-miettes bi-générations. –Le tas des objets est divisé en génération ancienne, nouvelle génération et mémoire libre. La génération ancienne contient les objets qui ont été gardés lors du précédent nettoyage/compactage. Les nouveaux objets sont alloués dans le segment de la nouvelle génération, généralement plus petit. Le ramasse- miettes se lance quand le segment de la nouvelle génération est complet et récupère la mémoire disponible. –Quand toute la mémoire du tas est occupée, la ramasse-miettes passe sur tout le tas et compacte les objets pointés dans une « nouvelle » ancienne génération. Ce nettoyage complet induit une pause notable mais peu fréquente. Cette approche repose sur la remarque que la plupart des objets sont à vie courte. –Comme la plupart des objets sont à vie courte, seule une faible portion des objets sont promus dans lancienne génération. La plupart des passages du ramasse-miettes ne se font que sur la nouvelle génération résultant dans des pauses courtes.

29 Formation ITIN Limplémentation de la VM CLDC HotSpot de SUN Tracer les pointeurs entre générations –Les ramasse-miettes générationnels doivent garder la trace des références des générations anciennes jusquà la nouvelle génération de telle façon que les jeunes générations puissent être nettoyées sans avoir à inspecter chaque objet des anciennes générations. Lensemble de localisations contenant potentiellement de nouveaux objets est souvent appelé « remembered set ». –A chaque nouvel enregistrement, le système doit garantir que le nouvel espace est bien alloué dans le « remembered set » si un objet ancien référencie un nouvel objet. Ce mécanisme est appelé barrière décriture (write barrier). Allocation Rapide –Le compactage permet dallouer de nouveaux objets de manière contiguë comme dans une pile. Lallocation de mémoire se réduit à augmenter un pointeur.

30 Formation ITIN La VM CLDC HotSpot de SUN, la machine déxecution En général, les machines virtuelles Java à compilateur sont plus rapides que celles nutilisant quun interpréteur. Aussi la VM HotSpot CLDC comporte-t- elle un compilateur dynamique qui apporte une exécution rapide du bytecode. La compilation de bytecode en instruction native prend entre 4 et 8 fois lespace du bytecode originel. La compilation adaptative contourne ce problème en compilant uniquement les méthodes les plus utilisées : les hotspots. La VM identifie les hotspots avec un profileur statistique. Pour minimiser la quantité de code compilé, la VM HotSpot utilise un interpréteur optimisé pour les méthodes peu utilisées. Le compilateur de la VM HotSpot optimise le code en une simple passe en recourant : –au précalcul des constantes (constant folding), –la propagation des constantes, –léclatement des boucles.

31 Formation ITIN La VM CLDC HotSpot, Synchronisation rapide des threads Le langage Java offre un mécanisme de synchronisation des Threads qui permet de développer des programmes avec un verrouillage à faible granularité. La VM HotSpot utilise une variante de du mécanisme de verrouillage structuré par block. Les performances sen trouvent tellement améliorées que la synchronisation ne représente plus un goulot détranglement pour les programmes Java.

32 Formation ITIN Java Mobile Edition, CDC : Connected Device Profile

33 Formation ITIN Java Mobile Edition, CDC La configuration Connected Device Profile (CDC) cible les appareils avec plus de capacité et doté de connexion réseau comme les PDA haut de gamme, les set-top boxes avec pour objectif de se rapprocher des possibilités de Java SE en respectant les contraintes de leur ressources. La configurations CDC apporte aux différents utilisateurs de la chaîne de valeur : –Les entreprises bénéficient de lutilisation dapplications connectées pour étendre leur capacité business aux clients, partenaires et collaborateurs mobiles, –Les utilisateurs bénéficient de la compatibilité et de la sécurité apportés par la technologie Java, –Les développeurs bénéficient de la productivité de Java et de ses bibliothèque dAPI, La configuration CDC retient 3 profils différents: –la Foundation Profile (JSR 219), –Le Personal Basis Profile (JSR 217), –Le Personal Profile (JSR 216).

34 Formation ITIN A CDC Java Runtime Environment Le standard CDC offre une grande flexibilité pour le développement dapplications. Le concepteur pour PDA peut intégrer un profil, le paquetages optionnels RMI (Remote Method Invocation) et Java Database Connectivity (JDBC). Attention, des produits intégrant des différents produits CDC peuvent utiliser des API différentes bien que conforme au standard CDC. Les choix faits par le concepteur de produit déterminent les API à utiliser par le développeur dapplications CDC.

35 Formation ITIN CDC Technical Overview CDC Class Library CDC contient des librairies dérivées de Java SE mais adaptées aux appareils connectés. Les librairies incluent des classes utilisées par les développeurs dans de nombreuses applications pour PC et serveurs. Certaines interfaces ont été modifiées. CDC permet ainsi un portage rapide des applications classiques sur les mobiles. CDC HotSpot Implementation La machine virtuelle Hotspot CDC a été développée spécialement pour les appareils connectés. Survol de lAPI CDC Lexamen comparatif des différents profils disponibles Foundation Profile, Personal Basis Profile, and Personal Profile est utile pour la conception dune application CDC. Le Foundation Profile apporte un ensemble de classes de base. Les autres profils étendent le Foundation Profile avec des fonctionnalités spécifiques.

36 Formation ITIN CDC et Sécurité La sécurité est un des points essentiel de la technologie Java. Elle a guidé les évolutions de la plate-forme Java. CDC propose différents niveaux de sécurité qui apportent aux utilisateurs, aux développeurs, aux fournisseurs de services et aux entreprises un environnement particulièrement sécurisé. –La sécurité de la VM inclut la vérification des classes à lutilisation et masquent les pointeurs. Ceci a éliminé les risques de débordement de la pile. Les livraisons initiales de Java utilisaient un modèle simple de sécurité : le bac à sable, offrant une sécurité bien adaptée au browser web. –Les classes signées étendent le bac à sable en vérifiant lorigine des classes Java à charger. –Les politiques de sécurité ont été introduites dans J2SE 1.2. Elles apportent un meilleur contrôle de la sécurité. Une politique de sécurité est un ensemble de permissions et de politiques qui peuvent être modifiées par ladministrateur système au déploiement. –Le Cryptage apporte un modèle standard de codage du logiciel et des données pour sécuriser le transfert et larchivage. Il inclut Java Cryptography Architecture (JCA), un environnement standard de cryptage. CDC inclut le framework de cryptage de Java SE. Celui-ci est extensible car indépendant des algorithmes et inter opérable dans la mesure où il utilise différentes implantations de services de sécurité. Le Foundation Profile (JSR 219) intègre trois paquetages optionnels : Java Authentication and Authorization Service (JAAS). Offre un canevas dauthentification et dautorisation. Le composant dautorisation spécifie le contrôle daccès au code, aux signatures de code dans les fichiers de politique qui peuvent être maintenus par ladministrateur système. A lexécution, lenvironnement apporte différents modules tels que le stockage de clés sans avoir à modifier lapplication. Java Cryptography Extension (JCE). Étend le JCA et apporte le cryptage, la génération de clés, lautorisation de clés et les services Messages Authentication Code (MAC) Java Secure Socket Extension (JSSE). Apporte les Secure Socket Layer (SSL).

37 Formation ITIN Java ME Platform for Converged Services

38 Formation ITIN Java ME Platform for Converged Services La plate-forme Java ME Platform for Converged Services permet de faire converger Java SE sur les environnements CLDC et CDC.

39 Formation ITIN Le profil MIDP, Mobile Information Device Profile

40 Formation ITIN MIDP, Mobile Information Device Profile, pour CLDC Le Mobile Information Device Profile (MIDP) est lélément de base de la plate-forme Java (Java ME). MIDP apporte un environnement de base pour la plupart des téléphones mobiles et des PDA. MIDP a été défini par un Java Community Process regroupant plus de 50 sociétés (constructeurs, opérateurs mobiles et éditeurs). Il définit une plate-forme pour déployer dynamiquement et en toute sécurité des applications optimisées, graphiques et connectées. Ensemble, CLDC et MIDP apportent les fonctionnalités requises par les applications mobiles sous la forme dAPI standardisées. Le développeur peut facilement déployer ses applications sur différents types de terminaux. MIDP est largement adopté pour le développement dapplications sur mobiles et PDA.

41 Formation ITIN MIDP, les spécifications Le MIDP 1.0 (JSR 37) apporte les fonctionnalités centrales requises par les applications sur mobile avec interface utilisateur et sécurité réseau de base. MIDP 2.0 (JSR 118) étend MIDP 1.0 avec une interface utilisateur étendue des fonctionnalités multimédia et jeu étendues, une connectivité plus riche, le téléchargement dapplication en ligne (OTA) et une sécurité complète. MIDP 2.0 est compatible MIDP 1.0.

42 Formation ITIN Linterface utilisateur étendu de MIDP2 MIDP 2.0 apporte : –Un nouveau Popup ChoiceGroup, plus visuel, –Les objets graphiques peuvent avoir leur propre ensemble de commande. –Les écrans dalerte permettent de poser des questions à lutilisateur. Les jauges peuvent être intégrées aux écrans dalerte. –Une disposition des objets graphiques plus flexible pour une meilleure portabilité. –Une extensibilité supérieure, avec la possibilité dintégrer des objets graphiques personnalisés Custom Items, que le développeur peut utiliser pour décrire ses propres objets comme les visionneurs de cartes et autres composants dinterface utilisateur.

43 Formation ITIN Support du Multimédia de MIDP2 MIDP 2.0 intègre l Audio Building Block (ABB) qui fait partie du paquetage optionnel Mobile Media API (MMAPI). ABB permet au développeur dajouter des tonalités, des séquences de tonalités et des fichiers WAV, sans avoir à importer MMAPI. Sur les appareils intégrant MMAPI, les développeurs peuvent ajouter davantage de contenus multimédia comme des flux vidéo.

44 Formation ITIN Le support des Jeux dans MIDP2 MIDP 2.0 comprend lAPI de jeux Game qui apporte les bases au développement de jeux sur mobiles. LAPI MIDP Game comporte des fonctionnalités spécifiques au jeu comme les Sprites et les couches. Cette fonctionnalité apporte un meilleur contrôle du graphisme et des performances.

45 Formation ITIN Les capacité de connectivité de MIDP2 MIDP 2.0 apporte les connectivités au- delà de HTTP : HTTPS, Datagrammes, Sockets, serveur de Socket et communication par port série. Ces capacités de connectivité permettent une intégration standardisée avec les infrastructures familières aux développeurs Java.

46 Formation ITIN lArchitecture PUSH MIDP 2.0 intègre un modèle de serveurs Push auxquels les MIDlets peuvent senregistrer pour être activées quand le terminal reçoit des information dun serveur. Le paramétrage de lapplication est un combinaison de paramétrage par défaut du terminal et de lutilisateur pour déterminer sil faut avertir lutilisateur, démarrer lapplication automatiquement ou ne pas la démarrer quand une autre application est lancée. Larchitecture PUSH permet aux développeurs de profiter des capacité de prise en compte des événements des terminaux et des réseaux des opérateurs mobiles. Ils peuvent facilement intégrer des alertes, de la messagerie et de la diffusion (broadcast) dans le cadre dune approche standard de MIDP.

47 Formation ITIN Le téléchargement Over-the-air (OTA) Une des avancées de MIDP réside dans la capacité maintenant imposée à déployer dynamiquement des applications et leurs mises à jour Over-The-Air (OTA). La spécification MIDP 2.0 définit comment les suites de MIDlets sont découvertes, mises à jour et effacée des terminaux. MIDP permet aussi au fournisseur de service didentifier quelles suites de MIDlets fonctionnera sur un type donné de terminaux et dobtenir un rapport à la suite dinstallation, mise à jour ou de suppression. Le modèle de téléchargement OTA garantit une approche unifiée et standard de déploiement opérant sur une large gamme de terminaux. Le modèle a été défini et adopté par les principaux fabricants et éditeurs pour fournir une solution de téléchargement sure et sécurisée.

48 Formation ITIN Sécurité de bout en bout MIDP 2.0 apporte un modèle de sécurité robuste. MIDP 2.0 supporte HTTPS et profite des standards comme SSL et WTLS pour le transfert sécurisé dinformations. La sécurité protège des accès non autorisés aux données, applications et autres ressources du réseau et du terminal. Par défaut les suites de MIDlets nont aucun privilège. Pour obtenir un accès, une suite de MIDlets doit être signée par une PKI X.509. Pour quune suite signée puisse être téléchargée, installée et munie dautorisation elle doit être authentifiée avec succès.

49 Formation ITIN Les contraintes de la sécurité Il est important de protéger les utilisateurs grand public des risques dapplications malveillantes : prise de contrôle de votre téléphone, usurpation didentité et paiement par mobile. Pour des raisons de sécurité, vous ne pouvez pas faire nimporte quoi en Java ME par exemple pas de JNI.

50 Formation ITIN Les librairies de base de MIDP Interface utilisateur –javax.microedition.lcdui Lenvironnement de base dinterface utilisateur.javax.microedition.lcdui –javax.microedition.lcdui.game Facilite le développement de jeux sur mobile.javax.microedition.lcdui.game Persistence –javax.microedition.rms Un mécanisme simple et sécurisé de persistence.javax.microedition.rms Application Lifecycle Package –javax.microedition.midlet Définit linteraction entre lapplication est lenvironnementjavax.microedition.midlet Réseau –javax.microedition.io La gestion des connexions.javax.microedition.io Audio –javax.microedition.media Les outils de base pour créer un player.javax.microedition.media –javax.microedition.media.control La commande du player.javax.microedition.media.control Public Key –javax.microedition.pki Gestion des certificats utilisés en connexion sécurisée.javax.microedition.pki Core Packages –java.io Gestion des entrées sorties au travers des DataStreams..java.io –java.lang Les classes de base de Java.java.lang –java.util les collection classes, la date et le temps..java.util

51 Formation ITIN Les trucs Bien que toujours plus puissants, les mobiles nen demeurent pas moins des appareils à ressources limitées. Sur un téléphone il est préférable de limiter le nombre de classes.

52 Formation ITIN Découverte de MIDP par lexemple

53 Formation ITIN Notre application : un chat Bluetooth en mode adhoc Objectif : développer un logiciel de chat sur téléphone mobile. Les téléphones seront chacun connectés à deux autres téléphones. Les téléphones propageront les pseudos des utilisateurs connectés de telle façon que chacun puisse connaître les présents. Un message envoyé à un destinataire quelconque des connectés sera propagé de proche en proche jusquau destinataire. Un message ne peux pas être envoyé à celui qui la envoyé ou celui qui la relayé afin déviter les boucles.

54 Formation ITIN Etape 1 : création du projet HadHocChat Dans le menu « File », créez un nouveau projet –Mobile Application mobile

55 Formation ITIN Etape 1: création du projet HadHocChat Ne cochez pas la case « create HelloMidlet », Nous nous servirons du canevas fourni par cette exemple.

56 Formation ITIN Etape 1: création du projet HadHocChat renommez le paquetage « hello » en « adhoc » validez la propagation du changement renommez votre classe en « HadHocChat » validez la propagation du changement modifiez les propriétés de votre projet: –Dans Midlets, retirez la référence au projet HelloWorld, –ajoutez votre classe HadHocChat

57 Formation ITIN Etape 2 : notre première interface de saisie

58 Formation ITIN Etape 2 : écran daccueil, saisie du pseudo A laide de linterface « screen design » de Netbeans : –renommez le StringItem Hello retirez le texte remplacez le label avec notre message de bienvenue. renommez lobjet (Instance Name) par exemple « welcomeStringItem » –ajoutez une barre de séparation : Spacer –ajoutez un TextField qui sert à la saisie du pseudo, donnez un label nommez votre objet (Instance Name) –ajoutez une ItemCommand pour sauver votre pseudo. glissez votre commande sur lobjet que vous souhaitez commandez nommez cette commande –Label ex : save pseudo –Instance name ex : savePseudoCommand –testez votre application en lançant « run Project » dans la menu de votre projet

59 Formation ITIN Etape 2 : déployons notre application sur les mobiles Netbeans enregistre les fichiers de déploiement dans le dossier dist (distribution). Notre application comprend deux fichiers : –le.jad : java description, qui contient les paramètres de description de notre application accessibles dans Netbeans dans les propriétés du projet sous application descriptor, –le.jar : java archive, qui contient notre exécutable. Ce sont ces deux fichiers que vous devez charger sur votre mobile.

60 Formation ITIN La persistence en MIDP : le RecordStore

61 Formation ITIN Etape 3 : sauver le pseudo dans un RecordStore Un RecordStore consiste en un ensemble denregistrements persistants. La plate-forme garantit lintégrité des record stores des au travers des redémarrage, changements de batterie etc. Les record stores sont créés à des emplacements dépendants de la plate- forme et ne sont pas directement accessibles par les MIDlets. Lespace de nommage des record stores est contrôlé par la suite de MIDlets. Les MIDlets dune suite peuvent créer autant de record stores que nécessaire pour autant quils portent un nom différent. Quand une suite est détruite, les record stores associés le sont aussi. Les MIDlets dune même suite peuvent accéder directement aux record stores créés par les MIDlet de la même suite. Pour des raisons évidentes de sécurité, une MIDlet ne peut accéder au record stores dautres suites que si celles-ci lont explicitement autorisé. Un record store possède un nom unique donné par le nom de la suite et le nom donné explicitement dans le programme. Une suite est identifiée par le nom de léditeur et les attributs de nommage de la MIDlet définis dans le descripteur de lapplication.

62 Formation ITIN Etape 3 : sauver le pseudo dans un RecordStore Le contrôle daccès dun record store est défini à sa création. Il est vérifié à louverture du record store. Le mode daccès permet une utilisation privée ou partagée avec les MIDlet dautres suites. La taille des noms des record stores va de 1 à 32. Ils différencient minuscules et majuscules. Il ne peut pas y avoir deux record store de même nom au sein de la même suite. Deux record stores de même nom dans deux suites différentes sont différents. RecordStore est un modèle simpliste de persistance. –Il stocke des tableaux doctets. –Il ne possède pas de mécanisme de verrouillage. Si dans votre MIDlet plusieurs thread accèdent à la même donnée, il est de votre ressort den assurer lintégrité. Vous pouvez réserver une partie de votre champ pour placer les informations de verrouillage qui vous sont nécessaires.

63 Formation ITIN Etape 3 : créer un RecordStore /* la création et/ou louverture la plus simple consiste à utiliser RecordStore.openRecordStore(« monRecordStore », true ) ce recordStore nest pas partagé avec dautres suites.*/ openRecordStore public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) throws RecordStoreException, RecordStoreFullException, RecordStoreNotFoundExceptionRecordStoreStringRecordStoreExceptionRecordStoreFullException RecordStoreNotFoundException –Open (and possibly create) a record store associated with the given MIDlet suite. If this method is called by a MIDlet when the record store is already open by a MIDlet in the MIDlet suite, this method returns a reference to the same RecordStore object. –Parameters: recordStoreName - the MIDlet suite unique name for the record store, consisting of between one and 32 Unicode characters inclusive. createIfNecessary - if true, the record store will be created if necessary –Returns: RecordStore object for the record store –Throws: RecordStoreException - if a record store-related exception occurredRecordStoreException RecordStoreNotFoundException - if the record store could not be foundRecordStoreNotFoundException RecordStoreFullException - if the operation cannot be completed because the record store is fullRecordStoreFullException IllegalArgumentException - if recordStoreName is invalidIllegalArgumentException

64 Formation ITIN Etape 3 : créer un RecordStore /*Enrichit le précédent. –si authmode == AUTHMODE_PRIVATE, le record store est visible uniquement au sein de la même suite –si authmode == AUTHMODE_ANY, le record store est visible par des MIDlet dautres suites. –si writable == true, les MIDlets dautres suites peuvent aussi modifier le record store.*/ openRecordStore public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary, int authmode, boolean writable) throws RecordStoreException, RecordStoreFullException, RecordStoreNotFoundExceptionRecordStoreString RecordStoreExceptionRecordStoreFullException RecordStoreNotFoundException –Returns: RecordStore object for the record store –Throws: RecordStoreException - if a record store-related exception occurredRecordStoreException RecordStoreNotFoundException - if the record store could not be foundRecordStoreNotFoundException RecordStoreFullException - if the operation cannot be completed because the record store is fullRecordStoreFullException IllegalArgumentException - if authmode or recordStoreName is invalidIllegalArgumentException –Since: MIDP 2.0

65 Formation ITIN Etape 3 : créer un RecordStore /*Enrichit le précédent. –Permet douvrir un record store créé par une MIDlet dune autre suite. –Si une MIDlet de la même suite a déjà ouvert le record store, les deux MIDlets se partagent le même objet Java. –.*/ openRecordStore public static RecordStore openRecordStore(String recordStoreName, String vendorName, String suiteName) throws RecordStoreException, RecordStoreNotFoundExceptionRecordStoreString RecordStoreExceptionRecordStoreNotFoundException –Parameters: recordStoreName - the MIDlet suite unique name for the record store, consisting of between one and 32 Unicode characters inclusive. vendorName - the vendor of the owning MIDlet suite suiteName - the name of the MIDlet suite –Returns: RecordStore object for the record store –Throws: RecordStoreException - if a record store-related exception occurredRecordStoreException RecordStoreNotFoundException - if the record store could not be foundRecordStoreNotFoundException SecurityException - if this MIDlet Suite is not allowed to open the specified RecordStore.SecurityException IllegalArgumentException - if recordStoreName is invalidIllegalArgumentException –Since: MIDP 2.0

66 Formation ITIN Etape 3 : créer un enregistrement Un record store enregistre des tableaux doctets ex : –monRecordStore.addRecord(« maChaîne ».getBytes(),0, « maChaîne ».length) addRecord public int addRecord(byte[] data, int offset, int numBytes) throws RecordStoreNotOpenException, RecordStoreException, RecordStoreFullException RecordStoreNotOpenExceptionRecordStoreException RecordStoreFullException –Adds a new record to the record store. The recordId for this new record is returned. This is a blocking atomic operation. The record is written to persistent storage before the method returns. –Parameters: data - the data to be stored in this record. If the record is to have zero-length data (no data), this parameter may be null. offset - the index into the data buffer of the first relevant byte for this record numBytes - the number of bytes of the data buffer to use for this record (may be zero) –Returns: the recordId for the new record –Throws: RecordStoreNotOpenException - if the record store is not openRecordStoreNotOpenException RecordStoreException - if a different record store-related exception occurredRecordStoreException RecordStoreFullException - if the operation cannot be completed because the record store has no more roomRecordStoreFullException SecurityException - if the MIDlet has read-only access to the RecordStoreSecurityException

67 Formation ITIN Etape 3 : lire un enregistrement On accède à un enregistrement en indiquant sont index dans le record store. Le premier enregistrement est à lindex 1 : –byte[] enregistrement = monRecordStore.getRecord(1); accède au premier enregistrement de mon record store Il est possible de définir les octets auxquels on souhaite accéder ex : –byte[] enregistrement = monRecordStore.getRecord(1,0,1); accède au premier octet dun enregistrement dans lequel on peut mettre une indication de verrouillage par exemple.

68 Formation ITIN Etape 3 : modifier un enregistrement pour modifier un enregistrement donné dans un record store, on spécifie son index et on modifie les octets voulus : –byte[] bytes = monRecordStore. getRecord (1); bytes[0] = byte(1); monRecordStore.setRecord(1,bytes,0,bytes.length(); Cet exemple permet par exemple dindiquer que cet enregistrement est verrouillé.

69 Formation ITIN Etape 3 : lire le pseudo précédemment enregistré Au lancement de notre application nous récupérons le pseudo enregistré précédemment. Cette opération peut se faire dans la méthode initialize() après la création de la page daccueil. On peut créer une variable globale (pseudoStore) pour le recordStore et pour une variable autre pour le pseudo (pseudo).

70 Formation ITIN Etape 3 : lire le pseudo précédemment enregistré private void initialize() { // Insert pre-init code here try { pseudoStore = RecordStore.openRecordStore(pseudoStoreName,true); // sort en exception si pas de denregistrement byte[] pseudoBytes = pseudoStore.getRecord(1); if(pseudoBytes != null){ pseudo = new String(pseudoBytes); } } catch (RecordStoreException ex) { ex.printStackTrace(); } getDisplay().setCurrent(get_helloForm()); // Insert post-init code here if(pseudo != null){ TextField pcf = get_pseudoCaptureField(); pcf.setString(pseudo); }

71 Formation ITIN Etape 3 : sauvegarder un nouveau pseudo la sauvegarde du nouveau pseudo se fera dans la méthode commandAction(Command command, Item item).

72 Formation ITIN Etape 3 : sauvegarder un nouveau pseudo public void commandAction(Command command, Item item) { if (item == pseudoCaptureField) { if (command == savePseudoCommand) { try { // get the pseudo from the pseudoCaptureField pseudo = pseudoCaptureField.getString(); // record the new pseudo in the pseudo recordStore if(pseudoStore.getNumRecords() == 0){ pseudoStore.addRecord(pseudo.getBytes(),0,pseudo.length()); } else { pseudoStore.setRecord(1,pseudo.getBytes(),0,pseudo.length()); } } catch (RecordStoreNotOpenException ex) { ex.printStackTrace(); } catch (InvalidRecordIDException ex) { ex.printStackTrace(); } catch (RecordStoreException ex) { ex.printStackTrace(); }

73 Formation ITIN Etape 3 : testez Lancez votre application dans le simulateur, enregistrez votre pseudo. arrêtez lapplication, relancez-la, votre pseudo doit apparaître

74 Formation ITIN RecordStore : les autres méthodes void addRecordListener(RecordListener listener) ajoute un listener qui sera averti des modifications du record store. addRecordListenerRecordListener void closeRecordStore() appelé à la fermeture de la MIDletcloseRecordStore void deleteRecord(int recordId) efface une enregistrement à un index donnédeleteRecord static void deleteRecordStore(String recordStoreName) détruit le recordStore dun nom donnédeleteRecordStoreString RecordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keepUpdated) monte en mémoire les enregistrements du recordStore dans un RecordEnumeratorRecordEnumerationenumerateRecordsRecordFilter RecordComparator long getLastModified() donne linstant de la dernière modification en millisecondes getLastModified String getName() le nom de ce RecordStore. StringgetName int getNextRecordID() donne lindex du prochain enregistrementgetNextRecordID int getNumRecords() le nombre denregistrements. getNumRecords

75 Formation ITIN RecordStore : les autres méthodes byte[]getRecord(int recordId) retourne lenregistrement à un index donnégetRecord int getRecord(int recordId, byte[] buffer, int offset) getRecord int getRecordSize(int recordId) retourne la taille dun enregistrementgetRecordSize int getSize() retourne la taille occupé par le recordStore en octetsgetSize int getSizeAvailable() la taille disponible en octetsgetSizeAvailable int getVersion() la version du recordstore (incrémenté à chaque modification)getVersion static String[] listRecordStores() tableau des noms de tous les RecordStores accessibles par la MIDlet.StringlistRecordStores

76 Formation ITIN RecordStore : les autres méthodes void removeRecordListener(RecordListener listener) déconnecte un listener removeRecordListenerRecordListener void setMode(int authmode, boolean writable) change le mode daccès à ce recordstoresetMode void setRecord(int recordId, byte[] newData, int offset, int numBytes) modifie les données dun enregistrement donné.setRecord

77 Formation ITIN Etape 4 : le splash screen Créez un splash screen avec limage de votre choix. Affichez ce splash screen au lancement de lapplication. Attention le générateur décran peut créer des erreurs…

78 Formation ITIN JavaTM APIs for BluetoothTM Wireless Technology (JSR 82) LAPI Bluetooth de MIDP 2 correspond au JSR 82. Vérifiez que votre téléphone est compatible JSR 82.

79 Formation ITIN Etape 5 : Bluetooth Rechercher les téléphones accessibles en Bluetooth. Récupérer les pseudo de tous les téléphones connecté sur notre réseau adhoc, placer les pseudos dans une liste

80 Formation ITIN Architecture de notre application Chat Midlet Bluetooth Client Bluetooth Server Chat Midlet Bluetooth Client Bluetooth Server Chat Midlet Bluetooth Client Bluetooth Server send message send message Chat Midlet Bluetooth Client Bluetooth Server Chat Midlet Bluetooth Client Bluetooth Server Hello

81 Formation ITIN Introduction à Bluetooth La pile du protocole Bluetooth La couche radio : la couche physique dans la bande des 2.4 GHz sur 79 canaux de 1 MHz. Le protocole permet de passer dun canal à lautre, jusquà 1600 fois par seconde. La portée varie de 10cm à 10m voire plus en augmentant la puissance. La couche de bande de base : responsable du contrôle et de lémission de paquets sur le lien radio. Le transport de la voix est en mode synchrone SCO (Synchronous Connection Oriented), celui de la donnée en mode asynchrone ACL (Asynchronous ConnectionLess). Les liaisons SCO sont des connections symétriques point à point. Les liaisons ACL sont établis sur la base dallocation de fenêtre et peuvent être point à multipoint. Le Protocole de Gestion de Liaison utilise les liaisons établies par la couche de bande de base pour établir les connections et gérer les pico-réseaux. Il gère lauthentification, la sécurité des services et la qualité de service. Linterface de contrôle de la plate-forme sépare logiciel et matériel. Les couches supérieures sont généralement logicielles, les couches inférieure matérielles. Cette couche est optionnelle. Le protocole de commande et dadaptation de la liaison logique reçoit les données applicatives et les formate au standard Bluetooth. Les paramètres de Qualité de Service sont échangés à ce niveau.

82 Formation ITIN Java ME et Bluetooth Le JSR 82 définit un standard non propriétaire pour le développement dapplication Java utilisant Bluetooth. Il masque la complexité de la pile Bluetooth. Le JSR 82 consiste en deux paquetages optionnels : –lAPI Bluetooth de base –et lAPI Object Exchange (OBEX) indépendant de la couche transport il peut être utilisé sans la couche Bluetooth.

83 Formation ITIN Les pré requis de lutilisation de Bluetooth La plate-forme doit être qualifiée par le Bluetooth Qualification Program et inclure au minimum : –Generic Access Profile, –Service Discovery Application Profile –et Serial Port Profile. Les API du constructeur doivent pouvoir accéder au : –Service Discovery Protocol (SDP), –Radio Frequency Communications Protocol (RFCOMM) –et au Logical Link Control and Adaptation Protocol (L2CAP). Le système doit comporter un panneau de contrôle Bluetooth :Bluetooth Control Center (BCC).

84 Formation ITIN Les paquetages Bluetooth Les API Bluetooth Java définissent deux paquetages positionné au niveau du paquetage CLDC javax.microedition.io : –javax.bluetooth: core Bluetooth API –javax.obex: APIs pour le protocole Object Exchange (OBEX) Une implémentation CLDC peut comprendre lune ou lautre des APIs ou les deux.

85 Formation ITIN Utilisation de Bluetooth Une application Bluetooth peut être ou cliente ou serveur et peut se comporter en pur peer to peer. Une application Bluetooth tombe dans une des trois catégories dusage: Initialisation – Toute application doit initialiser la pile Bluetooth. Client – Un client consomme des services distants. Il commence par découvrir les appareils à sa portée pour les services qui Serveur – Un serveur met des services à disposition des clients. Il les enregistre dans une base de données de découverte de services. Il attend ensuite les connexions et sert ses clients.

86 Formation ITIN Diagramme dactivité Bluetooth Client et serveur comment par initialiser la pile Bluetooth. Le serveur prépare les services et attend les connexions. Le client découvre les appareils Bluetooth et se connecte un appareil donné pour accéder à un service.

87 Formation ITIN Linitialisation Bluetooth Lapplication récupère une référence sur le manager Bluetooth sur lhôte. Lapplication cliente récupère une référence sur lagent de découverte (Discovery Agent) qui fournit tous les services de découverte. Lapplication serveur rend lappareil découvrable. Dans le code suivant la méthode dinitialisation btInit() fait une initialisation pour le client et le serveur :... private LocalDevice localDevice; // local Bluetooth Manager private DiscoveryAgent discoveryAgent; // discovery agent... /** * Initialize */ public void btInit() throws BluetoothStateException { localDevice = null; discoveryAgent = null; // Retrieve the local device to get to the Bluetooth Manager localDevice = LocalDevice.getLocalDevice(); // Servers set the discoverable mode to GIAC localDevice.setDiscoverable(DiscoveryAgent.GIAC); // Clients retrieve the discovery agent discoveryAgent = localDevice.getDiscoveryAgent(); }...

88 Formation ITIN Linitialisation Bluetooth Toutes les applications ne sont pas serveur et client en même temps. Leur rôle dépend des besoins de votre application. Les applications serveur se déclarent découvrable tandis que les applications clientes récupèrent une référence auprès du « Discovery Agent » pour le service de découverte. En déclarant un appareil découvrable, par lappel de LocalDevice.setDiscoverable(), il faut spécifier le code de requête daccès (inquiry access code, IAC). JABWT supporte deux modes daccès : –DiscoveryAgent.LIAC définit le Limited Inquiry Access Code. Le service sera découvrable pour durée limitée de temps, généralement 1mn. Ensuite lappareil se met en mode non découvrable. –DiscoveryAgent.GIAC définit le General Inquiry Access Code. Il ny a pas de limite de durée du mode découvrable.

89 Formation ITIN CAVEAT Pour replacer un appareil en mode discret, il suffit dappeler LocalDevice.setDiscoverable(DiscoveryAgent.NOT_DISCOVERABLE) Note: Au dessous, le Centre de Commande Bluetooth (BCC) sert dautorité pour tous les paramétrages. Le BCC permet à lutilisateur de prendre la main sur les mode de découverte et les autres paramétrages. Le BCC permet aussi dempêcher que des applications en affecte dautres. Par simplicité dans notre application nous utiliserons le mode GIAC. Cependant, dès quun appareil est découvrable, il est visible par tous les autres appareils Bluetooth et donc non protégé contre les attaques. Aussi, bien que le GIAC soit le mode le plus utilisé, il sera préférable dans vos applications professionnelles dutiliser le mode LIAC.

90 Formation ITIN Le serveur Bluetooth

91 Formation ITIN Créer un serveur Bluetooth La création dun serveur Bluetooth se fait en 4 étapes: –Créer le service à distribuer, –Ajouter le nouvel enregistrement de service à la base de données du service de découverte (SDDB), –Enregistrer le service, attendre la connexion de clients, –Traiter les demandes Deux opérations sont également importantes : –Modifier un enregistrement de service si les attributs de ce service ont été changés, –Retirer un enregistrement de service de la base de données du service de découverte (SDDB).

92 Formation ITIN Créer un enregistrement de service Limplantation Bluetooth crée automatiquement un enregistrement de service quand lapplication crée un notifiant de connexion : un StreamConnectionNotifier ou un L2CAPConnectionNotifier. Chaque service Bluetooth et attribut de service possède son propre UUID (Identifiant Unversel Unique) sur 16, 32 ou 128 bits.... // Bluetooth Service name private static final String myServiceName = "MyBtService"; // Bluetooth Service UUID of interest private static final String myServiceUUID = "2d fb47c28d9f10b8ec891363"; private UUID MYSERVICEUUID_UUID = new UUID(myServiceUUID, false);... // Define the server connection URL String connURL = "btspp://localhost:"+MYSERVICEUUID_UUID.toString()+";name="+myServ iceName;... // Create a server connection (a notifier) StreamConnectionNotifier scn = (StreamConnectionNotifier) Connector.open(connURL);...

93 Formation ITIN Création de UUID –uuidgen –t (Linux) –uuidgen (dans le SDK de Windows) génèrent des UUID retirer les caractères non numériques

94 Formation ITIN Enregistrer le service, attendre les connexions Une fois le notifiant de connexion et lenregistrement de service créés, le serveur est prêt pour enregistrer le service et en attente pour les clients. Linvocation de la méthode acceptAndOpen() du notifiant fait insérer lenregistrement de service pour la connexion associé dans le SDDB, rendant le service visible. La méthode bloque et se met ensuite en attente de clients entrants. Ici on lit une chaîne de caractère… cest un chat. // Insert service record into SDDB and wait for an incoming client StreamConnection sc = scn.acceptAndOpen();... // New client connection accepted; get a handle on it RemoteDevice rd = RemoteDevice.getRemoteDevice(conn); System.out.println("New client connection... " + rd.getFriendlyName(false)); // Read input message, in this example a String DataInputStream dataIn = conn.openDataInputStream(); String s = dataIn.readUTF(); // Pass received message to incoming message listener...

95 Formation ITIN Mise à jour de lenregistrement de service Dans certains cas, il faut modifier les attributs dun enregistrement de service. Le Bluetooth Manager permet de modifier les enregistrement dans le SDDB. Un enregistrement se récupère par lappel de LocalDevice.getRecord(). La modification se fait par lappel de ServiceRecord.setAttributeValue(), Lenregistrement dans le SDDB par LocalDevice.updateRecord().... try { // Retrieve service record and set/update optional attributes, // for example, ServiceAvailability, indicating service is available sr = localDevice.getRecord(streamConnectionNotifier); sr.setAttributeValue(SDP_SERVICEAVAILABILITY, new DataElement(DataElement.U_INT_1, 0xFF)); localDevice.updateRecord(sr); } catch (IOException ioe) { // Catch exception, display error }...

96 Formation ITIN Clôturer une connection, retirer un enregistrement de service Quand un service est obsolète, il est retiré du SDDB en clôturant le notifiant de connexion.... streamConnectionNotifier.close();...

97 Formation ITIN Logical Link Control and Adaptation Protocol (L2CAP) L2CAP est le protocole utilisé dans MIDP. LAPI fonctionne en mode connecté. Un L2CAPConnectionNotifier notifie le serveur quand une client initie une connexion. Quand la connexion est établie elle retourne un objet L2CAPConnection. Linterface L2CAPConnection et L2CAPConnectionNotifier étendent linterface Connection. Cette interface L2CAPConnection peut être utilisée pour envoyer des données et en recevoir dun appareil distant en utilisant le protocole L2CAP.

98 Formation ITIN Le client Bluetooth

99 Formation ITIN Découvrir les appareils et les services Pour accéder à un service, un client doit le trouver. Le cycle de recherche consiste à : –découvrir les appareils voisins, –ensuite pour chaque appareil trouvé rechercher les services qui lintéressent, La recherche dappareils coûte cher et prend du temps. Le client peut éviter cet effort sil connaît déjà ses voisins et leur services. Il ne fait alors une recherche que sil ne connaît pas un voisin.

100 Formation ITIN Découvrir les appareils et les services La découverte est de la responsabilité du DiscoveryAgent. Cette classe permet au client dinitier et dannuler la découverte des appareils et des services. Le DiscoveryAgent notifie lapplication cliente des appareils et services découverts au travers du DiscoveryListener.

101 Formation ITIN Découvrir les appareils et les services Pour retrouver des terminaux précédemment connus ou en cache le client demande au DiscoveryAgent dappeler retrieveDevices(). RemoteDevice[] retrieveDevices(int option);...où option est soit : –DiscoveryAgent.CACHED pour les terminaux précédemment découverts, –DiscoveryAgent.PREKNOWN pour les terminaux déjà connus, Le client initie un cycle de découverte par lappel de startInquiry(): boolean startInquiry(int accessCode, DiscoveryListener listener);...où accessCode est : –soit DiscoveryAgent.LIAC –ou DiscoveryAgent.GIAC, comme nous lavons vu pour le serveur listener est un objet dont la classe implante linterface DiscoveryListener. (slide suivante)

102 Formation ITIN Découvrir les appareils et les services Pour recevoir les notifications du DiscoveryAgent, lapplication cliente doit implanter linterface DiscoveryListener et les méthodes rattachées: –deviceDiscovered(), reçu par labonné quand un nouveau serveur est découvert. –inquiryCompleted(), reçu par labonné quand le DiscoveryAgent a fini dinterroger les terminaux à sa portée –servicesDiscovered(), reçu par labonné quand le DiscoveryAgent a découvert un service –serviceSearchCompleted(). reçu par labonné quand le DiscoveryAgent a fini dinterroger les serveurs sur les services disponibles.

103 Formation ITIN Notre exemple

104 Formation ITIN Linterface IBlueChat package hadhoc; import javax.bluetooth.UUID; /** * stores the UUID used by both BluetoothServer and BluetoothClient. * Both BluetoothServer and BluetoothClient should implement IBlueChat interface Hugues Sansen */ public interface IBlueChat { /** The standard L2CAPP UUID, used by our application to reduce the scope of the search to server that support L2CAPP protocole*/ static UUID L2CAPUUID = new UUID(0x0100); /** Supposed to be a uuidgen generated UUID to have a UUID deployed uniquely in our * application. * This facilitates the scope of the service search */ static UUID BLUECHATUUID = new UUID(" d a1b121d1e1f100",false); }

105 Formation ITIN BluetoothServer package hadhoc; import java.io.IOException; import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.L2CAPConnection; import javax.bluetooth.L2CAPConnectionNotifier; import javax.bluetooth.LocalDevice; import javax.microedition.io.Connector; import javax.microedition.midlet.MIDlet; /** * This is a simple Bluetooth adhoc L2CAP server. Receives messages from remote devices. Send them to the midlet if the device is the recipient or tho the local Bluetooth client if messages are to be relayed Hugues Sansen */ public class BluetoothServer implements IBlueChat, Runnable{ private LocalDevice localDevice; private DiscoveryAgent discoveryAgent; private String deviceName; private L2CAPConnection connection; private HadHocChat hadhocChat; private BluetoothClient btClient;

106 Formation ITIN BluetoothServer, suite /** Creates a new instance of BuetoothServer btClient The local Bluetooth server that is called by the * server to relay messages hadhocChat The hadhocChat midlet that uses the Bluetooth *server */ public BluetoothServer(HadHocChat hadhocChat, BluetoothClient btClient) { this.hadhocChat = hadhocChat; this.btClient = btClient; } /** initialize the Bluetooth stack javax.bluetooth.BluetoothStateException when Bluetooth stack * doesn't initialize correctly */ public void initialize() throws BluetoothStateException{ System.out.println("Starting server - please wait..."); localDevice = LocalDevice.getLocalDevice(); DiscoveryAgent discoveryAgent = localDevice.getDiscoveryAgent(); localDevice.setDiscoverable(DiscoveryAgent.LIAC); Thread t = new Thread(this); t.start(); }

107 Formation ITIN BluetoothServer, suite /** run the server listening task Runnable#run */ public void run(){ try { String service_UUID = BLUECHATUUID.toString(); deviceName = localDevice.getFriendlyName(); //this is a L2CAP url String url = "btl2cap://localhost:" + service_UUID + ";name=hadHocChatServer" ; L2CAPConnectionNotifier notifier = (L2CAPConnectionNotifier)Connector.open(url); connection = notifier.acceptAndOpen(); while (true) { if (connection.ready()){ byte[] b = new byte[1000]; connection.receive(b); String message = new String(b, 0, b.length); treatMessage(message.trim()); } } catch(BluetoothStateException e){ System.out.println(e); } catch(IOException f){ System.out.println(f); }

108 Formation ITIN BluetoothServer, suite /** * Check if the message is for the device, if true do not relay the message * Check if the device has already relayed the message, if true do not relay the message * otherwise, add the deviceName in the relayList, send the message to be relayed by the client */ private void treatMessage(String message){ int indexOfTo = message.indexOf(";to:",0); if(message.startsWith(hadhocChat.getPseudo(),indexOfTo+ 4)){ //send the message to the midlet for displaying // the message should be cleaned of relays and formated for nice display hadhocChat.displayMessage(message); } else if( message.substring(0,indexOfTo).indexOf(deviceName)> 0){ //the device has already relayed the message } else{ // we relay the message //we add the deviceName in the relayList StringBuffer newMessage =new StringBuffer(); newMessage.append(message.substring(0,indexOfTo)); newMessage.append(';'); newMessage.append(deviceName); newMessage.append(message.substring(indexOfTo,message.length())); btClient.relayMessage(newMessage.toString()); }

109 Formation ITIN BluetoothClient package hadhoc; import java.io.IOException; import java.util.Vector; import javax.bluetooth.BluetoothStateException; import javax.bluetooth.DeviceClass; import javax.bluetooth.DiscoveryAgent; import javax.bluetooth.DiscoveryListener; import javax.bluetooth.L2CAPConnection; import javax.bluetooth.LocalDevice; import javax.bluetooth.RemoteDevice; import javax.bluetooth.ServiceRecord; import javax.bluetooth.UUID; import javax.microedition.io.Connector; /** A Bluetooth L2CAP client that is used to connect to remote Blutooth devices Hugues Sansen * This is a simple client for a peer to peer adhoc bluetooth client */ public class BluetoothClient implements IBlueChat, DiscoveryListener, Runnable { private LocalDevice localDevice; // local Bluetooth Manager private DiscoveryAgent discoveryAgent; // discovery agent private HadHocChat hadHocChat; /** Keeps track of the devices found during an inquiry.*/ private Vector deviceList; /* The list of all the peer services */ private Vector peerServices; /** Creates a new instance of BluetoothScanner */ public BluetoothClient(HadHocChat hadHocChat) { this.hadHocChat = hadHocChat; }

110 Formation ITIN BluetoothClient, suite /** initialize the Bluetooth stack javax.bluetooth.BluetoothStateException throws exception when the Bluetooth stack * doen't initialize*/ public void initialize() throws BluetoothStateException { localDevice = null; discoveryAgent = null; // Retrieve the local device to get to the Bluetooth Manager localDevice = LocalDevice.getLocalDevice(); // Clients retrieve the discovery agent discoveryAgent = localDevice.getDiscoveryAgent(); // Get the max number of devices the system can support try{ maxServiceSearches = Integer.parseInt( LocalDevice.getProperty("bluetooth.sd.trans.max")); } catch (NumberFormatException e) { System.out.println("General Application Error"); System.out.println("\tNumberFormatException: " + e.getMessage()); } scanServices(); } return buffer.toString(); }

111 Formation ITIN BluetoothClient, suite /** * called each time we need to scan the remote BluetoothServers. * Should be called before sending a message to update the visible BluetoothServers list. */ public void scanServices(){ Thread t = new Thread(this); t.start(); }

112 Formation ITIN BluetoothClient, suite /** scan the devices available in Bluetooth. We make it simple : we should look for the CACHED devices and the PREKNOWN devices first */ public void run() { RemoteDevice[] devList; //initialize the list of devices each time we do a scan deviceList = new Vector(); /* We make it simple although not efficient. We should look for the CHACHED devices first then the PREKNOWN * before discovering all the devices by brute force. Start an inquiry to find a server */ try { discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this); /* When a device is found, discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this) calls deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) * Wait until all the devices are found before trying to start the service search. * We get a notify from the inquiryCompleted() */ synchronized (this) { try { this.wait(); } catch (Exception e) { } } } catch (BluetoothStateException e) { System.out.println("Unable to find devices to search"); } if (deviceList.size() > 0) { devList = new RemoteDevice[deviceList.size()]; deviceList.copyInto(devList); if (searchPeerServices(devList)) { }

113 Formation ITIN BluetoothClient, suite private boolean searchPeerServices(RemoteDevice[] remoteDeviceList){ /* The search list contains a set of UUID that all servers must implement */ UUID[] searchList = new UUID[2]; /* Add the UUID for L2CAP to make sure that the service record * found will support L2CAP. This value is defined in the * Bluetooth Assigned Numbers document. */ searchList[0] = L2CAPUUID; /*Add the UUID for our chat servers that we are going to use to the list of UUIDs to *search for. */ searchList[1] = BLUECHATUUID; /* Start a search on as many devices as the system can support.*/ for (int i = 0; i < remoteDeviceList.length; i++) { try { int trans = discoveryAgent.searchServices(null, searchList, remoteDeviceList[i], this); } catch (BluetoothStateException e) { } synchronized (this) { //we should limit the search to the max number of services the system can handle try { this.wait(); } catch (Exception e) { } return false; }

114 Formation ITIN BluetoothClient, suite /** called when a new Bluetooth server is discovered remoteDevice deviceClass DiscoveryListener#deviceDiscovered * this method is called by discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this) each time the inquiry finds a new device. * we add the discovered device to the deviceList */ public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) { /* Check the class of device */ int major = deviceClass.getMajorDeviceClass(); if( ! deviceList.contains( remoteDevice ) ){ deviceList.addElement( remoteDevice ); } /** called when a new service is discovered DiscoveryListener#servicesDiscovered * called when a new service has been discovered * add all the services found to the peerServices list. * It is up to you to make it smarter... transID serviceRecord */ public void servicesDiscovered(int transID, ServiceRecord[] serviceRecord) { for(int i = 0; i< serviceRecord.length;i++){ peerServices.addElement(serviceRecord[i]); }

115 Formation ITIN BluetoothClient, suite /** * implement DiscoveryListener i i0 */ public void serviceSearchCompleted(int i, int i0) { // notify threads that are waiting on this synchronized (this) { this.notifyAll(); } /** * implement DiscoveryListener * this method is called by discoveryAgent.startInquiry(DiscoveryAgent.GIAC, this) is completed. * When the inquiry is completed, notifies the waiting threads on this. i */ public void inquiryCompleted(int i) { synchronized (this) { try { this.notifyAll(); } catch (Exception e) { }

116 Formation ITIN BluetoothClient, suite /** * send a non formated message to a recepient through all connected peers * used when the client initiates a message from to timeStamp body */ public void sendMessage(String from, String to, String timeStamp, String body){ String message = formatMessage(from, to, timeStamp, body); relayMessage(message); }

117 Formation ITIN BluetoothClient, suite /** * send a formated message to a recepient through all connected peers * used to relay a massage to other peers * relay messages to remote devices message the message to be relayed */ public void relayMessage(String message){ for(int i = 0; i< peerServices.size(); i++){ ServiceRecord peerService = (ServiceRecord) peerServices.elementAt(i); String url = peerService.getConnectionURL( ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false); int index= url.indexOf(':'); String protocol= url.substring(0, index); // we check if the protocole is "btl2cap" if (protocol.equals("btl2cap")) { L2CAPConnection connection; try { connection = (L2CAPConnection) Connector.open(url); connection.send(message.getBytes()); } catch (IOException ex) { ex.printStackTrace(); } }

118 Formation ITIN BluetoothClient, suite /** * format a simple message * a better version could be XML from to timeStamp body */ public String formatMessage(String from, String to, String timeStamp, String body){ StringBuffer buffer = new StringBuffer(); buffer.append("timeStamp"); buffer.append(timeStamp); buffer.append(";from:"); buffer.append(from); buffer.append(";to:"); buffer.append(to); buffer.append(";body:"); return buffer.toString(); }

119 Formation ITIN Etape 5, suite Terminez lapplication pour : –quun destinataire envoie un acquittement de réception, –envoyer un message à tous, –découvrir tous les terminaux accessibles au travers du réseau adhoc. –visualisez les pseudos dans une liste,

120 Formation ITIN La 3D en Java Mobile

121 Formation ITIN Etape 6 Ajoutez une fenêtre à votre application pour visualiser le réseau adhoc en 3D


Télécharger ppt "Hankaa S. Formation ITIN Java mobile Hugues Sansen."

Présentations similaires


Annonces Google