Commander un Arduino avec une tablette Android

- Etude de cas -


précédentsommairesuivant

IX. Implémentation du service REST du serveur

Image non disponible

La couche web expose la couche [métier] aux clients web via un service REST.

A lire

  • paragraphes 4.3.2 et 9.6 du document [ref2] ;

IX-A. Le projet Eclipse

Image non disponible
  • en [1], le projet Eclipse est un projet Maven [2] ;
  • en [3], les dépendances Maven du projet. Celui-ci dépend du projet de la couche [métier]. Les autres dépendances en découlent en cascade ;
  • en [4], la classe [RestMetier] implémente la couche [métier].

IX-B. Les dépendances Maven

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

 
CacherSélectionnez
  • le service REST est implémenté à l'aide du framework SpringMVC. On trouve donc un certain nombre de dépendances sur ce framework (lignes 29-48) ;
  • lignes 49-53 : le serveur REST va échanger avec ses clients des objets au format JSON (JavaScript Object Notation). C'est une représentation texte des objets. Un objet JAVA peut être sérialisé en un texte JSON. Inversement, ce dernier peut être désérialisé pour créer un objet JAVA. Côté serveur, la bibliothèque Jackson est utilisée pour faire ces opérations ;
  • lignes 54-58 : le serveur REST a une dépendance sur la couche [métier] que nous avons décrite.

IX-C. La configuration du service REST

Un service REST est une application web et à ce titre est configurée par un fichier [web.xml] classique :

Image non disponible

est le suivant :

 
CacherSélectionnez
  • lignes 4-12 : définition d'une servlet, une classe capable de traiter les requêtes HTTP des clients web ;
  • ligne 5 : son nom restservices. On peut l'appeler comme on veut ;
  • ligne 6 : la servlet qui gère les requêtes HTTP des clients web. C'est la classe [DispatcherServlet] de SpringMVC ;
  • lignes 7-10 : indiquent le fichier de configuration de la servlet, ici [WEB-INF/rest-services-config.xml] ;
  • ligne 11 : la servlet sera chargée au démarrage du serveur, ici un serveur Tomcat 7 ;
  • lignes 13-16 : les URL (ligne 15) traitées par la servlet restservices (ligne 14).

Au final, ce fichier indique que toutes les URL (ligne 15) seront gérées par la servlet restservices (ligne 14) définie lignes 4-12.

La classe [DispatcherServlet] est configurée par le fichier [] suivant :

 
CacherSélectionnez
  • lignes 17-34 : configuration des couches [métier] et [DAO] du serveur ;
  • lignes 36-37 : il est possible de configurer Spring à l'aide d'annotations dans le code Java. C'est ce qui a été fait ici. La ligne 37 dit à Spring d'exploiter les annotations qu'il trouvera dans le package [arduino.rest.metier] ;

Il y trouvera trois genres d'annotations :

 
CacherSélectionnez
  • ligne 1 : l'annotation @Controller fait de la classe [RestMetier] un contrôleur SpringMVC, c-à-d une classe capable de traiter des requêtes HTTP. Celles-ci sont définies par l'annotation @RequestMapping qu'on voit en ligne 11 ;
  • lignes 5 et 7 : l'annotation @Autowired tague des champs qui sont des références sur des beans définis dans le fichier de configuration de SpringMVC. Dans notre cas, ce sont les beans des lignes 2 et 10 du fichier [rest-services-config.xml] ci-dessous. Les champs des lignes ainsi taguées sont automatiquement initialisés par Spring.

Revenons au code du fichier [rest-services-config.xml] :

 
CacherSélectionnez
  • lignes 10-13 : les vues générées par l'unique contrôleur seront du type [MappingJacksonJsonView] (ligne 11). Cette vue va transformer son modèle en un unique objet JSON qu'elle va transmettre à son client. La ligne 12 configure un entête HTTP envoyé par le serveur à son client : elle dit que le serveur envoie du texte, ici l'objet JSON ;
  • lignes 16-17 : un « convertisseur de messages ». Je ne sais pas bien ce que signifie cette expression. Il semble que cela définisse une classe capable de créer un objet à partir d'une requête ou d'une réponse HTTP et inversement. Ici la classe [MappingJacksonHttpMessageConverter] va créer un objet JSON à partir du modèle de la vue. Inversement, elle est capable de produire un objet Java à partir de données JSON postées par le client ;
  • lignes 20-27 : il peut y avoir plusieurs « convertisseurs de messages » pour différents cas de figure. Entre les lignes 21-23, on met les beans chargés de « convertir des messages ». On y met donc le bean défini ligne 16. C'est le seul.

