Нахождение расстояния между двумя узлами с использованием unetstack и скрипта groovy - PullRequest
2 голосов
/ 15 апреля 2019

Я реализую протокол маршрутизации для подводных сетей связи, основанный на расстоянии между соседними узлами. Я создал агент и написал скрипт для определения расстояния между соседними узлами с помощью агента ранжирования, но я получаю сообщение об ошибке

Нет такого свойства: в пределах класса :.

Я приложу написанные мной сценарии.

  1. 3-node-network_test.groovy: это сценарий моделирования, в котором я развернул 3 узла. Узел 1 является узлом приемника, в котором будет выполняться агент ранжирования и сценарий приемника. Узлы 2 и 3 работают с «агентом ранжирования» и «агентом_узла».
  2. sink.groovy: инициализирует процесс передачи маяка, передавая маяк.
  3. node_agent: который получает маяк от приемника и определяет расстояние до приемника. Здесь я написал скрипт, чтобы найти расстояние для погружения, используя:

полный скрипт. как найти расстояние в unetstack?

3-узловой-network_test.groovy: * 1 020 * //! Simulation: Simple 3-node network import org.arl.fjage.* // run the simulation forever simulate { node '1', remote: 1101, address: 1, location: [ 0.km, 0.km, -15.m], shell: true, stack: {container -> container.add 'ranging', new org.arl.unet.phy.Ranging() container.shell.addInitrc "${script.parent}/sink.groovy" } node '2', remote: 1102, address: 2, location: [ 1.km, 0.km, -15.m], shell: 5102, stack: {container -> container.add 'ranging', new org.arl.unet.phy.Ranging(); //container.shell.addInitrc "${script.parent}/sink.groovy" container.add 'node_agent', new node_agent(); } node '3', remote: 1103, address: 3, location: [-1.km, 0.km, -15.m], shell: 5103, stack: { container -> container.add 'ranging', new org.arl.unet.phy.Ranging() container.add 'node_agent', new node_agent(); } } Sink.groovy:

import org.arl.unet.*
import org.arl.unet.phy.*
import org.arl.unet.mac.*
//import org.arl.unet.nodeinfo.NodeInfo
import org.arl.unet.PDU 
import org.arl.fjage.*
import static org.arl.unet.Services.*
import static org.arl.unet.phy.Physical.*
import org.arl.unet.phy.Ranging.*


int hc = 0, ad;
float neighbor_dist;
float rang

subscribe phy;
send = { count = 1 ->

    println ''' BROADCASTING '''
    count.times {

          phy << new DatagramReq(to: Address.BROADCAST, protocol: Protocol.MAC, data: [node.address, hc, 0]);

        }

}

node_agent.groovy:

import org.arl.fjage.Message
import org.arl.unet.*
import org.arl.unet.net.Router
import org.arl.unet.phy.*
import org.arl.unet.mac.*
import org.arl.fjage.RealTimePlatform
import org.arl.unet.nodeinfo.NodeInfo
import org.arl.fjage.*
import org.arl.unet.phy.Ranging.*
import org.arl.unet.phy.RangeNtf.*
import org.arl.unet.phy.RangeReq 


class node_agent extends UnetAgent {
  int neighbor, addr;
    float neighbor_distance;

    void startup() 
    {

      def phy = agentForService Services.PHYSICAL;
      subscribe topic(phy);

      def rang = agentForService Services.RANGING;
      subscribe topic(rang);

      def nodeInfo = agentForService Services.NODE_INFO;
      addr = nodeInfo.address;

    }

    void processMessage(Message msg) {

    if (msg instanceof DatagramNtf && msg.protocol == Protocol.MAC)
    {     
      neighbor = msg.from;
      println " BEACON RECEIVED FROM:" +neighbor
      ranging<< new RangeReq(to: neighbor);   

      }

    else if (msg instanceof RangeNtf )
    {   

        float neighbor_distance = msg.getRange();
        println " Distance between node "+addr + " and neighbor" +neighbor+ "is" + neighbor_dis

    }  // End of if*/
    else {

    }
   }  //End of process message
}

1 Ответ

1 голос
/ 17 апреля 2019

RangeReq необходимо отправить агенту ранжирования.Вы можете получить агента, используя agentForService Services.RANGING.Так как вы все равно ищете его в startup(), вы можете сохранить его в атрибуте и использовать позже для запроса диапазона.Что-то вроде:

def ranging

void startup() 
{
         :
      ranging = agentForService Services.RANGING;
         :
}

void processMessage(Message msg)
{
      if (msg instanceof DatagramNtf && msg.protocol == Protocol.MAC)
      {     
        neighbor = msg.from;
        println " BEACON RECEIVED FROM:" +neighbor
        ranging << new RangeReq(to: neighbor);
      }
      else if (msg instanceof RangeNtf )
      {   
        float neighbor_distance = msg.getRange();
           :
     }
   }
}
...