Commander un Arduino avec une tablette Android

- Etude de cas -


précédentsommairesuivant

VII. Implémentation de la couche [Dao] du serveur

Image non disponible

A lire

  • le code du client TCP générique présenté page , paragraphe .

VII-A. Le code

Image non disponible

Le squelette de la classe [Dao] est le suivant :

 
CacherSélectionnez
  • ligne 10 : la couche [DAO] a une référence sur le serveur d'enregistrement ;
  • ligne 11 : 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 12 : 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 13 : un booléen qui indique si la couche [DAO] logue ou pas sur la console ce qu'elle fait ;
  • ligne 16 : les Arduinos connectés seront maintenus dans un dictionnaire plutôt qu'une liste. En effet, les clients envoient des commandes à un Arduino identifié par son id. A partir de celui-ci, l'Arduino sera retrouvé plus facilement dans un dictionnaire que dans une liste ;
  • ligne 18 : un serveur peut faire assurer le service d'un client par un thread dit de " service ". Ainsi si à un moment donné, il y a n clients, il y a n threads de service. Si dans notre exemple, le service des Arduinos était assuré par des threads de service, alors il serait possible que la méthode [addArduino] de la couche [DAO] soit appelée en même temps par deux ou plusieurs threads de service. On dit alors que la méthode [addArduino] est une ressource critique. L'accès à celle-ci doit être contrôlé afin qu'un seul thread n'y ait accès à la fois. Ici, nous n'avons pas choisi la solution des threads de service parce qu'elle n'était pas indispensable. Nous allons quand même, par souci de pédagogie et parce que c'est simple, synchroniser l'accès aux ressources critiques ;
  • ligne 18 : un verrou contrôlera l'accès aux ressources critiques. C'est un simple objet ;
  • ligne 45 : un exemple d'utilisation d'un verrou. La syntaxe :
 
CacherSélectionnez

assure que le code de la ligne 2 ne sera exécuté que par un seul thread à la fois même si celui-ci est interrompu au milieu du code de la ligne 2. Le principe est le suivant :

  • un premier thread arrivé en ligne 1. Le verrou est libre. Il le prend et exécute le code de la ligne 2. Il possède le verrou tant qu'il n'a pas passé la ligne 3,
  • un second thread arrive. Si le verrou n'a pas été libéré par le thread précédent, il est bloqué. Il va attendre que le verrou se libère ;

On peut faire la même chose avec d'autres méthodes de synchronisation non présentées ici.

  • lignes 74-85 : cette méthode est le coeur de la couche [DAO]. Elle envoie à l'Arduino identifié par le 1er paramètre, la liste des commandes JSON identifiée par le second paramètre. Pour chaque commande, elle reçoit une réponse JSON. La méthode rend la liste des réponses JSON qu'elle a reçues ;
  • lignes 60-71 : une méthode analogue mais avec des paramètres différents. Elle transforme sa liste de commande [Commande] en liste de commandes JSON et appelle la méthode [sendCommandesJson]. Elle reçoit une liste de réponses JSON qu'elle transforme en liste de réponses [Reponse].

 : Implémenter la classe [DAO]. Il s'agit d'écrire un client TCP-IP classique. On pourra s'aider du code du client TCP générique déjà utilisé pour des tests.

VII-B. Tests de la couche [DAO]

Exécutez les tests présentés au paragraphe , page .

VII-C. Améliorations

La couche [DAO] peut être améliorée de diverses façons. En voici deux :

  • un Arduino qui se connecte au serveur d'enregistrement est mémorisé. Si un utilisateur déconnecte son câble réseau ou son alimentation, l'Arduino n'est plus accessible mais reste mémorisé dans la couche [DAO]. On peut prévoir un thread qui à intervalles réguliers (10 secondes) essaierait de se connecter au port 102 de tous les Arduinos mémorisés. Lorsque l'un ne répond pas, il est enlevé de la liste des Arduinos mémorisés ;
  • les adresses IP et Mac sont fixées par le développeur dans le code des Arduinos. Ainsi il n'est pas impossible de vouloir connecter deux Arduinos qui par erreur auraient la même adresse IP. La méthode [addArduino] de la couche [DAO] peut faire des tests. Si l'Arduino qui arrive, a la même adresse IP ou la même adresse Mac ou la même description qu'un Arduino déjà enregistré, son enregistrement est refusé et une exception [DomotiqueException] est lancée.

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.