Rapport de Projet de Fin d Année Master en systèmes et réseaux



Documents pareils
TP SIN Programmation sur androïde Support : eclipse

Créer des applications Android

TP au menu «UI ANDROID»

Développement sous Android

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Warren PAULUS. Android SDK et Android x86

Programmation des applications mobiles avec Android. 1 Inspiré du cours de Olivier Le Goaer

SOMMAIRE

Programmation Mobile Android Master CCI

1.3 Gestion d'une application

Programmer en JAVA. par Tama

Tutorial pour une application simple

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

De Java à Android version 0.1

TD/TP 1 Introduction au SDK d Android

Bases Java - Eclipse / Netbeans

Projet Android (LI260) Cours 2

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Android en action. Abdelkader Lahmadi Université de Lorraine

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

TP1 : Initiation à Java et Eclipse

Remote Method Invocation (RMI)

Cartographie et audit du réseau GSM avec des outils Open Source

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Initiation à JAVA et à la programmation objet.

Android et le Cloud Computing

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

[Projet S9] Rédacteurs & Contributeurs Entité Rédacteurs Contributeurs Imededdine HOSNI Olivier MARTY. Validation du document Nom Date Visa

Installation et prise en main

Généralités sur le Langage Java et éléments syntaxiques.

Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction

Maîtriser le menu contextuel dans un OfficeBean

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

TP1. Outils Java Eléments de correction

Java Licence professionnelle CISII,

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Programmation par les Objets en Java

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Les fondamentaux du développement d applications Java

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Education Delivery Intelligent Tool

Tutoriel Android. Pour démarrer la programmation d'applications Android

FORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères

BIRT (Business Intelligence and Reporting Tools)

Auto-évaluation Programmation en Java

Premiers Pas en Programmation Objet : les Classes et les Objets

ACTIVITÉ DE PROGRAMMATION

La base de données XML exist. A. Belaïd

Environnements de développement (intégrés)

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

ECLIPSE ET PDT (Php development tools)

7 Développement d une application de MapReduce

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

1. Installation d'un serveur d'application JBoss:

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Héritage presque multiple en Java (1/2)

Développement web et mobile

Android 4 Les fondamentaux du développement d'applications Java

Remote Method Invocation Les classes implémentant Serializable

DÉVELOPPEMENT ANDROID

SECURIDAY 2013 Cyber War

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Construire des plug-ins pour SAS Management Console SAS 9.1

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Projet de programmation (IK3) : TP n 1 Correction

Documentation CAS à destination des éditeurs

as Architecture des Systèmes d Information

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Tutoriel d installation de Hibernate avec Eclipse

Développement sous Android

Module Architecture des systèmes mobiles : Android première partie Didier FERMENT - UPJV

Notes de cours Practical BigData

Un ordonnanceur stupide

Cours 1: Java et les objets

Programmation Android L3 informatique

Plan du cours. Historique du langage Nouveautés de Java 7

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

APPLICATIONS JAVA. 1. Android. Développement d'activités Java sous Android. Android Partie I. L'architecture du système Android. Application Android

Projet de développement

Introduction à Eclipse

Développement Android. J.-F. Couchot

TP2 : Client d une BDD SqlServer

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Chapitre 2. Classes et objets

Corrigé des exercices sur les références

Annexe Android Studio

OpenPaaS Le réseau social d'entreprise

Remote Method Invocation en Java (RMI)

Applet pour visualiser les variables «automate» notifiées

Le GéoPortail du Jura Présentation des fonctionnalités de la version mobile

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

Vodafone Mobile Connect

Transcription:

UNIVERSITÉ SAINT- JOSEPH Faculté d Ingénierie Institut National de la Communication et de l'information Rapport de Projet de Fin d Année Master en systèmes et réseaux Localisation d un mobile et identification de l opérateur/fournisseur d accès Réalisé par : Encadré par : Antoine MOHANNA Dr. Marc IBRAHIM 1

Sommaire Remerciements Page 3 Introduction.Page 4 Introduction sur Eclipse..Page 5 Travail Effectue..Page 8 o Objectif 1...Page 8 o Objectif 2-3 Page 10 o Objectif 4...Page 13 o Objectif 5...Page 15 Conclusion..Page 19 Annexes..Page 20 2

Remerciements Au terme de ce travail, je tiens à exprimer ma gratitude et mes remerciements pour toutes les personnes qui ont contribué à sa réalisation. Je tiens tout d abord à remercier Dr Marc IBRAHIM, mon encadreur à l Institut National de Communication et de l Information, pour son aide, ses conseils, son encouragement et son disponibilité dans ce projet. Je remercie également M. Hadi SAWAYA, responsable et directeur de l INCI, pour son aide à se familiariser avec ce projet. Je présente mes sincères remerciements à tous mes enseignants à l INCI. Mes profonds remerciements pour les membres du jury, qui ont accepté d évaluer ce travail. 3

