====== Smart Contact List ====== ==== Présentation du projet ==== * Nom 1 : Gatien CHAPON * Créneau (AM ou PM) : AM * Nom 2 : Gregory ROBIN * Créneau (AM ou PM) : AM * Nom du Projet : Smart Contact List ===== Un scénario d'illustration du Projet ===== L’idée de ce projet est de réaliser une application capable de trouver et de proposer à un utilisateur les contacts les plus probables qu’il souhaite appeler à un instant donné. Par exemple, en tant que Bob, commercial ayant beaucoup de contacts et énormément d'appels à passer dans la journée, je veux que mon téléphone me propose une liste de contact favoris au moment où je souhaite passer un appel. Pour cela, l’application aura accès au journal d’appel de Bob et utilisera un algorithme d'apprentissage supervisé. De même, Bob pourra effectuer un appel depuis l’application. ==== Matériel disponible ==== **Cible Mobile utilisée :** Étant donné, qu'Android est l'un des leaders du marché des OS pour les applications mobiles, nous allons nous orienter vers une application compatible avec un os de type Android. Nous prendrons comme cible un téléphone Samsung Galaxy S4 mini avec OS Android et une version 5.0.3 * Référence du SmartPhone : Samsung Galaxy S4 mini * Caractéristiques techniques * [[http://www.samsung.com/fr/consumer/mobile-devices/smartphones/galaxy-s/GT-I9195DKYXEF|Fiche technique du constructeur]] * Résumé des fiches techniques en terme de ressources du SmartPhone Accelerometer, Geomagnetic Sensor, Gyro Sensor, Light Sensor, Proximity Sensor * Caractéristiques de l'OS et des environnements logiciels utilisables pour développer sur ce SmartPHone : Android 5.0.3 **Environnement logiciel :** Dans le but d'optimiser les performances de notre application et étant donné que nous ciblons des plateformes mobiles de type Android, nous avons choisi de réaliser une application mobile native Android. De ce fait, nous avons choisi d’utiliser Android studio comme environnement logiciel pour développer dans un environnement natif. ===== Architecture logicielle de la solution : ===== Notre architecture logicielle sera découpée en deux parties distinctes : - Une partie serveur en charge du traitement des données. Dans notre cas, l’algorithme d’apprentissage sera situé sur celui-ci. - Une partie cliente, l’application mobile permettant : * L’accès aux sondes systèmes (journal d’appel, contact) * La mise à jour de la base de données locale lorsqu'un appel est émis ou reçu. * L’utilisation d’un cache local permettant de stocker les contacts les plus probables pour chaque période de la journée : 8-10h, 10-12h, 12-14h, 14-16h, 16h-18h, 18-20h, 20-22h, 22-00h et 00-06h (mise à jour de ce cache lors de la synchronisation avec le serveur). * L’affichage des contacts les plus probables qu’ils souhaitent appeler à un instante donné. La communication entre le client et le serveur sera effectué à l’aide de requête de type REST. ====== Reconnaissance de l'activité : ====== Cette application permettra de prédire vers quels contacts un appel va être émis et ce en fonction de l'heure et de la date à laquelle l’utilisateur souhaite passer un appel. ====== Ressources utilisées dans le Projet ====== Pour ce projet, nous allons principalement nous intéresser aux sondes téléphoniques de l’appareil cible. Pour réaliser notre algorithme d’apprentissage, nous avons besoin de récupérer plusieurs informations : * Le journal d'appel de l'utilisateur pour accéder aux informations de chaque appel préalablement réalisés : * Date et l'heure de l'appel * La personne appelée * Appel reçu ou émis * Le répertoire de contact de l'utilisateur pour accéder à tous les contacts de l'utilisateur * Nous calculerons de même le nombre d'appel émis et reçu par contact (calcul réalisé sur le serveur). ===== Faisabilité des choix ===== Sous Android, l’accès au journal d’appel peux être réaliser en utilisant l’API CallLog.Calls (https://developer.android.com/reference/android/provider/CallLog.Calls.html#CallLog.Calls()). Cette API nous permettra de récupérer tous les informations de l’utilisateur concernant son journal d’appel. Par contre cette API impose bien évidement de demander le droit d’accès au journal d’appel de l’utilisateur. Nous avons de même la possibilité d’accéder à la liste de contact de l’utilisateur en utilisant l’API Android Read_Contacts (https://developer.android.com/training/contacts-provider/retrieve-names.html). ====== Algorithme mis en œuvre : ====== Afin de réaliser ce projet, nous allons mettre en œuvre un algorithme supervisé de type Random forest. Pour ce faire, nous définiront un vecteur composé d’un grand nombre de données sans quoi l'algorithme serait totalement inefficace. **Avec quelles données ?** Le vecteur sera composé de la date, de l'heure d'appel, de tous les contacts présents sur le téléphone, du nombre d'appel par contact ainsi que de l'identifiant du contact qui constituera notre cible (la classe à reconnaître). Cet algorithme nous parait tout à fait pertinent du fait du nombre de contact que l'on peut avoir sur un téléphone. Les données engendrées seront donc normalement assez importantes pour fournir un résultat cohérent quant à la prédiction de l'appel que l'on veut passer. Pour réaliser cela, nous nous inspirerons d’un exemple d’utilisation de cette algorithme disponible à l’adresse suivante : https://www.kaggle.com/vankads/titanic/a-journey-through-titanic/notebook.   ====== Planning et Test ====== - Choix et implémentation de la composition définitive du vecteur et des classes pour l’utilisation de l’algorithme d’apprentissage Random Forest. - Création de l’application mobile - Mises-en en place de différents services REST pour l’échange de données entre le client et le serveur. - Phase de test et d’analyse Pour réaliser la phase de test de notre application, nous utiliserons le jeu de données de nos téléphones personnelles. ==========RENDU FINAL========== ====Code source==== Ci-dessous le lien pour accéder au code source de la partie backend (serveur Python) et la partie mobile (projet android studio) : [[https://github.com/gatienchapon/SmartContactList]] ====== Sécurité et vie privée ====== Pour assurer la confidentialité des données échangées entre l'application cliente et le serveur gérant l’algorithme d'apprentissage, nous avons choisi d'affecter un identifiant unique à chaque contact. De ce fait, **le nom des contacts ou les numéros de téléphones de ceux-ci restent privés** et ne sont pas envoyés et bien sûr non stockés sur le serveur distant. Seuls les identifiants des contacts transitent entre l'application et le serveur, ce qui permet de rendre **les contacts non identifiables en dehors de l'application**. Nous avons choisi de fournir à nos utilisateurs deux versions de l'application : * Une version dite "Cloud": c'est à dire que le traitement et l'algorithme d'apprentissage est réalisé sur un serveur distant dans le "Cloud". De ce fait, l'utilisateur n'a pas a ce soucier de la partie serveur et il pourra réaliser de nouvelles synchronisations à n'importe quel endroit (en ayant une connexion internet active comme la 3G, la 4G ou le WIFI). * Une version dite "Local": aucune information ne sera envoyée à un serveur distant et tous les traitements seront effectués directement sur l'ordinateur de l'utilisateur. Cela permet d'assurer la sécurité et la confidentialité des données échangées, puisque aucune donné ne transitera par le réseau "Internet" et tous les traitements s’effectueront en local. ====== Fonctionnement de la machine Serveur ====== Notre serveur reçoit en entrée plusieurs vecteurs (envoyé par l'application mobile et de type POST) correspondants aux appels d'un utilisateur (pour une question de "vie privée" les numéros de téléphone ainsi que le nom des contacts ne sont pas transférés, seuls les identifiants des contacts sont transférés) . Après un processus de traitement réalisé par le serveur pour augmenter la taille des vecteurs, un appel à une bibliothèque implémentant Random Forest est réalisé. Le serveur renvoi par la suite ces prédictions concernant les identifiants des contacts que l'utilisateur souhaitera potentiellement appeler à un instant donné. ====== Produit 1 : Une Version "Local" ====== Dans cette version, nous fournissons la machine serveur et l'application cliente Android. **//Attention : dans cette version votre ordinateur et votre smartphone doivent être sur le même réseau local.//** **1) Installation de la machine serveur sous Windows** * Télécharger l’exécutable suivant sur votre ordinateur Windows : [[https://www.dropbox.com/s/ewx6tkkgh6rbj7q/Smart_Contact_List.exe?dl=0|SmartContactList_Server_For_Windows]] **2) Installation de l'application mobile sur cible Android** * Télécharger l'APK suivant directement sur votre mobile : [[https://www.dropbox.com/s/9guy316o7ml1l5i/LocalSmartContactList.apk?dl=0|SmartContactListApp_Local]] * Allez dans l'application "Téléchargement" et cliquez sur le fichier .apk * Sélectionnez "Installer" {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-38-51.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-40-29.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-40-35.png?200|}} **3) Utilisation et synchronisation avec votre machine local** * Vérifiez que votre ordinateur et votre smartphone sont bien connectés au même réseau local (la connection WIFI de votre mobile doit être activée) * Lancez l'exécutable préalablement téléchargé sur votre ordinateur Windows * Lancez l'application mobile et choisir "Make a Sync" {{:cours:plim:projet16_17:gr1:lancerexe.png?200|}} {{:cours:plim:projet16_17:gr1:sychronisation.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-40-54.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-41-21.png?200|}} ====== Produit 2 : Une Version "Cloud" ====== Pour cette version, il suffit d'installer l'application mobile sur votre smartphone Android **Installation de l'application mobile sur cible Android** * Téléchargement : télécharger l'APK suivant sur votre téléphone mobile : [[https://www.dropbox.com/s/oq8eg5zlalvt3yz/CloudSmartContactList.apk?dl=0|SmartContactListApp_Cloud]] * Choisir "Téléchargement direct" * Allez dans l'application "Téléchargement" et cliquez sur le fichier .apk * Sélectionnez "Installer" * Ouvrir l'application * Cliquez sur "Make a Sync", attention vous devez avoir un accès à internet 3G, 4G ou WIFI {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-38-51.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-40-29.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-40-35.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-40-54.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-11-41-21.png?200|}} ===== Utilisation de l'application mobile Android ===== {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-10-51-03.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-10-51-29.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-10-52-40.png?200|}}{{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-10-51-43.png?200|}} {{:cours:plim:projet16_17:gr1:screenshot_2017-01-28-10-53-47.png?200|}}