Формирование связи группы узлов - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь реализовать связь между набором узлов следующим образом:

  1. Узел № 0 начинает отправку широковещательного MSG соседним узлам с запросом указанного c значения переменной
  2. Оставшиеся узлы снова ответят этим значением на узел # 0
  3. Узел # 0 выберет 2 верхних наивысших узла
  4. Узел # 0 отправит им сообщение о присоединении для связи с ним и сформировать группу.

Проблемы:

  1. Мои коды отбрасывают некоторые пакеты для отправки запросов.

  2. это показывает некоторую дополнительную стоимость связи 6,66 мс. Я не знаю, откуда она взялась.

  3. Я не знаю, как позволить 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){
    }}
    
...