Nom des élèves : Pierre Haller et Florian KROMER
Élèves Ingénieur en 3ème année à Télécom Nancy
L'objectif de ce mini-projet est de réaliser une application Android exploitant des données issues d'un réseau de capteurs et exposées à travers un web service (IoTLab de TELECOM Nancy). Le but est de détecter les lumières laissées actives dans les bureaux en soirée.
L'application doit permettre les actions suivantes:
- Lister dans l'activité principale les capteurs actifs et les valeurs de luminosité qu'ils relèvent, en mettant en évidence ceux qui indiquent la présence d'une lumière active
- Emettre une notification si une nouvelle lumière vient d'être allumée en semaine entre 19h et 23h, en spécifiant le capteur impliqué
- Envoyer un email si cet événement survient le week-end entre 19h et 23h ou en semaine entre 23h et 6h.
- Permettre la configuration des plages horaires et de l'adresse email dans un menu dédié
De plus, l'état des capteurs seront récupérées dans un Service asynchrone (AsyncTask) qui exécutera une tache périodique ( TimerTask ). Celle-ci aura comme but la consultation d'un web service avec HttpURLConnection et la lecture des réponses avec JsonReader. La persistance des données sera faite avec SharedPreferences et la création d'un BroadcastReceiver pour gérer les événements système sera necessaire. Enfin il faudra éditer le Manifest pour déclarer des permissions et des intent-filter , et l'envoi de Notification.
Android studio : (v2.2.3) IDE, minSDKversion : 16, targetSDKversion : 21
Graddle : gestionnaire dépendances
Gson : (v2.2) bibliothèque permettant une manipulation du JSON plus souple que l'api de base. Permet également de caster une chaine json en son objet correspondant.
JUnit : (v4.12) biblitotheque permettant l'organisation et les assertions des tests unitaires.
JavaFaker : (v0.12) bibliothèque permettant de générer divers type de données, utile pour les tests unitaires.
L'application a été testé sur un Xiaomi redme note 3 (android 6.0) et un nexus 4 (android 7)
Nous avons créé un package différent de celui des sources qui est uniquement destiné aux tests. Nous avons utilisé JUnit
Pour s'assurer de la bonne communication entre notre TimerTask et le web service, nous avons mis en place différents tests unitaires. L'organisation générale du code nous a permis facilement de tester chaque fonctionnalité indépendamment du reste. Par l'exemple nous avons pu injecter un « faux » contexte propre aux les tests, de même nous pouvons injecter l'url à appeler dans notre TimerTask à la volée, enfin le callback appeler à la fin de l'execution de la tache périodique nous a permis de valider l'assertion.
Dans le code ci-dessous nous testons si l'appel à l'API retourne au moins 1 résultat.
@Test
public void testRESTLightLast(){
LightTimerTask timerTask = new LightTimerTask() {
@Override
public void myTimerTaskCallback(LightRecords lightsRecordsList) {
_assertTrue_("/{experiment\_id}/{labels}/(last|first) contains at leats 1 results",lightsRecordsList.size()>=1);
}
@Override
public Context myTimerTaskContext() {
return getContext();
}
@Override
public String myTimerTaskUrl() {
return "http://iotlab.telecomnancy.eu/rest/data/1/light1/last";
}
};
timerTask.run();
}
Nous avons également testé l'autre point clé de l'application à savoir : la détection de l'allumage d'une lumière. Pour se faire, nous avons généré de fausses données grâce à la bibliotheque Faker avec une valeur de lumen encadré entre 2 et 200.
Light l = new Light(faker.date().between(new Date(2017,1,1), new Date(2017,1,24)).getTime(),"label",faker.number().randomDouble(2,2,200), "mote9",);
Ensuite nous ajoutons 2 pics de valeurs pour simuler l'allumage des lampes. Enfin nous testons qu'il y a bien eu 2 changements d'état pour la lampe.