Introduction au Projet Ce projet fait partie d un projet collaboratif lancé à l ESIB, et qui consiste à créer un observatoire de l Internet au Liban. Cet observatoire collectera la qualité de service de l Internet perçue par un ensemble d usagers mobiles sur le territoire libanais et permettra de générer des indicateurs de QoS par opérateur/isp et par localisation géographique. Les mesures seront réalisées par des agents installés sur les mobiles des usagers participants au projet, effectuant périodiquement des mesures passives et/ou actives afin de quantifier le plus fidèlement possible l expérience internet de l usager. Ces mesures seront remontées vers un serveur central qui va traiter, stocker et analyser toutes ces données. Les résultats des analyses seront disponibles via un site Web offrant plusieurs formes de visualisation. Afin d avoir la distribution géographique de la QoS perçue par les usagers, il est primordial que le mobile qui effectue la mesure à un instant donne, identifié sa position géographique via GPS si possible. Mais en Indoor, le GPS peut ne pas fonctionner ce qui nécessite de trouver d autres méthodes pour estimer la position courante du mobile. En plus, la QoS doit être reliée à l opérateur ou ISP auquel est rattaché le mobile au moment de la mesure. Il faut donc savoir identifier cette entité. Ainsi, plusieurs taches seront effectués dans ce projet afin d accomplir l objectif de localisation : 1. Extraction logicielle des coordonnées GPS du mobile 2. Estimation de la position en absence du GPS 3. Identification de l opérateur mobile 4. Elaboration des méthodes d identifications de l ISP quand le mobile est connecté via Wifi 5. Groupement de tous les paramètres de localisation et d identification du fournisseur en un seul objet A noter que l application sera développée sur Android, en utilisant un environnement de développement appelé Eclipse. 4

Introduction sur Eclipse Dans la programmation informatique, Eclipse est un environnement de développement intégré multi-langue (IDE) comprenant un espace de travail de base et un extensible plug-in système de personnalisation de l'environnement. Il est écrit en Java. Il peut être utilisé pour développer des applications en Java ainsi que d'autres langages de programmation dont Ada, C, C + +, COBOL, Fortran, Haskell, JavaScript, Perl, PHP, Python, R, Ruby,Scala, Clojure, Groovy, Scheme, et Erlang.Eclipse peut également être utilisé pour développer des packages pour le logiciel Mathematica. Les environnements de développement comprennent l'eclipse Java Development Tools (JDT) pour Java et Scala, Eclipse CDT pour C / C + + et PHP pour Eclipse PDT, entre autres. Le code de base initial provient d'ibm VisualAge. Le kit développement logiciel d Eclipse (SDK), qui inclut les outils de développement Java, est destiné aux développeurs Java. Les utilisateurs peuvent étendre ses capacités en installant des plug-ins écrit pour la plate-forme Eclipse, tels que des boîtes à outils de développement pour d'autres langages de programmation, et peuvent écrire et apporter leur propre modules plug-in. Publié selon les termes de la licence publique Eclipse, Eclipse SDK est gratuit et ouvert (même si elle est incompatible avec la GNU General Public License). Il était l'un des premiers environnements de développement pour s'exécuter sous GNU Classpath et il fonctionne sans problèmes sous IcedTea. Plusieurs versions de Java ont été publiées, de l Eclipse Callisto lancé en 2006, à l Eclipse Juno de 2012, qui sera utilisé dans ce projet. En créant an nouveau «Android Application Project» avec plusieurs sous dossiers, un package sous le nom «com.example.nomdelapplication» sera aussi créé. Les packages sont utilisés dans Java pour prévenir les conflits de noms, pour contrôler l'accès, pour rendre la recherche / localisation et l'utilisation des classes, interfaces, énumérations et les annotations facile. Un package peut être défini comme un regroupement de types connexes (classes, interfaces, énumérations et les annotations) assurant la protection d'accès et le nom de gestion de l'espace. Nous serons intéressés principalement à 3 fichiers : le fichier.java créé sous le dossier src, le fichier activity_main.xml sous le dossier res/layout et le fichier AndroidManifest.xml. Fichier.java : C est la ou le code java sera développé en créant des classes java. C est à partir d une classe que des objets individuels sont créés. 5

Une classe peut contenir plusieurs types de variables : 1. Les variables locales : les variables définies à l'intérieur des méthodes, des constructeurs ou des blocs sont appelées variables locales. La variable sera déclarée et initialisée dans la méthode et la variable sera détruit lorsque la méthode est terminée. 2. Les variables d'instance : Les variables d'instance sont des variables au sein d'une classe, mais en dehors de toute méthode. Ces variables sont instanciées lorsque la classe est chargée. Les variables d'instance peuvent être accessibles à partir de l'intérieur de toute méthode, constructeur ou des blocs de cette classe particulière. 3. Les variables de classe : Les variables de classe sont des variables déclarées dans une classe, en dehors de toute méthode, avec le mot-clé static. Lors de la discussion sur les classes l'un des sous sujet le plus important serait les constructeurs. Chaque classe possède un constructeur. Si nous ne rédigeons pas explicitement un constructeur pour une classe le compilateur java construit un constructeur par défaut pour cette classe. Chaque fois qu'un nouvel objet est créé au moins un constructeur sera invoqué. La règle principale des constructeurs, c'est qu'ils doivent avoir le même nom que la classe. Une classe peut avoir plusieurs constructeurs. Activity_main.xml : L'un des principaux avantages de déclarer une interface en XML est la possibilité de garder l'interface utilisateur et le comportement de l application séparée, donnant la liberté de modifier la présentation de l application sans perturber son fonctionnement. Dans ce fichier, on peut faire le design de zéro, définir l'élément racine, préciser la taille et les paramètres de largeur, et ajouter certains éléments de l'interface utilisateur. Exemple : <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/button" /> <TextView android:id="@+id/outputtxt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textcolor="#cc0033" android:textsize="16sp" android:textstyle="bold" /> </LinearLayout> 6

