2

I have written an Agent and added to node 1 to fetch PhysicalParameters (Propogation speed, nodes energy etc) of node 2 using RemoteGetParamReq which is working inside agents startup() method.How can I use RemoteGetParamReq inside agents processRequest() method as I want to get parameter values of remote node 2 when node 1 triggers a DatagramReq so that i can get latest parameter value.

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 Answers1

1

The processRequest() method should complete in order to respond to the requester, and so it isn't a good idea to make your parameter request inside it and wait. You can, however, trigger a request for the parameters to happen asynchronously by adding a OneShotBehavior something like this:

  @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

Side note: DatagramReq is perhaps not the right request to trigger this on, since it asks your agent to send a datagram. You may wish to define your own appropriately named request for this purpose for good programming style.

Mandar Chitre
  • 2,110
  • 6
  • 14
  • 1
    Thank you very much sir, but here the `RemoteGetParamReq` is not fetching `init_energy` parameter value of node 2 which I expected, instead it fetches the `init_energy` of the same node in which request is being made(in this case node 1). I have exposed the `init_energy` (which contains remaining energy of a node) as parameter of `PHY` by defining enumeration and also `getParameterList()` in my custom modem class, which calculates energy consumption. **Please help me to understand this.** – AKHILRAJ V GADAGKAR Jul 25 '19 at 12:03
  • 1
    `RemoteGetParamReq` fetches on remote node. `ParameterReq` fetches on local node. – Mandar Chitre Jul 26 '19 at 05:12