Annexe1
Code source de notre application :
//Développeurs Rais Hichem & Mekidiche Mohamed
//cet algorithme traite 3 ancres (les ancres sont 0 et 1 et 2) et
n noeuds tq n>=1
//lancer le shell et taper les cammandes suivantes
// cd /opt/tinyos-1.x/apps/dvhop3_n pour accéder
au répertoire qui contient notre application
//make pc pour compiler l'application
//export DBG=usr1 pour afficher notre message //export
PATH="$TOSROOT/tools/java/net/tinyos/sim:$PATH"
//TinyViz -run build/pc/main.exe 8 pour lancer la simulation
avec 8 noeuds
//cliquer sur le menu "Layout" puis "file load" et
sélectionner un fichier qui prend l'extention ".mps" (c'est une
topologie déja créée)
//pour un capteur qui envoie des messages seulement aux capteurs
qui ont dans sa zone de couverture: cliquer sur le menu plugins et
sélectionner "radio Model" puis décocher "out edges" puis cliquer
sur "update"
//cocher debug messages dans le menu plugins pour visualiser les
messages
includes DvhopMsg;//appler le fichier DvhopMsg.h qui contient la
structure de notre message
module DVhopM {
provide interface StdControl;//interface fournie
//interface utilisée
uses {
interface Timer;
interface Leds;
interface SendMsg as envoiMsg;
interface ReceiveMsg as RecoieMsg;
}
}
implémentation
{
float premier_hop_arriver;
DVhopMsg * pemission;//pointeur sur le message emis
DVhopMsg * poi;//pointeur sur le message reçu
TOS_Msg msg;//message emis
int hop[3][2];//tableau utilisé par chaque ancre pour
stoquer les hop d'autres ancres
bool ancre_recu[3][2];//tableau des boolean chaque ancre
reçoit les hop d'autre ancres
DVhopMsg * p;//pointeur sur le message emis aprés la
réception d'un message
bool noeud_reçu_avant[3];//par exemple si un noeud
reçoit un
message d'ancre 1 neud_reçu_avant[1] devient true(avant
de
calculer le hopsize)
bool affiche1,v,vv,vvv,r;//variable utilser pour afficher un
message une seule fois
float tab[3][2];//tableau pour stoquer les x et les y des
ancres
float hopsize[3];//tableau pour stoquer les hopsizes
int hop_noeud[3];//tableau utiliser par les noeuds pour
stoquer les hop des ancres
float L1L2,L0L2,L0L1;//les distances entre les ancres
int i,j,k;
bool neud_recu_apres[3];//par exemple si une noeud recoi un
message d'ancre 1 neud_recu_apres[1] devient true(apres de
calculer le hopsize)
command result_t StdControl.init() {
// initialisation des noeuds
pemission =( DVhopMsg* ) msg.data;// pointer sur le
message emis qui est de type TOS_Msg sur le champs data
switch(TOS_LOCAL_ADDRESS) {
case 0 : //si l'adreese du capteur=0 (TOS_LOCAL_ADDRESS=0)
pemission->id_ancre = 0; pemission->hop =0;
pemission->x = 81.75;
pemission->y = 41;
pemission->id_node=TOS_LOCAL_ADDRESS; pemission->hopsize=
0; break;
case 1 : //si l'adreese du capteur=1
(TOS_LOCAL_ADDRESS=1)
pemission->id_ancre = 1; pemission->hop =0;
pemission->x = 16.54; pemission->y = 33.01;
pemission->id_node=TOS_LOCAL_ADDRESS; pemission->hopsize=
0;
break;
case 2 : //si l'adreese du capteur=2 (TOS_LOCAL_ADDRESS=2)
pemission->id_ancre =2;
pemission->hop =0;
pemission->x = 47.76;
pemission->y = 66.02;
pemission->id_node=TOS_LOCAL_ADDRESS;
pemission->hopsize= 0;
break;
default: pemission->id_node=TOS_LOCAL_ADDRESS;
pemission->id_ancre =100;// les autres noeuds prends la
valeur 100 par exemple
pemission->hopsize= 0;
call Leds.init(); return SUCCESS;
}
}
command result_t StdControl.start() {
v=TRUE;vv=TRUE;vvv=TRUE;
//stocker les x et les y des ancres dans un tabeau
tab[0][0]=81.75;
tab[0][1]=41;
tab[1][0]=16.54; tab[1][1]= 33.01;
tab[2][0]=47.76; tab[2][1]=66.02;
//le calcule des distances entres les ancres
L0L1= sqrt(pow((tab[0][0]-tab[1][0]),2)+
pow((tab[0][1]-tab[1][1]),2));
L0L2= sqrt(pow((tab[0][0]-tab[2][0]),2)+
pow((tab[0][1]-tab[2][1]),2));
L1L2= sqrt(pow((tab[1][0]-tab[2][0]),2)+
pow((tab[0][1]-tab[2][1]),2));
if(TOS_LOCAL_ADDRESS==0){
dbg(DBG_USR1, "La distance entre les ancres 0 et 1=
%f\n",L0L1);
dbg(DBG_USR1, "La distance entre les ancres 0 et 2=
%f\n",L0L2);
dbg(DBG_USR1, "La distance entre les ancres 1 et 2=
%f\n",L1L2);
}
for(i=0;i<=2;i++) for(j=0;j<2;j++)
ancre_recu[i][j]=FALSE;
for(i=0;i<=2;i++){ neud_recu_avant[i]=TRUE;
neud_recu_apres[i]=FALSE;
}
affiche1=TRUE;
k=0;r=FALSE;
premier_hop_arriver=0;
call Timer.start(TIMER_REPEAT, 2000);// envoyer un
message apres chaque 2 secondes
return SUCCESS;
}
command result_t StdControl.stop() { call Timer.stop();
return SUCCESS;
}
event result_t envoiMsg.sendDone(TOS_MsgPtr sent, result_t
success) {
call Leds.redOff();
return SUCCESS;
}
event result_t Timer.fired() {
atomic {
if( k<15){
k=k+1;
//dbg(DBG_USR1, "bien envoyer\n");
if (call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg)== SUCCESS)
{
call Leds.yellowToggle(); }else {call Leds.redToggle();
dbg(DBG_USR1, "echec\n");
}
}
}
return SUCCESS;
}
event TOS_MsgPtr RecoieMsg.receive(TOS_MsgPtr m) {
// reception d'un message
call Leds.greenToggle();
atomic {
poi = (DVhopMsg*) m->data;// pointeur sur le message
reçu
p =( DVhopMsg* ) msg.data;// pointeur sur le message emis
switch(TOS LOCAL ADDRESS) {
_
_
case 0 :
atomic{
if( (ancre_recu[0][0]==FALSE) && (poi->id_ancre==1)
){//si
l'ancre 0 reçoit un message d'ancre 1
ancre_recu[0][0]=TRUE;
hop[0][0]=poi->hop+1;
dbg(DBG_USR1, "le hop 00=%d reçu a partir de%d
id_node=%d\n", hop[0][0],poi->id_ancre,poi->id_node);
}
else if( (ancre_recu[0][1]==FALSE)
&&(poi>id_ancre==2)){ //si l'ancre 0 reçoit
un message d'ancre 2
ancre_recu[0][1]=TRUE;
hop[0][1]=poi->hop+1;
dbg(DBG_USR1, "le hop 01=%d recue a partir de%d idnode=%d\n",
hop[0][1],poi->id_ancre,poi->id_node); }
if( (ancre_recu[0][0]==TRUE)
&&(ancre_recu[0][1]==TRUE)&& (v==TRUE)){//si l'ancre 0
reçoit un message d'ancre 1 et 2 alors on calcule le hopsize
v=FALSE;
hopsize[0]=((L0L1+L0L2)/(hop[0][0]+hop[0][1]));
dbg(DBG_USR1, "le hopsize de L0=%f\n",hopsize[0]);
//envoyer un broadcast avec les info suivants
p->hopsize= hopsize[0];
//p->hop=0;
p->id_ancre=0;
for(i=0;i<12;i++)
if (call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg)== SUCCESS)
call Leds.redOn();
}
}
break;
case 1 :
atomic{
if( (ancre_recu[1][0]==FALSE) && (poi->id_ancre==0)
){
ancre_recu[1][0]=TRUE;
hop[1][0]=poi->hop+1;
dbg(DBG_USR1, "le hop 10=%d recue a partir de %d
idnode=%d\n", hop[1][0],poi->id_ancre,poi->id_node);
}
else if( (ancre_recu[1][1]==FALSE)
&&(poi->id_ancre==2)){ ancre_recu[1][1]=TRUE;
hop[1][1]=poi->hop+1;
dbg(DBG_USR1, "le hop 11=%d recue a partir de%d idode=%d\n",
hop[1][1],poi->id_ancre,poi->id_node);
}
if( (ancre_recu[1][0]==TRUE)
&&(ancre_recu[1][1]==TRUE)&& (vv==TRUE)){
vv=FALSE;
hopsize[1]=((L0L1+L1L2)/(hop[1][0]+hop[1][1])); dbg(DBG_USR1, "le
hopsize de L1=%f\n",hopsize[1]); p->hopsize= hopsize[1];
//p->hop=0;
p->id_ancre=1;
for(i=0;i<8;i++)
if (call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg)== SUCCESS)
call Leds.redOn();
}
}
break;
case 2 :
atomic{
if( (ancre_recu[2][0]==FALSE) && (poi->id_ancre==0)
){
ancre_recu[2][0]=TRUE;
hop[2][0]=poi->hop+1;
dbg(DBG_USR1, "le hop 20=%d recue a partir de%d idnode=%d\n",
hop[2][0],poi->id_ancre,poi->id_node);
}
else if( (ancre_recu[2][1]==FALSE)
&&(poi->id_ancre==1)){ ancre_recu[2][1]=TRUE;
hop[2][1]=poi->hop+1;
dbg(DBG_USR1, "le hop 21=%d recue a partir de %d idnode=%d\n",
hop[2][1],poi->id_ancre,poi->id_node); }
if( (ancre_recu[2][0]==TRUE)
&&(ancre_recu[2][1]==TRUE)&& (vvv==TRUE)){
vvv=FALSE;
hopsize[2]=((L0L2+L1L2)/(hop[2][0]+hop[2][1])); dbg(DBG_USR1, "le
hopsize de L2=%f\n",hopsize[2]); p->hopsize= hopsize[2];
// p->hop=0;
p->id_ancre=2;
for(i=0;i<12;i++)
if (call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg)== SUCCESS)
call Leds.redOn(); }
}
break;
default :
atomic{
if( poi->hopsize!=0 ){// si le hopsize est calculer
if((r==FALSE) && (poi->id_ancre<3) ){
r=TRUE;
premier_hop_arriver=poi->hopsize;
dbg(DBG_USR1, "le premier hopsize reçu = %f a partir de
noeud %d elle a id_ancre= %d\n",premier_hop_arriver,poi-
>id_node,poi->id_ancre);
}
if( (neud_recu_avant[0]==TRUE) && (poi->id_ancre==0)
){// si le message reçue a id_ancre=0 neud_recu_avant[0]=FALSE;
hop_noeud[0]=poi->hop+1;
//dbg(DBG_USR1, "le hopsize reçu=%f a partir de %d et
idnode=%d\n",poi->hopsize,poi->id_ancre,poi->id_node);
dbg(DBG_USR1, "le hop 30=%d recue a partir de %d et
idnode=%d\n",
hop_noeud[0],poi->id_ancre,poi->id_node);
hopsize[0]=poi->hopsize;
p->hopsize= poi->hopsize;
p->id_ancre=0;
p->id_node=TOS_LOCAL_ADDRESS;
p->hop=poi->hop+1;
for(i=0;i<8;i++)
if (call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg)== SUCCESS)
call Leds.redOn();
}
else if( (neud_recu_avant[1]==TRUE)
&&(poi->id_ancre==1)){ neud_recu_avant[1]=FALSE;
hop_noeud[1]=poi->hop+1;
dbg(DBG_USR1, "le hop 31=%d reçue a partir de %d et
idnode=%d\n", hop_noeud[1],poi->id_ancre,poi->id_node);
p->hopsize= poi->hopsize;
hopsize[1]=poi->hopsize;
p->id_ancre=1;
p->id_node=TOS_LOCAL_ADDRESS;
p->hop=hop_noeud[1];
for(i=0;i<12;i++)
if (call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg)== SUCCESS)
call Leds.redOn();
}
else if( (neud_recu_avant[2]==TRUE)
&&(poi->id_ancre==2)){
neud_recu_avant[2]=FALSE;
hop_noeud[2]=poi->hop+1;
//dbg(DBG_USR1, "le hopsize reçu=%f a partir de %d et
idnode=%d\n",poi->hopsize,poi->id_ancre,poi->id_node);
dbg(DBG_USR1, "le hop 32=%d recue a partir de %d et
idnode=%d\n", hop_noeud[2],poi->id_ancre,poi->id_node);
hopsize[2]=poi->hopsize; p->hopsize= poi->hopsize;
p->id_ancre=2; p->hop=hop_noeud[2]; p->id_node=TOS_LOCAL_ADDRESS;
for(i=0;i<12;i++)
if (call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg)== SUCCESS)
call Leds.redOn();
}
if(affiche1==TRUE && neud_recu_avant[0]==FALSE &&
neud_recu_avant[1]==FALSE && neud_recu_avant[2]==FALSE ){//si on a
reçoit les hop de tous les ancres
affiche1=FALSE;//variable pour afficher le min une seule fois
dbg(DBG_USR1, "la distance entre %d et ancre 0
=%f\n",TOS_LOCAL_ADDRESS,premier_hop_arriver*hop_noeud[0]); dbg(DBG_USR1, "la
distance entre %d et ancre 1
=%f\n",TOS_LOCAL_ADDRESS,premier_hop_arriver*hop_noeud[1]); dbg(DBG_USR1, "la
distance entre %d et ancre 2
=%f\n",TOS_LOCAL_ADDRESS,premier_hop_arriver*hop_noeud[2]); }
}
else if (poi->hopsize==0) {//le hopesize n'est pas encore
calculer
if(poi->id_ancre<3) {
if((poi->id_ancre==0)&&(neud_recu_apres[0]==FALSE)){
neud_recu_apres[0]=TRUE;
p->hopsize=0;
p->id_ancre=poi->id_ancre;
p->hop=poi->hop+1;
p->id_node=TOS_LOCAL_ADDRESS;
for(i=0;i<12;i++)
call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg);
}
else
if((poi>id_ancre==1)&&(neud_recu_apres[1]==FALSE)){
neud_recu_apres[1]=TRUE;
p->id_ancre=poi->id_ancre;
p->hopsize=0;
p->id_node=TOS_LOCAL_ADDRESS;
p->hop=poi->hop+1;
for(i=0;i<8;i++)
call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg), &msg);
}
else
if((poi>id_ancre==2)&&(neud_recu_apres[2]==FALSE)){
neud_recu_apres[2]=TRUE;
p->id_ancre=poi->id_ancre;
p->hopsize=0;
p->id_node=TOS_LOCAL_ADDRESS;
p->hop=poi->hop+1;
for(i=0;i<12;i++)
call envoiMsg.send(TOS_BCAST_ADDR, sizeof( DVhopMsg),
&msg);
}
}
}
}
break;
}
}
return m;
}
}
|