AndroidManifest.xml: Chaque application doit avoir un fichier AndroidManifest.xml dans son répertoire racine. Le manifest contient des informations essentielles sur l'application pour le système Android, des informations que le système doit avoir avant de pouvoir exécuter n'importe quel code de l'application. Le fichier Manifest fait ce qui suit: 1. Il nomme le package Java pour l'application. Le nom du package est utilisé comme identifiant unique de l'application. 2. Il décrit les composants de l'application - les activités, les services, les récepteurs de radiodiffusion et les fournisseurs de contenu que l'application est composée. Il nomme les classes qui implémentent chacune des composantes et publie leurs capacités (par exemple, les messages d'intention qu'ils peuvent manipuler). Ces déclarations laissent le système Android savoir ce que les composants sont et dans quelles conditions ils peuvent être lancés. 3. Il détermine les processus qui animeront les composants de l'application. 4. Il déclare les autorisations, la demande que doit avoir pour accéder à des parties protégées de l'api et d'interagir avec d'autres applications. 5. Elle déclare également les autorisations sont nécessaires pour avoir afin d'interagir avec les composants de l'application. Ainsi, le AndroidManifest.xml sera mis a jour par le programmeur pour, principalement, initialiser des permissions tel que Access_Coarse_Location, Access_Fine_Location, Internet, Access_Network_State et Read_Phone_State qui seront utilises dans ce projet. Exemple : <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.locationfromgps" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="8" android:targetsdkversion="17" /> <uses-permission android:name="android.permission.access_coarse_location"/> <uses-permission android:name="android.permission.access_fine_location"/> <uses-permission android:name="android.permission.internet"/> <uses-permission android:name="android.permission.access_network_state"/> <uses-permission android:name="android.permission.read_phone_state"/> <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="com.example.gpsjartest.jartest" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application></manifest> 7

Travail Effectué Objectif 1 : Extraction logicielle des coordonnées GPS du mobile Le Global Positioning System (GPS) que l'on peut traduire en français par «système de localisation mondial» ou, plus proche du sigle d'origine, «Guidage Par Satellite» est un système de géo localisation fonctionnant au niveau mondial. Le GPS comprend au moins 24 satellites tournant à 20 200 km d'altitude. Un récepteur GPS qui capte les signaux d'au moins quatre satellites équipés de plusieurs horloges atomiques peut, en calculant les temps de propagation de ces signaux entre les satellites et lui, connaître sa distance par rapport à ceux-ci et, par trilatération, situer précisément en trois dimensions n'importe quel point placé en visibilité des satellites GPS, avec une précision de 3 à 50 mètres pour le système standard. Le GPS est ainsi utilisé pour localiser des véhicules roulants, des navires, des avions, des missiles et même des satellites évoluant en orbite basse. Ce système va être utilisé dans ce projet pour localiser un usager mobile en tirant sa longitude et sa latitude. Les classes principales qui seront utilisées pour développer un tel code sont android.location.location, android.location.locationlistener et android.location.locationmanager. Android.Location.location est une classe de données représentant un emplacement géographique. Un emplacement peut consister en une latitude, longitude, horodatage, et d'autres informations telles que les roulements, l'altitude et la vitesse. LocationListener est utilisé pour recevoir des notifications du LocationManager lorsque l'emplacement a été modifié. LocationManager fournit un accès à des services de localisation du système. Ces services permettent aux applications d'obtenir des mises à jour périodiques de la situation géographique 8

de l'appareil, ou de tirer une intention lorsque l'appareil entre dans la proximité d'un lieu géographique donné. Partie du Code développé : // Getting LocationManager object locationmanager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); // Getting the name of the provider provider = locationmanager.gps_provider; if(provider!=null &&!provider.equals("")){ // Get the location from the given provider Location location = locationmanager.getlastknownlocation(provider); locationmanager.requestlocationupdates(provider, 20000, 1, this); if(location!=null) // Updating Location when changed onlocationchanged(location); else Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show(); else{ Toast.makeText(getBaseContext(), "No Provider Found", Toast.LENGTH_SHORT).show(); Les permissions exigées pour ce code seront ACCESS_FINE_LOCATION et INTERNET. Alors, le GPS est basé sur les estimations des satellites émettant des signaux vers le récepteur. Un récepteur GPS (en général) a besoin des signaux d'au moins 4 satellites pour pouvoir calculer sa position. Les niveaux de signal pour la bande L1 dans des conditions de ciel ouvert peut atteindre environ -130dBm. Les récepteurs commerciaux, tels que ceux intégrés dans les téléphones mobiles, sont capables de suivre les satellites jusqu'à -160dBm. Sous ce seuil, le récepteur n'est pas capable d'utiliser le signal. Cette marge de 30 db permet une certaine atténuation causée par des obstacles tels que les fenêtres en verre et les murs légers, mais plusieurs immeubles masquent complètement les signaux de presque toutes les directions, ce qui rend GPS totalement indisponible. Et même si l'atténuation permet au récepteur d'utiliser les signaux pour calculer sa position, la précision obtenue ne sera probablement pas suffisante pour notre application comme la précision est dégradée par l'atténuation du signal. Ainsi, un autre type de localisation est exigé pour rendre la position des usagers plus précise : on parle d une localisation par cellules GSM d une part, et l utilisation d un service Google pour déterminer approximativement la latitude et la longitude d un mobile d une part. 9

