Rapport de Projet de Fin d’Année Master en systèmes et...

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

Transcript of Rapport de Projet de Fin d’Année Master en systèmes et...

Page 1: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

1

UNIVERSITÉ SAINT- JOSEPH

Faculté d’Ingénierie Institut National de la Communication et de l'Information

Localisation d’un mobile et identification de l’opérateur/fournisseur d’accès

Réalisé par : Antoine MOHANNA

Encadré par : Dr. Marc IBRAHIM

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

Page 2: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

2

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

Page 3: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

3

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.

Page 4: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

4

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.

Page 5: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

5

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.

Page 6: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

6

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>

Page 7: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

7

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>

Page 8: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

8

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

Page 9: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

9

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.

Page 10: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

10

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é.

Page 11: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

11

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.

Page 12: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

12

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.

Page 13: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

13

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> { @Override 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

Page 14: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

14

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; }

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.

Page 15: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

15

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; }

Page 16: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

16

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);}catch(Exception ex){} try{network_enabled=locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}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.

Page 17: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

17

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);

Page 18: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

18

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();

Page 19: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

19

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.

Page 20: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

20

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;

@Override 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(); }

Page 21: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

21

} @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override 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() ); }

@Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }

Page 22: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

22

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. */ @Override 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

Page 23: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

23

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)); } }

Page 24: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

24

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. */ @Override 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> { @Override protected String doInBackground(String... urls) { String output = null; for (String url : urls) { output = getOutputFromUrl(url); } return output; }

Page 25: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

25

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; } @Override protected void onPostExecute(String output) { outputText.setText(output); } } }

Page 26: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

26

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> { @Override 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=">";

Page 27: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

27

//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);

Page 28: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

28

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);}catch(Exception ex){} try{network_enabled=locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}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) {

Page 29: Rapport de Projet de Fin d’Année Master en systèmes et réseauxcomiqual.usj.edu.lb/documentations/Rapport de Projet 2013...4 Introduction au Projet Ce projet fait partie d’un

29

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; } @Override public void onLocationChanged(Location arg0) { // TODO Auto-generated method stub } @Override public void onProviderDisabled(String arg0) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String arg0) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2) { // TODO Auto-generated method stub } }