IX-D. Le code du service REST

Le serveur REST est implémenté par la classe [RestMetier] suivante :

 
CacherSélectionnez

4 : en suivant l'exemple du paragraphe 4.3.2.5 de [ref2], écrire la classe [RestMetier].

IX-E. Les tests du service REST

Travail à faire : en suivant l'exemple du paragraphe 4.3.2.6 de [ref2], déployer et tester le service REST. Toutes les méthodes de ce service doivent être testées.

Voici quelques exemples :

URL

rôle

http://localhost:8080/server-restServer/arduinos/

rend la liste des Arduinos connectés

http://localhost:8080/server-restServer/arduinos/blink/1/192.168.2.3/8/100/20/

fait clignoter la led de la pin n° 8 de l'Arduino identifié par 192.168.2.3

http://localhost:8080/server-restServer/arduinos/pinRead/1/192.168.2.3/0/a/

lecture analogique de la pin n° 8 de l'Arduino identifié par 192.168.2.3

http://localhost:8080/server-restServer/arduinos/pinRead/1/192.168.2.3/5/b/

lecture binaire de la pin n° 5 de l'Arduino identifié par 192.168.2.3

http://localhost:8080/server-restServer/arduinos/pinWrite/1/192.168.2.3/8/b/1/

écriture binaire de la valeur 1 sur la pin n° 8 de l'Arduino identifié par 192.168.2.3

http://localhost:8080/server-restServer/arduinos/pinWrite/1/192.168.2.3/4/a/100/

écriture analogique de la valeur 100 sur la pin n° 4 de l'Arduino identifié par 192.168.2.3

Le test de la méthode [sendCommandesJson] est plus délicat :

 
CacherSélectionnez
  • ligne 3 : la méthode attend une requête POST qu'on ne peut pas simuler simplement avec un navigateur. Il faut des outils spéciaux ;
  • ligne 3 : la requête POST doit demander une URL de la forme [/arduinos/commands/192.168.2.3] pour envoyer à l'Arduino désigné une liste de commandes JSON ;
  • ligne 5 : cette liste de commandes JSON est le corps du POST (@RequestBody), c-à-d la valeur postée.

Pour tester cette méthode, on pourra utiliser un navigateur Chrome avec l'extension [Advanced REST Client] :

Image non disponible

Pour installer cette extension, on pourra procéder de la façon suivante :

  • lancer le navigateur Chrome ;Image non disponible
  • en [1], personnaliser le navigateur ;
  • en [2], sélectionner l'option [Outils / Extensions] ;Image non disponible
  • en [3], installer l'extension [Advanced REST Client].

Une fois cette extension installée dans Chrome, on peut l'utiliser de la façon suivante :

Image non disponible
  • en [1], en bas du navigateur, on sélectionne la vue [Applications]. Il faut parfois créer un nouvel onglet pour avoir cette barre de sélection ;
  • en [2], on lance l'extension désirée ;Image non disponible
  • en [1], l'URL de la méthode REST à tester ;
  • en [2], la méthode GET ou POST pour envoyer la requête ;

La requête est envoyée en la validant ou via le bouton [Send].

  • en [3], les entêtes HTTP de la demande ;
  • en [4], les entêtes HTTP de la réponse ;Image non disponible
  • en [5], la réponse JSON renvoyée par le serveur REST ;

Toutes les méthodes GET du service REST peuvent être testées ainsi. Pour la méthode POST [sendCommandesJson], on procèdera ainsi :

Image non disponible
  • en [1], l'URL de la méthode [sendCommandsJson] ;
  • en [2], la requête se fait via la commande HTTP POST ;Image non disponible
  • en [3], on indique que l'objet envoyé par le POST est du texte JSON ;
  • en [4], la liste des commandes JSON. On notera bien les crochets qui commencent et terminent la liste. Ici, dans la liste il n'y a qu'une commande JSON qui écrit la valeur binaire 0 sur la pin 8 de l'Arduino ;Image non disponible
  • en [5], la réponse JSON envoyée par le serveur ;

Le serveur est désormais écrit. Il servira aussi bien aux client natifs Android qu'aux client web mobiles.


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.