Objectif 2-3: Estimation de la position en absence du GPS et Identification de l opérateur mobile Solution 1 : Estimation de la position en utilisant le service de NETWORK_PROVIDER NETWORK_PROVIDER utilise les hotspots WiFi et les tours cellulaires connus par Android afin de localiser approximativement un utilisateur en longitude et latitude. Lorsque le fournisseur d'emplacement est interrogé, les ID des hotspots WiFi et les tours cellulaires dans la zone sont envoyés via Internet à Google Location Server, une base de données avec des informations de localisation sur les hotspots WiFi et les tours cellulaires. Google Location Server renvoie une localisation approximative de l'utilisateur. Les données proviennent d'une combinaison de cellules et de l'information de hotspot WiFi, et ne peut être obtenue que lorsque l'appareil peut accéder à l'internet pour interroger le Google Location Server. La précision des données est spécifiée quelque part entre 100-1000 m en fonction de l'information disponible. Les Hotspots WiFi permettent une précision de 100-500 m, tandis que les tours cellulaires ne permettent qu une précision supérieure à 500 m. Cela signifie que le fournisseur de réseau sera très imprécis dans des zones sans hotspots WiFi. Inversement, plus les Hotspots et les tours cellulaires sont dans la zone, plus la précision est grande. Un tableau comparatif entre GPS_PROVIDER et NETWORK_PROVIDER GPS_PROVIDER NETWORK_PROVIDER Plus Précis. Détermine la location d un utilisateur en utilisant les tours cellulaires et signaux Wifi Il fonctionne uniquement à l'extérieur Fournit des informations sur l'emplacement d'une manière qui fonctionne à l'intérieur et à l'extérieur Il consomme rapidement l'énergie de la batterie Consomme moins d'énergie de la batterie Réponse de localisation lente Réponse de localisation rapide Pour implémenter ce service, on doit juste remplacer GPS_PROVIDER du code de localisation GPS par NETWORK_PROVIDER. provider = locationmanager.network_provider; Dans ce qui suit, un code sera détaillé en expliquant comment utiliser les deux providers en alternance. Malgré la plus grande précision que le GPS offre, toutefois le service Google présente une meilleure disponibilité. 10

Solution 2 : Estimation de la position dans une cellule GSM Un système de radiotéléphonie utilise une liaison radioélectrique entre le terminal portatif et le réseau téléphonique. La liaison radio entre le téléphone mobile et le réseau doit être de qualité suffisante, ce qui nécessite la mise en place d'un ensemble de stations de base (BTS) sur l'ensemble du territoire que l'on souhaite couvrir, de telle sorte que le terminal soit toujours à moins de quelques kilomètres de l'une d'entre elles. Ce que l'on appelle une cellule, c'est la surface sur laquelle le téléphone mobile peut établir une liaison avec une station de base déterminée. Le principe consiste à diviser une région en un certain nombre de cellules desservies par un relais radioélectrique (la BTS) de faible puissance, émettant à des fréquences différentes de celles utilisées sur les cellules voisines. Ces cellules doivent être contiguës sur la surface couverte. Ce système GSM peut ainsi être utilisée pour localiser un usager mobile dans une cellule, comme chaque cellule aura sa propre identité et sera unique chez chaque opérateur mobile. 11

Pour développer un tel code, on utilisera deux classes principales : android.telephony.telephonymanager et android.telephony.gsm.gsmcelllocation. android.telephony.telephonymanager permet d'accéder à l'information sur les services téléphonie de l'appareil. Les applications peuvent utiliser les méthodes de cette classe afin d'accéder à certains types de renseignements sur les abonnés. Les applications peuvent également enregistrer un Listener pour recevoir la notification de changements d'état de téléphonie. android.telephony.gsm.gsmcelllocation représente l'emplacement de cellule sur un téléphone GSM. Partie du Code développé : //retrieve a reference to an instance of TelephonyManager TelephonyManager telephonymanager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); GsmCellLocation celllocation = (GsmCellLocation)telephonyManager.getCellLocation(); // Defining LAC, CID, MNC and MCC String networkoperator = telephonymanager.getnetworkoperator(); String mcc = networkoperator.substring(0, 3); String mnc = networkoperator.substring(3); String operator = telephonymanager.getsimoperatorname(); int cid = celllocation.getcid(); int lac = celllocation.getlac(); Les permissions exigées pour ce code seront ACCESS_COARSE_LOCATION et READ_PHONE_STATE. Ainsi, en utilisant getsimoperator() et getcelllocation(), on a pu tirer l identité de la cellule oú se trouve l usager mobile ainsi que le nom de l opérateur fournissant le réseau GSM à cet usager. 12

