📄 linklayermodel.java
字号:
/****************************************************************************
*
* "Copyright (c) 2006 The University of Southern California"
* All rights reserved.
*
* Permission to use, copy, modify, and distribute all components of
* this software and its documentation for any purpose, without fee,
* and without written agreement is hereby granted,
* provided that the above copyright notice, the following two paragraphs
* and the author names appear in all copies of this software.
*
* NO REPRESENTATIONS ARE MADE ABOUT THE SUITABILITY OF THE SOFTWARE FOR ANY
* PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
*
* Neither the software developers, the Autonomous Network Research Group
* (ANRG), or USC, shall be liable for any damages suffered from using this
* software.
*
* Author: Marco Zuniga, Avinash Sridharan
* Director: Prof. Bhaskar Krishnamachari
* Autonomous Networks Reseach Group, University of Southern California
* http://ceng.usc.edu/~anrg
* Contact: marcozun@usc.edu
*
* Date last modified: 2004/07/02 marcozun
* Date last modified: 2006/02/05 asridhar
*
*
* Description: This file contains the code that generates the
* gains for all links in the network and noise floor values for
* all nodes.
*
****************************************************************************/
package net.tinyos.sim;
import java.io.*;
import java.util.*;
import java.text.DecimalFormat;
/**
* Stores channel, radio and topology parameters provided by user
* through the configuration file.
*/
class InputVariables {
// Channel parameters
double n; // path loss exponent
double sigma; // standard deviation shadowing variance
double d0; // reference distance
double pld0; // power decay for reference distance d0
// Radio parameters
double pn; // radio noise floor
double wgn; // white gaussian noise
// Covariance Matrix for hardware variance
double s11;
double s12;
double s21;
double s22;
// Topology parameters
int numNodes; // number of nodes
int top; // topology option
double grid; // grid unit
double Xterr; // X dimension of Terrain
double Yterr; // Y dimension of Terrain
String topFile; // file name with nodes' coordinates (user-defined)
// data directly derived from configuration file
double area; // area of the terrain
InputVariables() { // Constructor, loading default values
n = 3;
sigma = 3;
pld0 = 55;
d0 = 1;
pn = -105;
wgn = 4;
s11 = 3.7;
s12 = -3.3;
s21 = -3.3;
s22 = 6.0;
numNodes= 0;
top = 0;
Xterr = 0;
Yterr = 0;
topFile = "";
area = 0;
}
}
/**
* Stores nodes' coordinates, link gains and noise floor values for a given topology
*/
class OutputVariables {
double[] nodePosX; // X coordinate
double[] nodePosY; // Y coordinate
double[] outputpowervar; // output power
double[] noisefloor; // noise floor
double[][] linkGain; // link gain
OutputVariables(int numNodes) { // Constructor
nodePosX = new double[numNodes];
nodePosY = new double[numNodes];
outputpowervar = new double[numNodes];
noisefloor = new double[numNodes];
linkGain = new double[numNodes][numNodes];
}
}
/**
* Simulates gains for all links of a specific topology, and noise
* floor values for all nodes. <p>The link gain between nodes A and B
* is defined as the output power of A minus the pathloss between A
* and B. The user specifies the desired channel, radio and topology
* parameters through a configuration file. The configuration file is
* provided as a command line argument: <tt>$ java LinkLayerModel
* configurationFileName</tt>, and the link gains and noise floor
* values are provided on a file called <tt>linkgain.out</tt>.
*/
public class LinkLayerModel {
public static void main (String args[]) {
if (args.length != 1) {
usage();
return;
}
// variable that contains input parameters
InputVariables inVar = new InputVariables();
// parse configuration file and store parameters in inVar
readFile ( args[0], inVar );
// if user defined topology (TOPOLOGY = 4), obtain number of nodes
if (inVar.top == 4) {
obtainNumNodes (inVar.topFile, inVar);
}
// variable that contains output data
OutputVariables outVar = new OutputVariables( inVar.numNodes );
// create topology
System.out.print("Topology ...\t\t\t");
obtainTopology ( inVar, outVar );
System.out.println("done");
// obtain ouput power and noise floor for all nodes
System.out.print("Radio Pt and Pn ...\t\t");
obtainRadioPtPn ( inVar, outVar );
System.out.println("done");
// obtain link gains
System.out.print("Links Gain .....\t\t");
obtainLinkGain ( inVar, outVar);
System.out.println("done");
// print linkgain.out (link gains and noise floor) and topology.out (x/y coordinates)
System.out.print("Printing Output File ...\t");
printFile ( inVar, outVar);
System.out.println("done");
}
/**
* Parses configuration file provided by user and stores specified
* parameters
*
* @param inputFile configuration file containing channel, radio and
* deployment parameters
* @param var class that stores input parameters from configuration file
* @return true if file parsing was performed without errors
*/
protected static boolean readFile (String inputFile, InputVariables var )
{
String thisLine;
StringTokenizer st;
// open configuration file
try {
FileInputStream fin = new FileInputStream(inputFile);
try {
BufferedReader myInput = new BufferedReader(new InputStreamReader(fin));
try {
// parse the file
while ((thisLine = myInput.readLine()) != null) {
if ( !thisLine.equals("") && !thisLine.startsWith("%") ) {
st = new StringTokenizer(thisLine, " =;\t");
String key = st.nextToken();
String value = st.nextToken();
if ( key.equals("PATH_LOSS_EXPONENT")) {
var.n = Double.valueOf(value).doubleValue();
if (var.n < 0) {
System.out.println("Error: value of PATH_LOSS_EXPONENT must be positive");
System.exit(1);
}
}
else if ( key.equals("SHADOWING_STANDARD_DEVIATION")) {
var.sigma = Double.valueOf(value).doubleValue();
if (var.sigma < 0) {
System.out.println("Error: value of SHADOWING_STANDARD_DEVIATION must be positive");
System.exit(1);
}
}
else if ( key.equals("PL_D0")) {
var.pld0 = Double.valueOf(value).doubleValue();
if (var.pld0 < 0) {
System.out.println("Error: value of PL_D0 must be positive");
System.exit(1);
}
}
else if ( key.equals("D0")) {
var.d0 = Double.valueOf(value).doubleValue();
if (var.d0 <= 0) {
System.out.println("Error: value of D0 must be greater than zero");
System.exit(1);
}
}
else if ( key.equals("NOISE_FLOOR")) {
var.pn = Double.valueOf(value).doubleValue();
}
else if ( key.equals("WHITE_GAUSSIAN_NOISE")) {
var.wgn = Double.valueOf(value).doubleValue();
if (var.wgn < 0) {
System.out.println("Error: value of WHITE_GAUSSIAN_NOISE must be greater equal than 0");
System.exit(1);
}
}
else if ( key.equals("S11")) {
var.s11 = Double.valueOf(value).doubleValue();
if (var.s11 < 0) {
System.out.println("Error: value of S11 must be greater equal than 0");
System.exit(1);
}
}
else if ( key.equals("S12")) {
var.s12 = Double.valueOf(value).doubleValue();
}
else if ( key.equals("S21")) {
var.s21 = Double.valueOf(value).doubleValue();
}
else if ( key.equals("S22")) {
var.s22 = Double.valueOf(value).doubleValue();
if (var.s22 < 0) {
System.out.println("Error: value of S22 must be greater equal than 0");
System.exit(1);
}
}
else if ( key.equals("NUMBER_OF_NODES")) {
var.numNodes = Integer.parseInt(value);
if (var.numNodes <= 0) {
System.out.println("Error: value of NUMBER_OF_NODES must be positive");
System.exit(1);
}
}
else if ( key.equals("TOPOLOGY")) {
var.top = Integer.parseInt(value);
if ( (var.top < 1) | (var.top > 4) ) {
System.out.println("Error: value of TOPOLOGY must be between 1 and 4");
System.exit(1);
}
}
else if ( key.equals("GRID_UNIT")) {
var.grid = Double.valueOf(value).doubleValue();
}
else if ( key.equals("TOPOLOGY_FILE")) {
var.topFile = value;
}
else if ( key.equals("TERRAIN_DIMENSIONS_X")) {
var.Xterr = Double.valueOf(value).doubleValue();
if (var.Xterr < 0) {
System.out.println("Error: value of TERRAIN_DIMENSIONS_X must be positive");
System.exit(1);
}
}
else if ( key.equals("TERRAIN_DIMENSIONS_Y")) {
var.Yterr = Double.valueOf(value).doubleValue();
if (var.Yterr < 0) {
System.out.println("Error: value of TERRAIN_DIMENSIONS_Y must be positive");
System.exit(1);
}
var.area = var.Xterr * var.Yterr;
}
else {
System.out.println("Error: undefined parameter " + key + ", please review your configuration file");
System.exit(1);
}
}
} // end while loop
}
catch (Exception e) {
System.out.println("Error1: " + e);
System.exit(1);
}
} // end try
catch (Exception e) {
System.out.println("Error2: " + e);
System.exit(1);
}
} // end try
catch (Exception e) {
System.out.println("Error Failed to Open file " + inputFile + e);
System.exit(1);
}
return true;
}
/**
* Obtain X and Y coordinates for all nodes. Different type of topologies are available
* (grid, uniform, random, user-defined)
*
* @param inVar class that contains input parameters from configuration file
* @param outVar class that stores x/y coordinates
* @return true if X/Y coordinates are obtained without errors
*/
protected static boolean obtainTopology( InputVariables inVar,
OutputVariables outVar )
{
Random rand = new Random();
int i, j;
int sqrtNumNodes, nodesX;
double cellArea, cellLength;
double Xdist, Ydist, dist;
boolean wrongPlacement;
if (inVar.numNodes <= 0) {
System.out.println("\nError: value of NUMBER_OF_NODES must be positive");
System.exit(1);
}
switch (inVar.top) {
case 1: // GRID
if (inVar.grid < inVar.d0) {
System.out.println("\nError: value of GRID_UNIT must be equal or greater than D0");
System.exit(1);
}
sqrtNumNodes = (int) Math.sqrt(inVar.numNodes);
if ( sqrtNumNodes != Math.sqrt(inVar.numNodes) ) {
System.out.println ("\nError: on GRID topology, NUMBER_OF_NODES should be the square of a natural number");
System.exit(1);
}
for (i = 0; i < inVar.numNodes; i = i+1) {
outVar.nodePosX[i] = (i%sqrtNumNodes) * inVar.grid;
outVar.nodePosY[i] = (i/sqrtNumNodes) * inVar.grid;
}
break;
case 2: // UNIFORM
sqrtNumNodes = (int) Math.sqrt(inVar.numNodes);
if ( sqrtNumNodes != Math.sqrt(inVar.numNodes) ) {
System.out.println ("\nError: on UNIFORM topology, NUMBER_OF_NODES should be the square of a natural number");
System.exit(1);
}
if ( (inVar.Xterr <= 0) | (inVar.Yterr <= 0) ) {
System.out.println("\nError: values of TERRAIN_DIMENSIONS must be positive");
System.exit(1);
}
if ( inVar.Xterr != inVar.Yterr ) {
System.out.println("\nError: values of TERRAIN_DIMENSIONS_X and TERRAIN_DIMENSIONS_Y must be equal");
System.exit(1);
}
cellLength = Math.sqrt ( inVar.area / inVar.numNodes );
nodesX = sqrtNumNodes;
if ( cellLength < (inVar.d0*1.4) ) {
System.out.println ("\nError: on UNIFORM topology, density is too high, increase physical terrain");
System.exit(1);
}
for (i = 0; i < inVar.numNodes; i = i+1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -