Commander un Arduino avec une tablette Android

- Etude de cas -


précédentsommairesuivant

VI. Le serveur d'enregistrement des Arduinos

A lire

  • dans [ref4] : chapitre 6 [Les threads d'exécution], chapitre 7 [Programmation TCP / IP] ;
  • le code du serveur TCP générique présenté page , paragraphe  ;
  • le code du client TCP générique présenté page , paragraphe .

VI-A. Le projet Eclipse

Revenons à l'architecture du serveur :

Image non disponible

Le projet Eclipse de la couche [DAO] est le suivant :

Image non disponible
  • en [1] : le projet Eclipse ;
  • en [2] : les dépendances Maven du projet. On notera les dépendances sur les entités du serveur ;
  • en [3] : les éléments de la couche [DAO] ;

VI-B. Les dépendances Maven

Le fichier [pom.xml] du projet est le suivant :

 
CacherSélectionnez
  • lignes 5-8 : l'identité Maven du projet ;
  • lignes 30-34 : la dépendance sur le projet Maven des entités ;
  • lignes 18-29 : deux dépendances sur le framework Spring. Celui-ci est utilisé pour configurer et instancier la couche [DAO] ;

VI-C. L'interface de la couche [DAO]

L'interface [IDao] de la couche [DAO] sera la suivante :

 
CacherSélectionnez
  • ligne 13 : la couche [DAO] peut envoyer une liste de commandes de type [Commande] à un Arduino identifié par son id. Elle reçoit une liste de réponses de type [Reponse] ;
  • ligne 15 : la couche [DAO] peut envoyer une liste de commandes au format texte JSON à un Arduino identifié par son id. Elle reçoit une liste de réponses texte au format JSON ;
  • ligne 7 : la couche [DAO] gère la liste des Arduinos qui se sont connectés. Cette méthode en donne la liste ;
  • ligne 9 : pour ajouter un Arduino à la liste ;
  • ligne 11 : pour enlever un Arduino de la liste ;

VI-D. de la couche [DAO]

Dans le dossier [support] du TP, vous trouverez un projet Eclipse qui va vous permettre de tester les différents éléments du serveur :

Image non disponible
  • en [1] : le projet console de tests ;
  • en [2] : la classe [Main1] permet de tester la couche [DAO] ;

La classe [Main1] est la suivante :

 
CacherSélectionnez

Nous vous laissons comprendre ce code. Il fait clignoter la led n° 8 de tous les Arduinos connectés. Pour cela, il envoie à intervalles réguliers la commande PinWrite en écrivant alternativement 0 et 1 sur la pin n° 8.

VI-E. La configuration de Spring

Le programme de test précédent instancie la couche [DAO] à l'aide de Spring :

 
CacherSélectionnez

La configuration de Spring dans [applicationContext.xml] est la suivante :

Image non disponible
 
CacherSélectionnez

La couche [DAO] est configurée par les lignes 14-19 :

  • ligne 14 : après instanciation de la classe [arduino.dao.Dao], Spring va exécuter la méthode init de cette classe. C'est dans cette méthode que nous créerons et lancerons le serveur d'enregistrement des Arduinos ;
  • ligne 15 : la couche [DAO] aura une référence sur le serveur d'enregistrement appelé ici recorder. Il est défini lignes 7-12 ;
  • ligne 16 : le délai d'attente maximal qu'attendra la couche [DAO] lorsqu'elle se connecte à un Arduino. Au-delà, elle lancera une exception [DomotiqueException] ;
  • ligne 17 : le délai d'attente maximal qu'attendra la couche [DAO] lorsqu'elle atend une réponse d'un Arduino. Au-delà, elle lancera une exception [DomotiqueException] ;
  • ligne 18 : un booléen qui indique si la couche [DAO] logue ou pas sur la console ce qu'elle fait ;

Le serveur d'enregistrement est configuré par les lignes 7-12 :

  • le port d'écoute ;
  • l'IP du serveur d'écoute. Une machine peut avoir plusieurs adresses IP si elle a plusieurs cartes réseau. Il est alors nécessaire de dire si le serveur écoute sur toutes les adresses IP ou seulement sur certaines comme c'est le cas ici ;
  • ligne 10 : les demandes à un serveur sont mises en file d'attente si le serveur est occupé lorsque la demande arrive. Ici, on fixe à 5 la taille maximale de cette file. Si une sixième demande arrive alors elle reçoit une exception de la part du serveur ;
  • ligne 11 : on peut demander au serveur d'enregistrement d'écrire ou non des logs sur la console ;

VI-F. L'interface [IThreadDao] du serveur d'enregistrement

Image non disponible

Le serveur d'enregistrement implémente l'interface [IThreadDao] suivante :

 
CacherSélectionnez

VI-G. Le serveur d'enregistrement [Recorder]

Image non disponible

Le squelette du serveur d'enregistrement est le suivant :

 
CacherSélectionnez
  • lignes 9-13 : proviennent du fichier de configuration de Spring ;

Question : complétez le code du serveur d'enregistrement. Pour cela, aidez-vous du code du serveur générique en éliminant de celui-ci tout ce qui est inutile pour le serveur d'enregistrement. Pour assurer son service, le serveur [Recorder] lance un thread [Recording].

Conseils :

  • lorsque le serveur reçoit une connexion d'un Arduino, il peut servir cette connexion lui-même ou lancer un autre thread pour le faire. La première solution est suffisante ici. La deuxième est à préférer dans le cas où le serveur a beaucoup de clients ;
  • lorsque le serveur a lu la ligne envoyée par l'Arduino, il doit en faire un objet [Arduino] et appeler la méthode [addArduino] de la couche [DAO] pour que celle-ci enregistre le nouvel Arduino. La construction de l'objet [Arduino] est réalisée grâce à une bibliothèque JSON ;

VI-H. Tests du serveur d'enregistrement

Image non disponible

Dans le projet de tests [server-console], on exécutera le programme [Main0] suivant :

 
CacherSélectionnez
  • ligne 8 : la classe [Main0] implémente l'interface [IDao] de la couche [DAO]. Une seule méthode de l'interface sera implémentée, celles des lignes 30-33 ;
  • ligne 16 : le constructeur ;
  • ligne 18 : on instancie le serveur d'enregistrement défini comme suit dans le fichier [applicationContext.xml] :
 
CacherSélectionnez

Adaptez ce fichier à vos besoins.

  • le serveur d'enregistrement doit remonter à la couche [DAO], l'Arduino qui s'enregistre. C'est en effet la couche [DAO] qui gère la liste des arduinos connectés. Pour cela, le serveur d'enregistrement doit avoir une référence sur la couche [DAO]. C'est fait en ligne 21 ;
  • ligne 23 : le thread du serveur est lancé. A partir de ce moment, il va vivre tout seul, en parallèle des activités de la couche [DAO]. Ici, la classe [Main0] et le serveur d'enregistrement s'exécutent dans des threads différents ;
  • lorsqu'un Arduino se connecte, le serveur appelle la méthode de la ligne 30 pour l'enregistrer. On se contente de loguer l'enregistrement sur la console.

Lorsqu'on exécute la classe [Main0], on doit vérifier que l'Arduino arrive à se connecter. Cela peut se voir dans les logs du serveur si vous les avez prévus :

 
CacherSélectionnez
  • lignes 1 et 10 : logs de [Main0] ;
  • les autres lignes sont des logs du serveur d'enregistrement.

Les logs de la console de l'Arduino montrent également cette connexion :

 
CacherSélectionnez

précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Serge Tahé. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.