Как получить параметр удаленного узла, используя RemoteGetParamReq в processRequest агента - PullRequest
1 голос
/ 09 июля 2019

Я написал агента и добавил к узлу 1 для извлечения PhysicalParameters (скорость распространения, энергия узлов и т. Д.) Узла 2, используя RemoteGetParamReq, который работает внутри метода startup () агентов. Как я могу использовать RemoteGetParamReq внутри агентов processRequest ()так как я хочу получить значения параметров удаленного узла 2, когда узел 1 запускает DatagramReq, чтобы я мог получить последнее значение параметра.

class MyRemoteParam extends UnetAgent {
AgentID phy,rmt
RemoteGetParamReq req
Message rsp

@Override
   protected void setup() {
    super.setup()
    register(Services.PHYSICAL);
        register(Services.DATAGRAM);
   }

void startup() {

    phy = agentForService Services.PHYSICAL
    rmt= agentForService Services.REMOTE
    req = new RemoteGetParamReq();
    req.setRecipient(rmt);
    req.setRemoteAgentID(phy);
    req.setTo(2);
    req.get(PhysicalParam.propagationSpeed);
    req.get(PhysicalParam.timestampedTxDelay);
    req.get(MyEnergyParameters.init_energy);
    rsp = phy.request(req, 2000);
    System.out.println "Node 2 propogation speed:"+rsp.get(PhysicalParam.propagationSpeed)
    System.out.println "Node 2 energy:"+rsp.get(MyEnergyParameters.init_energy)


}

 @Override
  Message processRequest(Message msg) { 
  if (msg instanceof DatagramReq) {

    req = new RemoteGetParamReq();  
    req.setRecipient(rmt);
    req.setRemoteAgentID(phy);
    req.setTo(2);
    req.get(PhysicalParam.propagationSpeed);
    req.get(PhysicalParam.timestampedTxDelay);
    req.get(MyEnergyParameters.init_energy);
    rsp = phy.request(req, 2000);
    System.out.println "Node 2 propogation         speed:"+rsp.get(PhysicalParam.propagationSpeed)
    System.out.println "Node 2     energy:"+rsp.get(MyEnergyParameters.init_energy) 

    return new Message(msg, Performative.AGREE)
  }
  return null
 }//end of processrequest

}//end of MyRemoteParam class

1 Ответ

0 голосов
/ 20 июля 2019

Метод processRequest() должен завершиться, чтобы ответить запрашивающей стороне, и поэтому не стоит делать запрос параметров внутри него и ждать.Вы можете, однако, инициировать запрос на асинхронное выполнение параметров, добавив OneShotBehavior что-то вроде этого:

  @Override
  Message processRequest(Message msg) {
    if (msg instanceof DatagramReq) {
      add(new OneShotBehavior() {
        @Override
        public void action() {
          req = new RemoteGetParamReq();  
          req.setRecipient(rmt);
          req.setRemoteAgentID(phy);
          req.setTo(2);
          req.get(PhysicalParam.propagationSpeed);
          req.get(PhysicalParam.timestampedTxDelay);
          req.get(MyEnergyParameters.init_energy);
          rsp = phy.request(req, 2000);
          System.out.println "Node 2 propogation speed:"+rsp.get(PhysicalParam.propagationSpeed)
          System.out.println "Node 2 energy:"+rsp.get(MyEnergyParameters.init_energy)
        } // action
      } // one shot behavior
      return new Message(msg, Performative.AGREE)
    }
    return null
  } // process request

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

...