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 ;
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.
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▲
Le serveur d'enregistrement implémente l'interface [IThreadDao] suivante :
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 ;
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] :
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 :
Sélectionnez
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Serveur d'enregistrement lancé sur 192.168.2.1:100
mars 30, 2013 9:22:29 AM arduino.dao.Recorder trace
Infos: Recorder : [09:22:29:265] : [Serveur d'enregistrement : attente d'un client]
mars 30, 2013 9:22:34 AM arduino.dao.Recorder trace
Infos: Recorder : [09:22:34:728] : [Serveur d'enregistrement : client détecté]
mars 30, 2013 9:22:34 AM arduino.dao.Recorder trace
Infos: Recorder : [09:22:34:733] : [Serveur d'enregistrement : attente d'un client]
mars 30, 2013 9:22:34 AM arduino.dao.Recording trace
Infos: Recording : [09:22:34:734] : [Service d'enregistrement d'un arduino lancé]
L'Arduino [id=[192.168.2.3], description=[duemilanove], mac=[90:A2:DA:00:1D:A7], ip=[192.168.2.3], port=[102]] a été ajouté
mars 30, 2013 9:22:34 AM arduino.dao.Recording trace
Infos: Recording : [09:22:34:850] : [Service d'enregistrement d'un arduino terminé]
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 :
Sélectionnez
1. 2. 3. 4. 5. 6.
Connexion au serveur d'enregistrement...
Connecte...
enregistrement : {"id":"192.168.2.3","desc":"duemilanove","mac":"90:A2:DA:00:1D:A7","port":102}
Enregistrement termine...
Demarrage du serveur sur l'adresse IP 192.168.2.3 et le port 102
Memoire disponible avant service : 832
Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants :