📄 nsg.java
字号:
ping_no.setText("0");
node_no.setText("0");
System.gc();
env.repaint();
}
void generate()
{
dirty = false;
String s = (String)macBox.getSelectedItem();
generateGlobeVariables();
tclArea.append("#===================================\n");
tclArea.append("# \u5EFA\u7ACB\u76F8\u95DC\u6A94\u6848 \n");
tclArea.append("#===================================\n");
tclArea.append("\n");
tclArea.append("#\u8A2D\u5B9Atrace file\n");
tclArea.append("set ns [new Simulator]\t;#\u7522\u751Fns simulator\n");
tclArea.append((new StringBuilder("set tracefd [open mac_")).append(s).append("_node_").append(node_no.getText()).append("_ftp_").append(ftp_no.getText()).append("_cbr_").append(cbr_no.getText()).append("_ping_").append(ping_no.getText()).append(".tr w]\t;#\u7522\u751Ftrace file\n").toString());
tclArea.append((new StringBuilder("set namtrace [open mac_")).append(s).append("_node_").append(node_no.getText()).append("_ftp_").append(ftp_no.getText()).append("_cbr_").append(cbr_no.getText()).append("_ping_").append(ping_no.getText()).append(".nam w]\t;#\u7522\u751F\u7522\u751Fnam trace file\n").toString());
tclArea.append("\n");
tclArea.append("$ns trace-all $tracefd\n");
tclArea.append("$ns namtrace-all-wireless $namtrace $val(x) $val(y)\n");
tclArea.append("\n");
tclArea.append("set topo [new Topography]\t ;#\u7522\u751Ftopography object\n");
tclArea.append("$topo load_flatgrid $val(x) $val(y)\n");
tclArea.append("\n");
tclArea.append("create-god $val(nn)\n");
tclArea.append("\n");
generateChannels();
generateMobileNodeConfig();
generateNodes();
generateLinks();
generateStopProc();
tclArea.append("$ns run\n");
}
private void generateStopProc()
{
tclArea.append("#===================================\n");
tclArea.append("# \u7D50\u675F\u6A21\u64EC \n");
tclArea.append("#===================================\n");
tclArea.append("\n");
tclArea.append("#\u8A2D\u5B9APing\u5C08\u7528\u7684recv function\n");
tclArea.append("Agent/Ping instproc recv {from rtt} {\n");
tclArea.append(" $self instvar node_\n");
tclArea.append(" puts \"node [$node_ id] received ping answer from $from with round-trip-time $rtt ms.\"\n");
tclArea.append("}\n");
tclArea.append("\n");
tclArea.append("# \u544A\u8A34MobileNode\u6A21\u64EC\u5DF2\u7D50\u675F\n");
tclArea.append("for {set i 0} {$i < $val(nn) } { incr i } {\n");
tclArea.append(" $ns at $val(stop) \"$node_($i) reset\";\n");
tclArea.append("}\n");
tclArea.append("\n");
tclArea.append("# \u7D50\u675Fnam\u8207\u6A21\u64EC\u5668\n");
tclArea.append("$ns at $val(stop) \"$ns nam-end-wireless $val(stop)\"\n");
tclArea.append("$ns at $val(stop) \"stop\"\n");
tclArea.append((new StringBuilder("$ns at ")).append(Double.parseDouble(simStopField.getText()) + 0.10000000000000001D).append(" \"puts \\\"end simulation\\\" ; $ns halt\"\n").toString());
tclArea.append("\n");
tclArea.append("# \u8A2D\u5B9A\u6A21\u64EC\u5668\u7528\u7684stop function\n");
tclArea.append("proc stop {} {\n");
tclArea.append(" global ns tracefd namtrace\n");
tclArea.append(" $ns flush-trace\n");
tclArea.append(" close $tracefd\n");
tclArea.append(" close $namtrace\n");
tclArea.append("}\n");
tclArea.append("\n");
}
private void generateMobileNodeConfig()
{
tclArea.append("#===================================\n");
tclArea.append("# \u8A2D\u5B9AMobileNode\u7684\u53C3\u6578 \n");
tclArea.append("#===================================\n");
tclArea.append("\n");
tclArea.append("#\u8A2D\u5B9AMobileNode\u7684\u53C3\u6578\n");
tclArea.append("$ns node-config -adhocRouting $val(rp) \\\n");
tclArea.append(" -llType $val(ll) \\\n");
tclArea.append(" -macType $val(mac) \\\n");
tclArea.append(" -ifqType $val(ifq) \\\n");
tclArea.append(" -ifqLen $val(ifqlen) \\\n");
tclArea.append(" -antType $val(ant) \\\n");
tclArea.append(" -propType $val(prop) \\\n");
tclArea.append(" -phyType $val(netif) \\\n");
tclArea.append(" -channel $chan0 \\\n");
tclArea.append(" -topoInstance $topo \\\n");
tclArea.append(" -agentTrace OFF \\\n");
tclArea.append(" -routerTrace OFF \\\n");
tclArea.append(" -macTrace ON \\\n");
tclArea.append(" -movementTrace OFF\n");
tclArea.append("\n");
}
private void generateLinks()
{
tclArea.append("#===================================\n");
tclArea.append("# \u8A2D\u5B9A\u9023\u7DDA \n");
tclArea.append("#===================================\n");
tclArea.append("\n");
int i = 0;
for(Iterator iterator = links.iterator(); iterator.hasNext();)
{
Link link = (Link)(Link)iterator.next();
switch(link.getType())
{
case 0: // '\0'
tclArea.append((new StringBuilder("#\u8A2D\u5B9A\u7B2C")).append(i).append("\u500B\u9023\u7DDA(FTP-TCP)\n").toString());
tclArea.append((new StringBuilder("set tcp")).append(i).append(" [new Agent/TCP/Newreno]\n").toString());
tclArea.append((new StringBuilder("$tcp")).append(i).append(" set class_ 2\n").toString());
tclArea.append((new StringBuilder("set sink")).append(i).append(" [new Agent/TCPSink]\n").toString());
tclArea.append((new StringBuilder("$ns attach-agent $node_(")).append(link.getSrc().getId()).append(") $tcp").append(i).append("\n").toString());
tclArea.append((new StringBuilder("$ns attach-agent $node_(")).append(link.getDst().getId()).append(") $sink").append(i).append("\n").toString());
tclArea.append((new StringBuilder("$ns connect $tcp")).append(i).append(" $sink").append(i).append("\n").toString());
tclArea.append((new StringBuilder("set ftp")).append(i).append(" [new Application/FTP]\n").toString());
tclArea.append((new StringBuilder("$ftp")).append(i).append(" attach-agent $tcp").append(i).append("\n").toString());
tclArea.append((new StringBuilder("$ns at ")).append(link.getStart()).append(" \"$ftp").append(i).append(" start\"\n").toString());
tclArea.append((new StringBuilder("$ns at ")).append(link.getStop()).append(" \"$ftp").append(i).append(" stop\"\n").toString());
tclArea.append("\n");
break;
case 2: // '\002'
tclArea.append((new StringBuilder("#\u8A2D\u5B9A\u7B2C")).append(i).append("\u500B\u9023\u7DDA(CBR-UDP)\n").toString());
tclArea.append((new StringBuilder("set udp")).append(i).append(" [new Agent/UDP]\n").toString());
tclArea.append((new StringBuilder("$ns attach-agent $node_(")).append(link.getSrc().getId()).append(") $udp").append(i).append("\n").toString());
tclArea.append((new StringBuilder("set null")).append(i).append(" [new Agent/Null]\n").toString());
tclArea.append((new StringBuilder("$ns attach-agent $node_(")).append(link.getDst().getId()).append(") $null").append(i).append("\n").toString());
tclArea.append((new StringBuilder("$ns connect $udp")).append(i).append(" $null").append(i).append("\n").toString());
tclArea.append((new StringBuilder("$udp")).append(i).append(" set fid_ 2\t;#\u5728NAM\u4E2D\uFF0CUDP\u7684\u9023\u7DDA\u6703\u4EE5\u7D05\u8272\u8868\u793A\n").toString());
tclArea.append((new StringBuilder("set cbr")).append(i).append(" [new Application/Traffic/CBR]\t;#\u5728UDP\u9023\u7DDA\u4E4B\u4E0A\u5EFA\u7ACBCBR\u61C9\u7528\u7A0B\u5F0F\n").toString());
tclArea.append((new StringBuilder("$cbr")).append(i).append(" attach-agent $udp").append(i).append("\n").toString());
tclArea.append((new StringBuilder("$cbr")).append(i).append(" set type_ CBR\n").toString());
tclArea.append((new StringBuilder("$cbr")).append(i).append(" set packet_size_ ").append(link.getFrame_size()).append(";#\u8A2D\u5B9A\u5C01\u5305\u5927\u5C0F\n").toString());
tclArea.append((new StringBuilder("$cbr")).append(i).append(" set rate_ ").append(link.getRate()).append(" ;#\u8A2D\u5B9A\u50B3\u8F38\u901F\u7387\n").toString());
tclArea.append((new StringBuilder("$cbr")).append(i).append(" set random_ false\n").toString());
tclArea.append((new StringBuilder("$ns at ")).append(link.getStart()).append(" \"$cbr").append(i).append(" start\"\n").toString());
tclArea.append((new StringBuilder("$ns at ")).append(link.getStop()).append(" \"$cbr").append(i).append(" stop\"\n").toString());
tclArea.append("\n");
break;
case 1: // '\001'
tclArea.append((new StringBuilder("#\u8A2D\u5B9A\u7B2C")).append(i).append("\u500B\u9023\u7DDA(Ping)\n").toString());
tclArea.append((new StringBuilder("set ping_a(")).append(i).append(") [new Agent/Ping]\n").toString());
tclArea.append((new StringBuilder("$ns attach-agent $node_(")).append(link.getSrc().getId()).append(") $ping_a(").append(i).append(")\n").toString());
tclArea.append((new StringBuilder("set ping_b(")).append(i).append(") [new Agent/Ping]\n").toString());
tclArea.append((new StringBuilder("$ns attach-agent $node_(")).append(link.getDst().getId()).append(") $ping_b(").append(i).append(")\n").toString());
tclArea.append((new StringBuilder("$ns connect $ping_a(")).append(i).append(") $ping_b(").append(i).append(")\t;#\u9023\u7D50\u4E8C\u500BPing Agents\n").toString());
tclArea.append((new StringBuilder("$ns at ")).append(link.getStart()).append(" \"$ping_a(").append(i).append(") send\"\t;#\u8A2D\u5B9APing\u7684\u6642\u9593\n").toString());
tclArea.append("\n");
break;
}
i++;
}
}
private void generateNodes()
{
tclArea.append("#===================================\n");
tclArea.append("# \u7522\u751FNode \n");
tclArea.append("#===================================\n");
tclArea.append("\n");
Iterator iterator = nodes.iterator();
for(int i = 0; iterator.hasNext(); i++)
{
Node node = (Node)(Node)iterator.next();
tclArea.append((new StringBuilder("#\u5EFA\u7ACB\u7B2C")).append(i).append("\u500BNode\n").toString());
tclArea.append((new StringBuilder("set node_(")).append(node.getId()).append(") [$ns node]\n").toString());
tclArea.append((new StringBuilder("$node_(")).append(node.getId()).append(") set X_ ").append(node.getX()).append("\n").toString());
tclArea.append((new StringBuilder("$node_(")).append(node.getId()).append(") set Y_ ").append(node.getY()).append("\n").toString());
tclArea.append((new StringBuilder("$node_(")).append(node.getId()).append(") set Z_ 0.0\n").toString());
tclArea.append((new StringBuilder("$ns initial_node_pos $node_(")).append(node.getId()).append(") 20\n").toString());
tclArea.append("\n");
}
}
private void generateChannels()
{
tclArea.append("#\u5EFA\u7ACBchannel\n");
tclArea.append("set chan0 [new $val(chan)]\n");
tclArea.append("\n");
}
private void generateGlobeVariables()
{
String s = (String)macBox.getSelectedItem();
String s1 = (String)routingBox.getSelectedItem();
tclArea.setText("# This script is created by P.L. Wu <wupl@cse.nsysu.edu.tw>\n");
tclArea.append("#===================================\n");
tclArea.append("# \u5B9A\u7FA9\u6A21\u64EC\u8B8A\u6578 \n");
tclArea.append("#===================================\n");
tclArea.append("\n");
tclArea.append("set val(chan) Channel/WirelessChannel ;# channel type\n");
tclArea.append("set val(prop) Propagation/TwoRayGround ;# radio-propagation model\n");
tclArea.append("set val(netif) Phy/WirelessPhy ;# network interface type\n");
tclArea.append((new StringBuilder("set val(mac) Mac/")).append(s).append(" ;# MAC type\n").toString());
tclArea.append("set val(ifq) Queue/DropTail/PriQueue ;# interface queue type\n");
tclArea.append("set val(ll) LL ;# link layer type\n");
tclArea.append("set val(ant) Antenna/OmniAntenna ;# antenna model\n");
tclArea.append("set val(ifqlen) 50 ;# max packet in ifq\n");
tclArea.append((new StringBuilder("set val(nn) ")).append(nodes.size()).append(" ;# number of mobilenodes\n").toString());
tclArea.append((new StringBuilder("set val(rp) ")).append(s1).append(" ;# routing protocol\n").toString());
tclArea.append((new StringBuilder("set val(x) ")).append(envWidth).append(" ;# X dimension of topography\n").toString());
tclArea.append((new StringBuilder("set val(y) ")).append(envHeight).append(" ;# Y dimension of topography\n").toString());
tclArea.append((new StringBuilder("set val(stop) ")).append(simStopField.getText()).append(" ;# time of simulation end\n").toString());
tclArea.append("\n");
}
private boolean saveTclFileAs()
{
if(dirty)
{
int i = JOptionPane.showConfirmDialog(this, "\u7DE8\u8F2F\u5F8C\u5C1A\u672A\u7522\u751FTCL\u6A94, \u662F\u5426\u7522\u751F\u5F8C\u518D\u5B58\u6A94?", "\u5C1A\u672A\u7522\u751FTCL\u6A94!", 0);
if(i == 0)
generate();
}
try
{
tcljfc.setDialogTitle("\u8ACB\u9078\u64C7\u8981\u5132\u5B58\u7684\u6A94\u6848");
int j = tcljfc.showSaveDialog(this);
if(j == 0)
{
tclFile = tcljfc.getSelectedFile();
if(!tclFile.getAbsolutePath().endsWith("tcl"))
tclFile = new File((new StringBuilder(String.valueOf(tclFile.getAbsolutePath()))).append(".tcl").toString());
saveTclFile();
return true;
} else
{
return false;
}
}
catch(Exception exception)
{
System.out.println(exception.getMessage());
}
return false;
}
private boolean saveTclFile()
{
if(dirty)
{
int i = JOptionPane.showConfirmDialog(this, "\u7DE8\u8F2F\u5F8C\u5C1A\u672A\u7522\u751FTCL\u6A94, \u662F\u5426\u7522\u751F\u5F8C\u518D\u5B58\u6A94?", "\u5C1A\u672A\u7522\u751FTCL\u6A94!", 0);
if(i == 0)
generate();
}
try
{
if(tclFile == null && !saveTclFileAs())
{
return false;
} else
{
OutputStreamWriter outputstreamwriter = new OutputStreamWriter(new FileOutputStream(tclFile));
outputstreamwriter.write(tclArea.getText());
outputstreamwriter.close();
return true;
}
}
catch(Exception exception)
{
System.out.println(exception.getMessage());
}
return false;
}
private boolean loadScenario()
{
try
{
scnjfc.setDialogTitle("\u8ACB\u9078\u64C7\u8981\u5132\u5B58\u7684\u6A94\u6848");
int i = scnjfc.showSaveDialog(this);
if(i == 0)
{
scnFile = scnjfc.getSelectedFile();
scnFilePath.setText(scnFile.getAbsolutePath());
FileInputStream fileinputstream = new FileInputStream(scnFile);
ObjectInputStream objectinputstream = new ObjectInputStream(fileinputstream);
nodes = (Vector)objectinputstream.readObject();
links = (Vector)objectinputstream.readObject();
objectinputstream.close();
env.setNodes(nodes);
env.setLinks(links);
env.repaint();
System.gc();
}
}
catch(Exception exception)
{
System.out.println(exception.getMessage());
return false;
}
return true;
}
private boolean saveScenario()
{
try
{
FileOutputStream fileoutputstream = new FileOutputStream(scnFile);
ObjectOutputStream objectoutputstream = new ObjectOutputStream(fileoutputstream);
objectoutputstream.writeObject(nodes);
objectoutputstream.writeObject(links);
objectoutputstream.close();
}
catch(Exception exception)
{
System.out.println(exception.getMessage());
return false;
}
return true;
}
private boolean saveScenarioAs()
{
try
{
scnjfc.setDialogTitle("\u8ACB\u9078\u64C7\u8981\u5132\u5B58\u7684\u6A94\u6848");
int i = scnjfc.showSaveDialog(this);
if(i == 0)
{
scnFile = scnjfc.getSelectedFile();
scnFilePath.setText(scnFile.getAbsolutePath());
FileOutputStream fileoutputstream = new FileOutputStream(scnFile);
ObjectOutputStream objectoutputstream = new ObjectOutputStream(fileoutputstream);
objectoutputstream.writeObject(nodes);
objectoutputstream.writeObject(links);
objectoutputstream.close();
}
}
catch(Exception exception)
{
System.out.println(exception.getMessage());
return false;
}
return true;
}
public static void main(String args[])
{
NSG nsg = new NSG();
nsg.setBounds(0, 0, 800, 700);
nsg.setDefaultCloseOperation(3);
nsg.setExtendedState(6);
nsg.setVisible(true);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -