#include <fstream>
#include <sstream>
#include <iostream>
#include <string>
#include <string>
#include <cstdio>
#include "ns3/simulator.h"
#include "ns3/core-module.h"
#include "ns3/mobility-module.h"
#include "ns3/netanim-module.h"
#include "ns3/gauss-markov-mobility-model.h"
#include "ns3/position-allocator.h"
#include "ns3/network-module.h"
#include "ns3/node.h"
using namespace ns3;
static void
PositionChange (std::string foo, Ptr<const MobilityModel> m)
{
FILE *fp;
double a,b,c,d,e,f;
fp=freopen("value.txt","a",stdout);
Vector pos = m->GetPosition();
Vector vel = m->GetVelocity();
a = pos.x;
b = pos.y;
c = pos.z;
d = vel.x;
e = vel.y;
f = vel.z;
std::cout << "Time: "<< Simulator::Now ().GetSeconds() << '\t';
fprintf(fp,"Node: \t POS-X: %lf \t POS-Y: %lf \t POS-Z: %lf \t VEL-X: %lf \t VEL-Y: %lf \t VEL-Z: %lf \n",a,b,c,d,e,f);
}
int main ()
{
remove("value.txt");
//created 20 nodes
NodeContainer n;
n.Create (20);
// setting mobility
Config::SetDefault ("ns3::GaussMarkovMobilityModel::Bounds", StringValue ("0|200|0|200|0|200"));
Config::SetDefault ("ns3::GaussMarkovMobilityModel::TimeStep", StringValue ("1.0"));
MobilityHelper m;
m.SetPositionAllocator ("ns3::RandomBoxPositionAllocator",
"X", StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=200.0]"),
"Y", StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=200.0]"),
"Z", StringValue ("ns3::UniformRandomVariable[Min=0.0|Max=200.0]"));
//// for creating mobile ground nodes
m.SetMobilityModel ("ns3::GaussMarkovMobilityModel",
"Bounds", StringValue ("0|200|0|200|0|200"),
"TimeStep", StringValue ("1.0"));
int i;
for(i=4;i<20;i++)
{
m.Install (n.Get(i));
}
///// for creating static nodes
m.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
int j;
for(j=0;j<4;j++)
{
m.Install (n.Get(j));
}
// calling the above PostionChange function
Config::Connect ("/NodeList/*/$ns3::MobilityModel/CourseChange", MakeCallback (&PositionChange));
Simulator::Stop (Seconds (1000.0));
AnimationInterface anim("7.xml");
anim.SetConstantPosition(n.Get(0),100,50,200);
anim.SetConstantPosition(n.Get(1),150,100,200);
anim.SetConstantPosition(n.Get(2),100,150,200);
anim.SetConstantPosition(n.Get(3),50,100,200);
Simulator::Run ();
Simulator::Destroy ();
return 0;
}