Я пытаюсь реализовать связь между набором узлов следующим образом:
- Узел № 0 начинает отправку широковещательного MSG соседним узлам с запросом указанного c значения переменной
- Оставшиеся узлы снова ответят этим значением на узел # 0
- Узел # 0 выберет 2 верхних наивысших узла
- Узел # 0 отправит им сообщение о присоединении для связи с ним и сформировать группу.
Проблемы:
Мои коды отбрасывают некоторые пакеты для отправки запросов.
это показывает некоторую дополнительную стоимость связи 6,66 мс. Я не знаю, откуда она взялась.
- Я не знаю, как позволить Node0 подождать некоторое время и возобновить обмен пакетами, чтобы обеспечить получение максимальных ответов от соседей https://i.stack.imgur.com/FmonE.png. [см. вывод кода] [1]
#include <Timer.h>
module ClusterFormingC{
uses{
interface Boot;
interface Packet;
interface AMPacket;
interface PacketAcknowledgements;
interface AMSend;
interface Receive;
interface SplitControl as AMControl;
interface Timer<TMilli> as Timer0;
}}
implementation{
//Global Variables
bool busy=0;
message_t packet,Packet1;
uint16_t energy_level=100;
uint16_t P1=-1;
uint16_t P2=-1;
uint16_t E1=-1;
uint16_t E2=-1;
uint16_t cluster_forming_status=0;
uint16_t trial=0;
uint16_t counter=0;
uint16_t count=0;
bool Join1=0;
bool Join2=0;
//CLUSTER FORMING TASKS SIGNATURES
task void SendReq();
task void SendResp();
task void SendForm();
task void SendJoin();
//INTERFACES EVENTS
event void Boot.booted(){
//Application Booted
call AMControl.start();
}
event void AMSend.sendDone(message_t *msg, error_t error){
if(&packet==msg && error==SUCCESS)
{}
}
event message_t * Receive.receive(message_t *msg, void *payload, uint8_t len){
cluster_msg_t* mess=(cluster_msg_t*)payload;
//REQ
if(mess->message_type==REQ)
{post SendResp();}
//RESP
if(mess->message_type==RESP)
{
if(mess->message_data>=E1)
{
if(E1>E2)
{
E2=E1;
P2=P1;
}
E1= mess->message_data;
P1=call AMPacket.source(msg);
}
else
if(mess->message_data >E2)
{E2= mess->message_data;
P2=call AMPacket.source(msg);
}
post SendForm();}
//if mess->message_type==RESP) update p1p2
return msg;
}
event void AMControl.stopDone(error_t error){
//DO NOTHING
}
event void AMControl.startDone(error_t error){
if(error==SUCCESS)
{
//Radio ON
if(TOS_NODE_ID==0)
{
post SendReq();
}
}
else
call AMControl.start();
}
event void Timer0.fired(){
//DO NOTHING
}
//CLUSTER FORMING TASKS IMPLEMENTATION
task void SendReq(){
//I'm node 1: Start send BROADCAST energy request packet
cluster_msg_t* mess=(cluster_msg_t*)(call Packet.getPayload(&packet, sizeof
(cluster_msg_t)));
mess->message_type=REQ;
mess->message_subtype=0;
mess->message_seq_id=0;
mess->message_data=0;
//call PacketAcknowledgements.requestAck(&packet);
if(call AMSend.send(AM_BROADCAST_ADDR,&packet,sizeof(cluster_msg_t))==SUCCESS)
{
//call Timer0.startOneShot(1000);
}}
task void SendResp(){
//I'm neighbors of node 1: Start send my energy level response packet
cluster_msg_t* mess=(cluster_msg_t*)(call Packet.getPayload(&packet, sizeof
(cluster_msg_t)));
mess->message_type=RESP;
mess->message_subtype=0;
mess->message_seq_id=0;
mess->message_data=energy_level;
//call PacketAcknowledgements.requestAck(&packet);
if(call AMSend.send(0,&packet,sizeof(cluster_msg_t))==SUCCESS){
}}
task void SendForm(){
//I'm node 1: Send form packets to p1 and p2
cluster_msg_t* mess=(cluster_msg_t*)(call Packet.getPayload(&packet, sizeof
(cluster_msg_t)));
mess->message_type=FORM;
mess->message_subtype=0;
mess->message_seq_id=0;
mess->message_data=0;
//call PacketAcknowledgements.requestAck(&packet);
if(call AMSend.send(3,&packet,sizeof(cluster_msg_t))==SUCCESS){
}
//if(call AMSend.send(4,&packet,sizeof(cluster_msg_t))==SUCCESS){
//}
}
task void SendJoin(){
//I'm p1 and p2
cluster_msg_t* mess=(cluster_msg_t*)(call Packet.getPayload(&packet, sizeof
(cluster_msg_t)));
mess->message_type=JOIN;
mess->message_subtype=0;
mess->message_seq_id=0;
mess->message_data=0;
//call PacketAcknowledgements.requestAck(&packet);
if(call AMSend.send(0,&packet,sizeof(cluster_msg_t))==SUCCESS){
}}