Objectif 4 : Elaboration des méthodes d identifications de l ISP quand le mobile est connecté via Wifi Un fournisseur d'accès à internet est un organisme offrant une connexion à Internet. Le raccordement d un ISP à l'utilisateur peut se faire au travers d'une boucle locale (en cuivre, en fibre optique ou en radio). Cette boucle locale est généralement gérée par un opérateur spécifique. Plusieurs ISP opèrent sur le territoire libanais : OGERO, SODETEL, CYBERIA, WISE, TERRANET etc., et plusieurs sites Web offrent le service de l identification de ces ISP tel que http://whatismyipaddress.com/ ou http://findmyipaddress.com/. Ainsi, ces sites seront utiles pour notre application afin d identifier le fournisseur de chaque usager. Notre code consiste à accéder à l un de ces sites et tirer le nom de l ISP. NB : Le URL utilisé sera http://www.ip2phrase.com/ip2phrase.asp?template=%20%3cisp%3e Les classes principales utilisées pour développer un tel code sont nombreuses, parmi elles java.io.inputstream, java.net.httpurlconnection, java.net.url, java.util.regex.matcher, java.util.regex.pattern etc. Partie du Code développé : // Define the URL from which we re extracting the ISP name public static final String URL = "http://www.ip2phrase.com/ip2phrase.asp?template=%20%3cisp%3e"; // Retrieving URL output private class GetXMLTask extends AsyncTask<String, Void, String> { protected String doinbackground(string... urls) { String output = null; for (String url : urls) { output = getoutputfromurl(url); return output; // Retrieving The ISP name private String getoutputfromurl(string url) { StringBuffer output = new StringBuffer(""); int x =1;//ISP name included here //String StartDelemiter=">"; //String EndDelemiter="<"; try { InputStream stream = gethttpconnection(url); LineNumberReader lnr = new LineNumberReader(new InputStreamReader(stream)); String line = ""; int lineno; for (lineno = 1; lineno < 90; lineno++) { // When reached the line where ISP name exists if (lineno == x) { line = lnr.readline(); //output.append(line); //getting the ISP name between two defined caracters 13

