Добавление маршрута в таблицу маршрутизации с помощью агента - PullRequest
3 голосов
/ 07 мая 2019

Мы планировали сделать последний год проекта в области протокол подводной маршрутизации (многошаговая связь) с использованием UnetStack. В запланированном протоколе маршрутизации каждый узел должен выбрать свой следующий переход из множества доступных соседей. Прежде чем углубляться в выбор алгоритма следующего перехода, я хотел бы посмотреть, как я могу настроить выбранный следующий переход в таблице маршрутизации, используя UnetStack. Для этой цели я установил 5 узлов. Узлы 1 и 5 являются узлами назначения и источника соответственно. Соседи узла 5 - это узлы 3 и 4. Из соседей 3 и 4 я бы хотел выбрать узел 3 в качестве следующего перехода узла 5 для достижения пункта назначения. Я не могу добавить узел 3 в качестве следующего перехода на узле 5. Это будет полезно, если вы предоставите какие-либо входные данные по этому поводу.

Я написал сценарий моделирования следующим образом:

channel.soundSpeed = 1500.mps           // c
channel.communicationRange = 100.m     // Rc

// run the simulation infinately
simulate  {
 // Destination node
node '1', remote: 1101, address: 1, location: [ 0.m, 0.m, 0.m], shell: true, stack: { container ->
container.add 'routing', new org.arl.unet.net.Router();
container.add 'rdp', new org.arl.unet.net.RouteDiscoveryProtocol();  
} 

node '2', remote: 1102, address: 2, location: [ 0.m, 0.m, -75.m], shell: 5102, stack: { container ->
container.add 'new_routing_agent', new new_routing_agent();
container.add 'routing', new org.arl.unet.net.Router();  
container.add 'rdp', new org.arl.unet.net.RouteDiscoveryProtocol();
}    

 // neighbor node for node 5, and will be a next node for node 5 during routing
node '3', remote: 1103, address: 3, location: [0.m, 0.m, -90.m], shell: 5103, stack: { container ->
container.add 'new_routing_agent', new new_routing_agent();
container.add 'routing', new org.arl.unet.net.Router();  container.add 'rdp', new org.arl.unet.net.RouteDiscoveryProtocol();   
}

//Neighbor node for node 5 ,but not a next node for node 5
 node '4', remote: 1104, address: 4, location: [0.m, 0.m, -150.m], shell: 5104, stack: {container ->
container.add 'new_routing_agent', new new_routing_agent();
container.add 'routing', new org.arl.unet.net.Router();
container.add 'rdp', new org.arl.unet.net.RouteDiscoveryProtocol();    
}

// Source node
node '5', remote: 1105, address: 5, location: [0.m, 0.m, -160.m], shell: 5105, stack: {container ->
container.add 'new_routing_agent', new new_routing_agent();
container.add 'routing', new org.arl.unet.net.Router();
container.add 'rdp', new org.arl.unet.net.RouteDiscoveryProtocol();    
  }
}

Агент: new_routing_agent следующим образом:

class new_routing_agent extends UnetAgent {
    def router;
    int addr;  
        // STARTUP  
   void startup() 
    {

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

        router = agentForService Services.ROUTING;
        subscribe topic(router);

        def nodeInfo = agentForService Services.NODE_INFO;
        addr = nodeInfo.address; // obtain the address of the node

        def rdp = agentForService org.arl.unet.Services.ROUTE_MAINTENANCE
        def rsp = rdp << new RouteDiscoveryReq(1)      // discover routes to node 1

    }

    void processMessage(Message msg) {  
    if (msg instanceof RouteDiscoveryNtf )  
    { 
        if (addr == 5)
        addroute 1, 3 ;

        else if (addr == 4)
        addroute 1, 2;

        else 
          addroute 1,1;     
    }  //End of if   
} //End of processMessage
} // End of class

1 Ответ

2 голосов
/ 08 мая 2019

Агент Router - это все, что вам нужно, если вы планируете заполнить свои собственные маршруты. Чтобы добавить маршрут, вы отправляете RouteDiscoveryNtf агенту маршрутизатора. Это то, что делает команда addroute, но она работает только в оболочке (не в агенте).

Этот простой пример кода показывает, как вы можете реализовать свои собственные addroute():

void addroute(int to, int via) {
  def router = agentForService Services.ROUTING
  router.send new RouteDiscoveryNtf(to: to, nextHop: via)
}

Агент RouteDiscoveryProtocol управляет маршрутами для вас, что, возможно, не то, что вам нужно, если вы разрабатываете свой собственный протокол маршрутизации.

...