TD Contiki PDF
TD Contiki PDF
cd /examples/hello-world
6. Compilez le code pour la plateforme native (utilisée lorsqu’aucune mote n’est connectée à
l’ordinateur).
make TARGET=native
7. Une fois la compilation terminée, lancez le programme Hello World.
./hello-world.native
9. Le code paraîtra suspendu, cependant il tourne toujours sur Contiki, mais il ne produit
aucune sortie car le programme Hello World est fini. Pressez Ctrl-C pour quitter.
3. Exemple de Broadcast
Cet exemple montre comment programmer une communication de type Broadcast à l’aide de la
stack Rime (http://contiki.sourceforge.net/docs/2.6/a01798.html) et comment encapsuler des
données dans des paquets.
L’objectif de cet exemple est de tester la couche de diffusion (broadcast layer) dans Rime. Un coup
d’oeil à core/net/rime/broadcast.h et core/net/rime/broadcast.c aide à comprendre les
concepts sous-jacents de cet exemple. Dans le code, un processus appelé
example_broadcast_process est démarré par AUTOSTART_PROCESSES.
Macros et Structures
PROCESS(name,strname)
Chaque process doit être défini via la macro PROCESS. PROCESS possède deux arguments: la
variable de la structure process, et un nom lisible dans une chaîne de caractère, utilisée pour le
debugging.
• name: The variable name of the process structure.
• strname: The string representation of the process name.
Un processus dans Contiki consiste en une référence unique à un "protothread". Cette fonction est
utilisée pour definir le protothread d’un processus. Le processus est appelé lorsqu’un évènement à
lieu dans le système. Chaque processus dans le module nécessite un gestionnaire d’évènement
(event handler) sous la macro PROCESS_THREAD.
• name: The variable name of the process structure.
• process_event_t: The variable of type character.If this variable is same as
PROCESS_EVENT_EXIT then PROCESS_EXITHANDLER is invoked.
PROCESS_EXITHANDLER(handler)
Définit une action lorsqu’un processus termine (exits). NOTE: cette declaration doit venir
immediatement avant la macro PROCESS_BEGIN().
• handler: The action to be performed.
PROCESS_BEGIN()
Cette macro definit le début d’un processus, et doit toujours apparaître dans une definition de
PROCESS_THREAD(). Cette macro initie PT_BEGIN(), qui est declarée au point de départ d’un
protothread. Toutes les instructions C situées avant l’ invocation de PT_BEGIN() seront executées à
chaque fois que le protothread est schedulé.
broadcast_close(struct broadcast_conn *)
Cette fonction ferme une connection broadcast qui a été préalablement ouverte avec
broadcast_open(). Cette fonction est typiquement appelée comme gestionnaire de sortie (exit
handler).
• broadcast_conn : This is same as the variable from broadcast_recv().
PROCESS_END()
Cette macro definit la fin d’un processus. Elle doit apparaitre dans la definition d’un
PROCESS_THREAD() et doit toujours être incluse. Le processus termine lorsque la macro
PROCESS_END() est atteinte. Cette macro initie PT_END(). Elle doit toujours être utilisée avec
une macro PT_BEGIN() correspondante.
broadcast_open(struct broadcast_conn *,
uint16_t, const struct broadcast_callbacks *)
Initie une connexion broadcast identifiée de type best-effort. L’appelant va allouer de la mémoire
pour la structure struct broadcast_conn, habituellement en la déclarant comme une variable
statique. Le pointeur struct broadcast_callbacks * pointe vers une structure contenant un
pointeur vers une (ou plusieurs) fonction qui sera appelée lorsqu’un paquet arrive sur le canal. Cette
fonction ouvre une connexion du type abc_conn. Aussi, elle pointe vers la fonction
channel_set_attributes().
• broadcast_conn : A pointer to a struct broadcast_conn
• uint16_t: The channel on which the connection will operate
• broadcast_callbacks : A struct broadcast_callbacks with function pointers to functions that
will be called when a packet has been received
Cette fonction est utilisée pour fixer un timer d’évènement pour un temps situé quelque part dans le
futur. Lorsque le timer expire, l’évènement PROCESS_EVENT_TIMER sera envoyé (posted) au
processus qui a appelé la fonction.
• etimer : A pointer to the event timer
• clock_time_t : The interval before the timer expires.
static struct broadcast_conn
Le module broadcast envoie un paquet à tous les voisins de la zone locale avec un entête qui
identifie l’émetteur. Il ajoute aussi une adresse single-hop, comme attribut de paquet, aux paquets
sortants. La structure broadcast_conn consiste en deux structures
• abc_conn struct: the abc(Anonymous Best-effort local area Broadcast) module sends packets
to all local area neighbors. It uses one channel.
• broadcast_callbacks struct: this is called when a packet has been received by the broadcast
module. The struct broadcast_callbacks pointer is used in broadcast_open to point to a
function that will be called when a packet arrives on the channel.
4. Utilisation de RPL
Description de la pile réseau de Contiki :
http://anrg.usc.edu/contiki/index.php/Network_Stack
RPL est le protocole de routage IPv6 pour les réseaux LLN (Low-power Lossy Networks : réseaux
à basse puissance avec pertes). LLNs sont une classe de réseaux dans lesquels les routeurs et les
hôtes sont constraints. Les routeurs LLN opèrent typiquement avec des contraintes sur la puissance
de calcul, la mémoire, et l’énergie. RPL fournit un mécanisme permettant le trafic multipoint-à-
point depuis les équipements (devices) dans le LLN vers un point de contrôle central, de même que
pour le trafic point-à-multipoint du point de contrôle central vers les devices dans le LLN. Le
support du trafic point-à-point est aussi disponible.
Dans cet exemple, UDP est implémenté au dessus de RPL. Un LLN possède un serveur UDP, qui
accepte les paquets disponibles, et plusieurs clients UDP, qui envoient des paquets périodiquement
au serveur au travers d’un saut simple (single-hop) ou de sauts multiples (multi-hops).
Code source :
~/contiki-2.7/examples/ipv6/rpl-udp/udp-server.c
~/contiki-2.7/examples/ipv6/rpl-udp/udp-client.c
~/contiki-2.7/core/net/tcpip.c
~/contiki-2.7/core/net/tcpip.h
Serveur UDP
if(uip_newdata()) {
appdata = (char *)uip_appdata;
appdata[uip_datalen()] = 0;
//print the data of packet
PRINTF("DATA recv '%s' from ", appdata);
PRINTF("%d",
UIP_IP_BUF->srcipaddr.u8[sizeof(UIP_IP_BUF->srcipaddr.u8) - 1]);
PRINTF("\n");
}
Client UDP
static void
send_packet(void *ptr)
{
static int seq_id;
char buf[MAX_PAYLOAD_LEN];
seq_id++;
PRINTF("DATA send to %d 'Hello %d'\n",
server_ipaddr.u8[sizeof(server_ipaddr.u8) - 1], seq_id);
sprintf(buf, "Hello %d from the client", seq_id);
//send packet through client_conn to UDP server
uip_udp_packet_sendto(client_conn, buf, strlen(buf),
&server_ipaddr, UIP_HTONS(UDP_SERVER_PORT));
}
1. Démarrer Cooja
Pour démarrer le simulateur, allez dans le dossier Contiki, naviguez vers le dossier /tools/cooja
et exécutez ‘ant’ pour lancer le simulateur :
4. Sortie
Les messages de sortie et de debug générés par les motes peuvent être vus dans la fenêtre Motes
Output. Vous pouvez filtrer les sorties avec l’ID d’un nœud : node_id afin d’observer un nœud
particulier. Vous pouvez aussi observer des messages de debug particulier en les filtrant. D’autres
fonctions utiles des Motes Output sont File, Edit et View. L’ option File permet de sauver la sortie
dans un fichier. L’ option Edit permet de copier la sortie – complète ou bien uniquement les
messages sélectionnés. Vous pouvez aussi effacer les messages en utilisant l’ option Clear all
messages.
Les messages de sortie sauvegardés dans un fichier peuvent être utilisésultérieurement pour
effectuer des observations et tracer des graphiques selon les objectifs de l’expérience.
5. Etude à réaliser
1. A l’aide des traces des messages envoyés par les motes visualisées dans Network avec une
vitesse ralentie et dans Mote Output et Radio Messages, determinez l’arbre de routage du
réseau. Donnez les valeurs du rang de chaque mote.
2. Supprimez 4 motes au hasard parmi celles situées au centre du réseau.
3. A l’aide des traces des messages envoyés par les motes restantes visualisées dans Network
avec une vitesse ralentie et dans Mote Output et Radio Messages, determinez le nouvel
arbre de routage du réseau.Donnez les valeurs du rang de chaque mote.
4. Que peut on en déduire sur la construction du DODAG ?