Outils pour utilisateurs

Outils du site


tppic

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
tppic [2019/03/14 19:19]
bvandepo
tppic [2019/04/06 14:08] (Version actuelle)
bvandepo [Exercice 3: Réception de commandes des LED]
Ligne 46: Ligne 46:
 copier coller dans une console: copier coller dans une console:
 </​color>​ </​color>​
-  rsync -av --delete ~/​TCPIP_Demo_App_etudiant /mnt/etu/s4+  rsync -av --delete ~/​TCPIP_Demo_App_etudiant /mnt/etu/
  
 <color red> <color red>
Ligne 428: Ligne 428:
  
 ====Exercice 3: Réception de commandes des LED ==== ====Exercice 3: Réception de commandes des LED ====
-  - Compléter les fonctions **etudiantSocketAppInit()** et **etudiantSocketAppTask()** pour gérer la réception périodique des chaînes de caractères commandant les LED depuis le PC superviseur. Pour cela, vous devrez ouvrir un socket écoutant sur le bon numéro de port et depuis n'​importe quelle IP.  Veillez à définir un tableau de caractères en mémoire et à ne pas tenter de lire plus de caractères qu'il n'y a de place dans ce tableau. Vous pourrez au choix traiter un ordre de commutation des LEDS par appel de la fonction **etudiantSocketAppTask()** ou bien traiter autant d'ordre que possible (en fonction de la taille de votre tableau)+  - Compléter les fonctions **etudiantSocketAppInit()** et **etudiantSocketAppTask()** pour gérer la réception périodique des chaînes de caractères commandant les LED depuis le PC superviseur. Pour cela, vous devrez ouvrir un socket écoutant sur le bon numéro de port et depuis n'​importe quelle IP.  Veillez à définir un tableau de caractères en mémoire et à ne pas tenter de lire plus de caractères qu'il n'y a de place dans ce tableau. Vous pourrez au choix traiter un ordre de commutation des LEDS par appel de la fonction **etudiantSocketAppTask()** ou bien traiter autant d'ordres ​que possible (en fonction de la taille de votre tableau)
   - Vous penserez à commenter **UNIQUEMENT** les lignes de votre programme qui pilotent les leds à partir de l'​état des boutons pour ne pas interférer avec la commande des LEDs depuis le réseau. Conserver tout le reste du code en place, notamment la lecture de l'​état des boutons et l'​affichage de la chaine dans **DBPRINTF**.   - Vous penserez à commenter **UNIQUEMENT** les lignes de votre programme qui pilotent les leds à partir de l'​état des boutons pour ne pas interférer avec la commande des LEDs depuis le réseau. Conserver tout le reste du code en place, notamment la lecture de l'​état des boutons et l'​affichage de la chaine dans **DBPRINTF**.
   - Tester votre programme en demandant sur le PC superviseur,​ via l'​application BroadcastReceiver qui communique avec votre carte PIC, de commuter chacune des LEDs.   - Tester votre programme en demandant sur le PC superviseur,​ via l'​application BroadcastReceiver qui communique avec votre carte PIC, de commuter chacune des LEDs.
Ligne 479: Ligne 479:
   bool ARPIsResolved(type pointeur sur adresse IP, type pointeur sur adresse MAC)   bool ARPIsResolved(type pointeur sur adresse IP, type pointeur sur adresse MAC)
  
-Dans la fonction **etudiantSocketAppTask()**,​ à l'​intérieur de la tâche périodique à 1Hz, ajouter une machine à état **simple** permettant de faire des requêtes ARP avec la fonction **ARPResolve**. Ceci permet d'​envoyer une requette ARP avec l'​adresse IP passée en argument. Dans les appels suivants de la fonction** etudiantSocketAppTask()**,​ il vous faudra tester si **ARPIsResolved** a renvoyé **TRUE**, ce qui signifie que la réponse ARP est arrivée et donc que le champ adresse MAC est mis à jour. Dans ce cas il faudra ouvrir le socket (une seule fois) puis effectuer l'​envoi des données comme dans l'​exercice précédent. Dans le cas contraire, il faudra appeler à nouveau **ARPResolve** pour envoyer une nouvelle requête.+Dans la fonction **etudiantSocketAppTask()**,​ à l'​intérieur de la tâche périodique à 1Hz, ajouter une machine à état **simple** ​(l'​état étant codé par une variable **static int**) ​permettant de faire des requêtes ARP avec la fonction **ARPResolve**. Ceci permet d'​envoyer une requette ARP avec l'​adresse IP passée en argument. Dans les appels suivants de la fonction** etudiantSocketAppTask()**,​ il vous faudra tester si **ARPIsResolved** a renvoyé **TRUE**, ce qui signifie que la réponse ARP est arrivée et donc que le champ adresse MAC est mis à jour. Dans ce cas il faudra ouvrir le socket (une seule fois) puis effectuer l'​envoi des données comme dans l'​exercice précédent. Dans le cas contraire, il faudra appeler à nouveau **ARPResolve** pour envoyer une nouvelle requête. 
  
 <color red> <color red>
 Il est important que la fonction **etudiantSocketAppTask()** soit NON BLOQUANTE!</​color>​ Il est important que la fonction **etudiantSocketAppTask()** soit NON BLOQUANTE!</​color>​
  
-<​graphviz dot 500x90>+<​graphviz dot 350x90>
 ////////////////////////////////////////////////////////////////////////////////​ ////////////////////////////////////////////////////////////////////////////////​
 // Finite State Machine .dot diagram autogenerated by FsmProcess V 1.0 B. VANDEPORTAELE LAAS-CNRS 2016 // Finite State Machine .dot diagram autogenerated by FsmProcess V 1.0 B. VANDEPORTAELE LAAS-CNRS 2016
Ligne 525: Ligne 526:
  
  
 +Pour débugger, vous pourrez afficher l'​adresse IP demandée dans la requête ARP à l'aide de: 
 +  sprintf(chaine,​ "​ARPResolve adresse IP= %d.%d.%d.%d\n",​ myRemoteNode.IPAddr.v[0],​ myRemoteNode.IPAddr.v[1],​ myRemoteNode.IPAddr.v[2],​ myRemoteNode.IPAddr.v[3]);​
 +  DBPRINTF(chaine);​
 +Puis afficher l'​adresse MAC obtenue à l'aide de 
 +  sprintf(chaine,​ "ARP OK: adresse mac= %02x:​%02x:​%02x:​%02x:​%02x:​%02x\n",​ myRemoteNode.MACAddr.v[0],​ myRemoteNode.MACAddr.v[1],​ myRemoteNode.MACAddr.v[2],​ myRemoteNode.MACAddr.v[3],​ myRemoteNode.MACAddr.v[4],​ myRemoteNode.MACAddr.v[5]);​
 +  DBPRINTF(chaine);​
 +        ​
  
  
tppic.1552587573.txt.gz · Dernière modification: 2019/03/14 19:19 par bvandepo