else Pattern p = Pattern.compile(">(.*?)<"); Matcher m = p.matcher(line); if (m.find()) { output.append(m.group(1)); // => "isp" lnr.readline(); catch (IOException e1) { e1.printstacktrace(); return output.tostring(); // Makes HttpURLConnection and returns InputStream private InputStream gethttpconnection(string urlstring) throws IOException { InputStream stream = null; URL url = new URL(urlString); URLConnection connection = url.openconnection(); try { HttpURLConnection httpconnection = (HttpURLConnection) connection; httpconnection.setrequestmethod("get"); httpconnection.connect(); if (httpconnection.getresponsecode() == HttpURLConnection.HTTP_OK) { stream = httpconnection.getinputstream(); catch (Exception ex) { ex.printstacktrace(); return stream; Ce code va tirer la source code du site destinataire et va lire ce fichier ligne par ligne, et c est à travers une commande IF qu il va concaténer une ligne bien précise (ou se trouve le nom de l ISP) et tirer la chaine désiré entre deux caractères différents, défini par le programmeur. 14

Objectif 5 : Groupement de tous les paramètres de localisation et d identification du fournisseur en un seul objet Cet objectif va faciliter le travail d un autre programmeur qui s intéresse seulement aux variables tirées par ces codes, mais pas les codes JAVA (Longitude, latitude, cellid, opérateur et ISP). Afin de passer seulement ces variables, on doit grouper ces paramètres et leurs fonctions dans un seul projet, faire un EXPORT de ce projet dans un JAR file qui sera passé au programmeur. Ce dernier doit intégrer ce JAR file dans la librairie de son propre projet (Right-Click sur le projet -> Build Path -> Configure Build Path -> Librairies -> Add External JARs), et puis il sera capable d appeler ces fonctions et tirer les valeurs qu il désire, en faisant un simple import dans son projet. Pour faire cela, un changement a été nécessaire sur les codes déjà développés, implémenter des fonctions afin d appeler chacune pour tirer les valeurs différentes. Code mis à jour : Une fonction getsimoperator() a été créer qui rend une valeur String contenant le nom de l opérateur GSM. public String getsimoperator() { TelephonyManager telephonymanager = (TelephonyManager)gContext.getSystemService(Context.TELEPHONY_SERVICE); String operator = telephonymanager.getsimoperatorname(); return operator; L initialisation du CellLocation sera faite dans une fonction getcelllocation alors que l ID de la cellule auquel est connecté l usager mobile sera tiré d une fonction differente CellLacLocation qui va rendre une valeur String contenant l ID de cette cellule ainsi que le LAC. public GsmCellLocation getcelllocation() { TelephonyManager telephonymanager = (TelephonyManager)gContext.getSystemService(Context.TELEPHONY_SERVICE); GsmCellLocation CellLocation = (GsmCellLocation)telephonyManager.getCellLocation(); return CellLocation; public String CellLacLocation(GsmCellLocation CellLocation){ String cidlacstring; if (CellLocation!= null) { int cid = CellLocation.getCid(); int lac = CellLocation.getLac(); cidlacstring = "CellID:" + cid + "\nlac:" + lac; else { cidlacstring="no Cell Location Available"; return cidlacstring; 15

Concernant la localisation GPS, et similairement à la localisation GSM, l initialisation sera faite dans une fonction getlocation() alors que les longitudes et les latitudes seront tirées d une autre fonction updatewithnewlocation() qui va retourné une valeur String de ces valeurs. De plus, on doit implémenter GPS_PROVIDER et NETWORK_PROVIDER en même temps, pour assurer à la fois une précision et une disponibilité. Alors, une commande IF va être créée. Si une connexion GPS est valable, et on peut se localiser, alors un se localise en utilisant GPS_PROVIDER ; mais dans un cas contraire alors on utilisera NETWORK_PROVIDER. public Location getlocation(){ String provider = null; LocationManager locationmanager; Location gps_loc=null; String context = Context.LOCATION_SERVICE; locationmanager = (LocationManager)gContext.getSystemService(context); gps_loc=locationmanager.getlastknownlocation(locationmanager.gps_provider); try{gps_enabled=locationmanager.isproviderenabled(locationmanager.gps_provider);catc h(exception ex){ try{network_enabled=locationmanager.isproviderenabled(locationmanager.network_provide R);catch(Exception ex){ if(gps_enabled && gps_loc!= null){ provider = LocationManager.GPS_PROVIDER; else{ provider = LocationManager.NETWORK_PROVIDER; Location location = locationmanager.getlastknownlocation(provider); locationmanager.requestlocationupdates(provider, 20000, 1, this); return location; public String updatewithnewlocation(location location) { String latlongstring; if (location!= null){ double lat = location.getlatitude(); double lng = location.getlongitude(); latlongstring = "Latitude:" + lat + "\nlongitude:" + lng; else{ latlongstring = "No Location available"; return latlongstring; En addition, le programmeur va s intéresser si le mobile de l usager a été localiser par GPS ou NETWORK, alors, une fonction getprovider() supplémentaire va être développer qui va rendre une de deux valeur : gps en cas de localisation par GPS_PROVIDER et network en cas de localisation NETWORK_PROVIDER. 16

public String getprovider(location location){ String provider = null; LocationManager locationmanager; Location gps_loc=null; String context = Context.LOCATION_SERVICE; locationmanager = (LocationManager)gContext.getSystemService(context); gps_loc=locationmanager.getlastknownlocation(locationmanager.gps_provider); if(gps_enabled && gps_loc!= null ){ provider = LocationManager.GPS_PROVIDER; else{ provider = LocationManager.NETWORK_PROVIDER; return provider; Et bien sur la fonction getoutputfromurl() va être utiliser pour tirer l identité de l ISP. public String getoutputfromurl(string url) { StringBuffer output = new StringBuffer(""); int x =1; //String StartDelemiter=">"; //String EndDelemiter="<"; try { InputStream stream = gethttpconnection(url); LineNumberReader lnr = new LineNumberReader(new InputStreamReader(stream)); String line = ""; int lineno; for (lineno = 1; lineno < 90; lineno++) { if (lineno == x) { line = lnr.readline(); //output.append(line); Pattern p = Pattern.compile(">(.*?)<"); Matcher m = p.matcher(line); if (m.find()) { output.append(m.group(1)); // => "isp" else lnr.readline(); catch (IOException e1) { e1.printstacktrace(); return output.tostring(); Puis, tout ce qui est demandé du programmeur c est d appeler les fonctions de la manière suivante : Initialisation de l activité : LocationMobileUser MU = new LocationMobileUser (this); 17

Appel de la fonction getlocation(): Location location = MU.getLocation(); Initialisation de location de la cellule: GsmCellLocation CellLocation = MU.getCellLocation(); Définition de l URL d ou va être tirée le nom de l ISP: String URL = LocationMobileUser.URL; Initialisation de la classe utilise pour la définition de l ISP: LocationMobileUser.GetXMLTask xmlp = MU.new GetXMLTask(); Définition des String qui vont contenir les différentes valeurs de localisation: String isp = xmlp.getoutputfromurl(url); String latlongstring = MU.updateWithNewLocation(location); String cidlacstring = MU.CellLacLocation(CellLocation); String operator = MU.getSimOperator(); String provider = MU.getProvider(); 18

Conclusion Dans le cadre de mon projet, je devais réaliser une application Android pour la localisation d un mobile et identification de l opérateur/fournisseur d accès. Dans un premier temps, quelques recherches ont été nécessaires pour s introduire à Eclipse et se familiariser avec ce programme. Ensuite j ai commencé par le développement de l application en programmant une application pour chaque objectif. Enfin, dernier objectif demandé, j ai groupé toute les applications développées en un seul projet, et mis à jour les codes pour être capable de l utiliser comme référence pour des futurs projets. A travers les différentes exigences imposées par le cahier des charges ; un résultat final a été accompli qui est le suivant : le développement d une application android qui permet la localisation d un mobile par longitude et latitude, cellule GSM, et l identification de l operateur mobile ainsi que le fournisseur d accès tout en regroupant ces paramètres en un seul objet. Ce projet m a permis d appliquer mes connaissances en programmation et en langage Java et d en développer une application qui se révèle aujourd hui d intérêt général au vu de l augmentation des marchés des applications sur les différentes plateformes des mobiles. Comme d'autres applications Android, mon application peut être aisément améliorée. En effet, grâce à son aspect ouvert, Android offre l'opportunité de créer des logiciels mobiles innovants et révolutionnaires en encourageant les développeurs à puiser dans leur imagination et à mobiliser toutes leurs compétences pour un meilleur de cette plateforme. 19

Annexes Annexe 1: Application qui affiche les coordonnées GPS import android.app.activity; import android.content.context; import android.location.criteria; import android.location.location; import android.location.locationlistener; import android.location.locationmanager; import android.os.bundle; import android.view.menu; import android.widget.textview; import android.widget.toast; public class MainActivity extends Activity implements LocationListener{ LocationManager locationmanager ; String provider; public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // Getting LocationManager object locationmanager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); // Creating an empty criteria object Criteria criteria = new Criteria(); // Getting the name of the provider that meets the criteria provider = locationmanager.getbestprovider(criteria, false); if(provider!=null &&!provider.equals("")){ // Get the location from the given provider Location location = locationmanager.getlastknownlocation(provider); locationmanager.requestlocationupdates(provider, 20000, 1, this); if(location!=null) onlocationchanged(location); else Toast.makeText(getBaseContext(), "Location can't be retrieved", Toast.LENGTH_SHORT).show(); else{ Toast.makeText(getBaseContext(), "No Provider Found", Toast.LENGTH_SHORT).show(); 20

public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.activity_main, menu); return true; public void onlocationchanged(location location) { // Getting reference to TextView tv_longitude TextView tvlongitude = (TextView)findViewById(R.id.tv_longitude); // Getting reference to TextView tv_latitude TextView tvlatitude = (TextView)findViewById(R.id.tv_latitude); // Setting Current Longitude tvlongitude.settext("longitude:" + location.getlongitude()); // Setting Current Latitude tvlatitude.settext("latitude:" + location.getlatitude() ); public void onproviderdisabled(string provider) { // TODO Auto-generated method stub public void onproviderenabled(string provider) { // TODO Auto-generated method stub public void onstatuschanged(string provider, int status, Bundle extras) { // TODO Auto-generated method stub 21

Annexe 2: Application qui affiche la location par GSM et l opérateur import android.app.activity; import android.content.context; import android.os.bundle; import android.telephony.telephonymanager; import android.telephony.gsm.gsmcelllocation; import android.widget.textview; public class AndroidTelephonyManager extends Activity { public class OpenCellID { String mcc; //Mobile Country Code String mnc; //mobile network code String cellid; //Cell ID String lac; //Location Area Code String operator; public void setmcc(string value){ mcc = value; public void setmnc(string value){ mnc = value; public void setcallid(int value){ cellid = String.valueOf(value); public void setcalllac(int value){ lac = String.valueOf(value); public void setoperator(string value){ operator = value; /** Called when the activity is first created. */ public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); TextView textmcc = (TextView)findViewById(R.id.mcc); TextView textmnc = (TextView)findViewById(R.id.mnc); TextView textcid = (TextView)findViewById(R.id.cid); TextView textlac = (TextView)findViewById(R.id.lac); TextView textop1 = (TextView)findViewById(R.id.op1); //retrieve a reference to an instance of TelephonyManager 22

TelephonyManager telephonymanager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); GsmCellLocation celllocation = (GsmCellLocation)telephonyManager.getCellLocation(); String networkoperator = telephonymanager.getnetworkoperator(); String mcc = networkoperator.substring(0, 3); String mnc = networkoperator.substring(3); textmcc.settext("mcc: " + mcc); textmnc.settext("mnc: " + mnc); String op1 = telephonymanager.getsimoperatorname(); textop1.settext("operator: " + op1); int cid = celllocation.getcid(); int lac = celllocation.getlac(); textcid.settext("gsm cell id: " + String.valueOf(cid)); textlac.settext("gsm location area code: " + String.valueOf(lac)); 23

Annexe 3: Application qui affiche l ISP import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.io.linenumberreader; import java.net.httpurlconnection; import java.net.url; import java.net.urlconnection; import java.util.regex.matcher; import java.util.regex.pattern; import android.app.activity; import android.os.asynctask; import android.os.bundle; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.textview; public class MainActivity extends Activity implements OnClickListener { Button button; TextView outputtext; public static final String URL = "http://www.ip2phrase.com/ip2phrase.asp?template=%20%3cisp%3e"; /** Called when the activity is first created. */ public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); findviewsbyid(); button.setonclicklistener(this); private void findviewsbyid() { button = (Button) findviewbyid(r.id.button); outputtext = (TextView) findviewbyid(r.id.outputtxt); public void onclick(view view) { GetXMLTask task = new GetXMLTask(); task.execute(new String[] { URL ); private class GetXMLTask extends AsyncTask<String, Void, String> { protected String doinbackground(string... urls) { String output = null; for (String url : urls) { output = getoutputfromurl(url); return output; 24

private String getoutputfromurl(string url) { StringBuffer output = new StringBuffer(""); int x =1; try { InputStream stream = gethttpconnection(url); LineNumberReader lnr = new LineNumberReader(new InputStreamReader(stream)); String line = ""; int lineno; for (lineno = 1; lineno < 90; lineno++) { if (lineno == x) { line = lnr.readline(); //output.append(line); Pattern p = Pattern.compile(">(.*?)<"); Matcher m = p.matcher(line); if (m.find()) { output.append(m.group(1)); // => "isp" else lnr.readline(); catch (IOException e1) { e1.printstacktrace(); return output.tostring(); // Makes HttpURLConnection and returns InputStream private InputStream gethttpconnection(string urlstring) throws IOException { InputStream stream = null; URL url = new URL(urlString); URLConnection connection = url.openconnection(); try { HttpURLConnection httpconnection = (HttpURLConnection) connection; httpconnection.setrequestmethod("get"); httpconnection.connect(); if (httpconnection.getresponsecode() == HttpURLConnection.HTTP_OK) { stream = httpconnection.getinputstream(); catch (Exception ex) { ex.printstacktrace(); return stream; protected void onpostexecute(string output) { outputtext.settext(output); 25

Annexe 4: Application qui groupe tous les paramètres de localisation et d identification du fournisseur en un seul objet import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.io.linenumberreader; import java.net.httpurlconnection; import java.net.url; import java.net.urlconnection; import java.util.regex.matcher; import java.util.regex.pattern; import android.content.context; import android.location.location; import android.location.locationlistener; import android.location.locationmanager; import android.os.asynctask; import android.os.bundle; import android.telephony.telephonymanager; import android.telephony.gsm.gsmcelllocation; import android.view.view; public class LocationMobileUser implements LocationListener { //Context mcontext; Context gcontext; boolean gps_enabled=false; boolean network_enabled=false; public LocationMobileUser(Context gcontext){ //this.mcontext = mcontext; this.gcontext = gcontext; public static final String URL = "http://www.ip2phrase.com/ip2phrase.asp?template=%20%3cisp%3e"; public void XML (View view) { GetXMLTask task = new GetXMLTask(); task.execute(new String[] { URL ); public class GetXMLTask extends AsyncTask<String, Void, String> { protected String doinbackground(string... urls) { String output = null; for (String url : urls) { output = getoutputfromurl(url); return output; public String getoutputfromurl(string url) { StringBuffer output = new StringBuffer(""); int x =1; //String StartDelemiter=">"; 26

//String EndDelemiter="<"; try { InputStream stream = gethttpconnection(url); LineNumberReader lnr = new LineNumberReader(new InputStreamReader(stream)); String line = ""; int lineno; for (lineno = 1; lineno < 90; lineno++) { if (lineno == x) { line = lnr.readline(); //output.append(line); Pattern p = Pattern.compile(">(.*?)<"); Matcher m = p.matcher(line); if (m.find()) { output.append(m.group(1)); // => "isp" else lnr.readline(); catch (IOException e1) { e1.printstacktrace(); return output.tostring(); // Makes HttpURLConnection and returns InputStream public InputStream gethttpconnection(string urlstring) throws IOException { InputStream stream = null; URL url = new URL(urlString); URLConnection connection = url.openconnection(); try { HttpURLConnection httpconnection = (HttpURLConnection) connection; httpconnection.setrequestmethod("get"); httpconnection.connect(); if (httpconnection.getresponsecode() == HttpURLConnection.HTTP_OK) { stream = httpconnection.getinputstream(); catch (Exception ex) { ex.printstacktrace(); return stream; public String getsimoperator() { TelephonyManager telephonymanager = (TelephonyManager)gContext.getSystemService(Context.TELEPHONY_SERVICE); 27

String operator = telephonymanager.getsimoperatorname(); return operator; public GsmCellLocation getcelllocation() { //String Context=Context.Telephony_SERVICE; TelephonyManager telephonymanager = (TelephonyManager)gContext.getSystemService(Context.TELEPHONY_SERVICE); GsmCellLocation CellLocation = (GsmCellLocation)telephonyManager.getCellLocation(); return CellLocation; public Location getlocation(){ String provider = null; LocationManager locationmanager; Location gps_loc=null; String context = Context.LOCATION_SERVICE; locationmanager = (LocationManager)gContext.getSystemService(context); gps_loc=locationmanager.getlastknownlocation(locationmanager.gps_provider); try{gps_enabled=locationmanager.isproviderenabled(locationmanager.gps_provider);catc h(exception ex){ try{network_enabled=locationmanager.isproviderenabled(locationmanager.network_provide R);catch(Exception ex){ if(gps_enabled && gps_loc!= null){ provider = LocationManager.GPS_PROVIDER; else{ provider = LocationManager.NETWORK_PROVIDER; Location location = locationmanager.getlastknownlocation(provider); locationmanager.requestlocationupdates(provider, 20000, 1, this); return location; public String getprovider(){ String provider = null; if(gps_enabled){ provider = LocationManager.GPS_PROVIDER; else{ provider = LocationManager.NETWORK_PROVIDER; return provider; public String CellLacLocation(GsmCellLocation CellLocation){ String cidlacstring; if (CellLocation!= null) { 28

int cid = CellLocation.getCid(); int lac = CellLocation.getLac(); cidlacstring = "CellID:" + cid + "\nlac:" + lac; else { cidlacstring="no Cell Location Available"; return cidlacstring; public String updatewithnewlocation(location location) { String latlongstring; if (location!= null){ double lat = location.getlatitude(); double lng = location.getlongitude(); latlongstring = "Latitude:" + lat + "\nlongitude:" + lng; else{ latlongstring = "No Location available"; return latlongstring; public void onlocationchanged(location arg0) { // TODO Auto-generated method stub public void onproviderdisabled(string arg0) { // TODO Auto-generated method stub public void onproviderenabled(string arg0) { // TODO Auto-generated method stub public void onstatuschanged(string arg0, int arg1, Bundle arg2) { // TODO Auto-generated method stub 29