#include "ns3/aodv-module.h"
#include "ns3/core-module.h"
#include "ns3/internet-module.h"
#include "ns3/mobility-module.h"
#include "ns3/netanim-module.h"
#include "ns3/network-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/v4ping-helper.h"
#include "ns3/wifi-module.h"
#include <cmath>
#include <iostream>
using namespace ns3;
/**
* \brief Test script.
*
* This script creates 1-dimensional grid topology and then ping last node from
* the first one:
*
* [10.0.0.1] <-- step --> [10.0.0.2] <-- step --> [10.0.0.3] <-- step -->
* [10.0.0.4]
*
* ping 10.0.0.4
*/
class AodvExample {
public:
AodvExample();
/// Configure script parameters, \return true on successful configuration
bool Configure(int argc, char **argv);
/// Run simulation
void Run();
/// Report results
void Report(std::ostream &os);
private:
// parameters
/// Number of nodes
uint32_t size;
/// Distance between nodes, meters
double step;
/// Simulation time, seconds
double totalTime;
/// Write per-device PCAP traces if true
bool pcap;
/// Print routes if true
bool printRoutes;
// network
NodeContainer nodes;
NetDeviceContainer devices;
Ipv4InterfaceContainer interfaces;
private:
void CreateNodes();
void CreateDevices();
void InstallInternetStack();
void InstallApplications();
};
int main(int argc, char **argv) {
AodvExample test;
if (!test.Configure(argc, argv))
NS_FATAL_ERROR("Configuration failed. Aborted.");
test.Run();
test.Report(std::cout);
return 0;
}
//-----------------------------------------------------------------------------
AodvExample::AodvExample()
: size(50), step(100), totalTime(10), pcap(true), printRoutes(true) {}
bool AodvExample::Configure(int argc, char **argv) {
// Enable AODV logs by default. Comment this if too noisy
// LogComponentEnable("AodvRoutingProtocol", LOG_LEVEL_ALL);
SeedManager::SetSeed(12345);
CommandLine cmd;
cmd.AddValue("pcap", "Write PCAP traces.", pcap);
cmd.AddValue("printRoutes", "Print routing table dumps.", printRoutes);
cmd.AddValue("size", "Number of nodes.", size);
cmd.AddValue("time", "Simulation time, s.", totalTime);
cmd.AddValue("step", "Grid step, m", step);
cmd.Parse(argc, argv);
return true;
}
void AodvExample::Run() {
// Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold",
// UintegerValue (1)); // enable rts cts all the time.
CreateNodes();
CreateDevices();
InstallInternetStack();
InstallApplications();
std::cout << "Starting simulation for " << totalTime << " s ...\n";
Simulator::Stop(Seconds(totalTime));
AnimationInterface anim("scratch/artichoke/aodv.xml");
//uint32_t urlImage = anim.AddResource("/home/fox/workspace/ns-allinone-3.26/ns-3.26/scratch/artichoke/page1_pic1.png");
uint32_t urlImage = anim.AddResource("/home/neverhooda/ns3/ns-allinone-3.26/ns-3.26/scratch/artichoke/page1_pic1.png");
for (uint32_t i = 0; i < size; ++i) {
Ptr<MobilityModel> mob = nodes.Get(i)->GetObject<MobilityModel>();
Vector pos = mob->GetPosition();
std::cout << "Node: " << i << " is at (" << pos.x << ", " << pos.y << ", " << pos.z << ")\n";
anim.SetConstantPosition(nodes.Get(i), pos.x, pos.y);
uint32_t nodeId = nodes.Get(i)->GetId();
anim.UpdateNodeImage(nodeId, urlImage);
anim.UpdateNodeSize (nodeId, 80.0, 80.0);
}
Simulator::Run();
Simulator::Destroy();
}
void AodvExample::Report(std::ostream &) {}
void AodvExample::CreateNodes() {
std::cout << "Creating " << (unsigned)size << " nodes " << step
<< " m apart.\n";
nodes.Create(size);
// Name nodes
for (uint32_t i = 0; i < size; ++i) {
std::ostringstream os;
os << "node-" << i;
Names::Add(os.str(), nodes.Get(i));
}
// Create static grid
MobilityHelper mobility;
mobility.SetPositionAllocator(
"ns3::GridPositionAllocator", "MinX", DoubleValue(0.0), "MinY",
DoubleValue(0.0), "DeltaX", DoubleValue(step), "DeltaY",
DoubleValue(step), "GridWidth", UintegerValue(5), "LayoutType",
StringValue("ColumnFirst")); // RowFirst
mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
mobility.Install(nodes);
}
void AodvExample::CreateDevices() {
WifiMacHelper wifiMac;
wifiMac.SetType("ns3::AdhocWifiMac");
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default();
wifiPhy.SetChannel(wifiChannel.Create());
WifiHelper wifi;
wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager", "DataMode",
StringValue("OfdmRate6Mbps"), "RtsCtsThreshold",
UintegerValue(0));
devices = wifi.Install(wifiPhy, wifiMac, nodes);
if (pcap) {
wifiPhy.EnablePcapAll(std::string("aodv"));
}
}
void AodvExample::InstallInternetStack() {
AodvHelper aodv;
// you can configure AODV attributes here using aodv.Set(name, value)
InternetStackHelper stack;
stack.SetRoutingHelper(aodv); // has effect on the next Install ()
stack.Install(nodes);
Ipv4AddressHelper address;
address.SetBase("10.0.0.0", "255.0.0.0");
interfaces = address.Assign(devices);
if (printRoutes) {
Ptr<OutputStreamWrapper> routingStream =
Create<OutputStreamWrapper>("aodv.routes", std::ios::out);
aodv.PrintRoutingTableAllAt(Seconds(8), routingStream);
}
}
void AodvExample::InstallApplications() {
V4PingHelper ping(interfaces.GetAddress(size - 1));
ping.SetAttribute("Verbose", BooleanValue(true));
ApplicationContainer p = ping.Install(nodes.Get(0));
p.Start(Seconds(0));
p.Stop(Seconds(totalTime) - Seconds(0.001));
// move node away
Ptr<Node> node = nodes.Get(size / 2);
Ptr<MobilityModel> mob = node->GetObject<MobilityModel>();
Simulator::Schedule(Seconds(totalTime / 3), &MobilityModel::SetPosition, mob,
Vector(1e2, 1e2, 1e2));
}
Peter
(Also please read the posting guidelines, specifically about attaching, not pasting, scripts.)