Как получить оставшуюся энергию всех соседних узлов в Unetstack? - PullRequest
1 голос
/ 28 июня 2019

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

Как реализовать это и как запрашивающий узел будет извлекать все полученные значения энергии из разных соседних узлов?

Это моя энергетическая модель:

import org.arl.fjage.*
import org.arl.unet.*
import org.arl.unet.phy.*
import java.math.*
import Java.util.*

class EnergyModel extends UnetAgent {

int neighbor, addr
float neighbor_distance;
def ranging
def  init_energy = 10
def dist
def data
def depth
def C = 1.3312e-9       // empirical constant
static def Tot_bits
def fr = 10           //carrier freq.(Khz)
def d = 0.036*Math.pow(fr,1.5)    //Thorp's constant
static def source

static HashMap<Integer, Integer[]> map = new HashMap<>(); 

def sum=0.0,avg=0.0,count=0;

 public void startup() {
  AgentID phy = agentForService(Services.PHYSICAL);
  subscribe (topic(phy));

  ranging = agentForService Services.RANGING;
  subscribe topic(ranging);

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

  depth = nodeInfo.location[2] 
  map.put(addr, nodeInfo.location); 

  }

 public void processMessage(Message msg) {

   if (msg instanceof DatagramFailureNtf){

   System.out.println "\n\tDatagramFailureNtf occured!!\nt"+msg.toString()
    println "\n\t BadFrameNtf occured !!!!\n\t"+msg.toString()

  }

   if (msg instanceof DatagramNtf && msg.protocol == Protocol.DATA) {              
       count++  

       neighbor = msg.from;
       source = msg.from;
       data = msg.getData()
       int[] loc1 = map.get(source)
       int[] loc2 = map.get(msg.getTo())
       def x = loc1[0] - loc2[0]
       def y = loc1[1] - loc2[1]
       def distance = Math.sqrt((x)*(x) +(y)*(y));
       def bits=32
       Tot_bits = bits*data.size()

       System.out.println "\n\tNumber of bits sent :"+Tot_bits

       dist = distance/1000.0      // converting the distance in Km.

       BigDecimal Tx_EG = new BigDecimal("1"); // Or BigInteger.ONE 

    Tx_EG = Tx_EG.multiply(BigDecimal.valueOf(Tot_bits*50e-9+ Tot_bits*                 
        (0.001)*dist*(depth*-0.001)*C*Math.pow(Math.E,d*dist))); 
       init_energy = init_energy - Tx_EG ;
       sum = sum + Tx_EG 
       avg = sum/count

       String value = String.valueOf(Tx_EG.doubleValue());
       System.out.println '\n\tTransmission Energy : '+value+" Joules";
       System.out.println '\tRemaining Energy : '+(init_energy)

       File file = new File("I:\\out.txt")
       def text = file.getText()

       System.out.println "ENERGY: -t "+text+" -i "+source+" -d      
        "+Tot_bits+" -e "+init_energy+"   T"
       println "ENERGY: -t "+text+" -i "+source+" -d "+Tot_bits+" -e  
          "+init_energy+"   T"
                 }

       if (msg instanceof RxFrameNtf && msg.protocol == Protocol.DATA){

       data = msg.getData()       // getting data
       System.out.println "\tData is :"+data
       def bits=32
       Tot_bits = bits*data.size()      //caculating total number of bits
       System.out.println "\tNumber of bits received :"+Tot_bits

       BigDecimal Rx_EG = new BigDecimal("1"); // Or BigInteger.ONE 

       Rx_EG = Rx_EG.multiply(BigDecimal.valueOf(Tot_bits*50e-9));        
       init_energy = init_energy - Rx_EG ;                                
       String value = String.valueOf(Rx_EG.doubleValue());
       System.out.println '\n\tReception Energy : '+value+" Joules";
       System.out.println '\tRemaining Energy : '+(init_energy)
       System.out.println '\tTime : '+msg.getRxTime()
       System.out.println '\tNode ID : '+msg.getTo()
       System.out.println "ENERGY: -t "+msg.getRxTime()+" -i 
        "+msg.getTo()+" -d "+Tot_bits+" -e "+init_energy+"   R"
       println "ENERGY: -t "+msg.getRxTime()+" -i "+msg.getTo()+" -d 
        "+Tot_bits+" -e "+init_energy+"   R"

     }

  if (msg instanceof BadFrameNtf){

      System.out.println "\n\tBadFrameNtf occured !!!!\n\t"+msg.toString()
      println "\n\t BadFrameNtf occured !!!!\n\t"+msg.toString()

     }

   if (msg instanceof CollisionNtf){

      System.out.println "\n\tCollision occured !!!!\n\t"+msg.toString()
      println "\n\tCollision occured !!!!\n\t"+msg.toString()

       }

         }

           void setup() {

              }

        }

1 Ответ

1 голос
/ 01 июля 2019

Вам потребуется определить PDU для конкретного приложения, чтобы запросить эту информацию и предоставить эту информацию, и реализовать свой собственный протокол для ответа соответствующими PDU ответа при получении PDU запроса.Посмотрите, как написать свои собственные протоколы для конкретного приложения из примера ping (папка samples/ping в симуляторе) в руководстве разработчика.

Альтернативой может быть предоставление энергии в качестве параметра агента для PHY, изапросите его с помощью службы remote access , чтобы запросить его у RemoteParamReq.

...