41#include "ns3/constant-velocity-mobility-model.h"
43#include "ns3/node-list.h"
45#include "ns3/simulator.h"
58#define NS2_X_COORD "X_"
59#define NS2_Y_COORD "Y_"
60#define NS2_Z_COORD "Z_"
61#define NS2_SETDEST "setdest"
63#define NS2_NODEID "$node_("
64#define NS2_NS_SCH "$ns_"
116static std::string
TrimNs2Line(
const std::string& str);
123static bool IsNumber(
const std::string& s);
132static bool IsVal(
const std::string& str, T& ret);
202static DestinationPoint
SetMovement(Ptr<ConstantVelocityMobilityModel> model,
205 double xFinalPosition,
206 double yFinalPosition,
234 : m_filename(filename)
237 if (!(file.is_open()))
240 <<
" for reading, aborting here \n");
247 std::istringstream iss;
259 model = CreateObject<ConstantVelocityMobilityModel>();
260 object->AggregateObject(model);
268 std::map<int, DestinationPoint> last_pos;
298 if (pr.
tokens.size() != 4)
308 NS_LOG_ERROR(
"Node number couldn't be obtained (corrupted file?): " << line
319 NS_LOG_ERROR(
"Unknown node ID (corrupted file?): " << nodeId <<
"\n");
332 last_pos[iNodeId] = point;
336 << iNodeId <<
" " << nodeId
337 <<
" position = " << last_pos[iNodeId].m_finalPosition);
371 NS_LOG_ERROR(
"Line has not correct number of parameters (corrupted file?): "
381 NS_LOG_ERROR(
"Node number couldn't be obtained (corrupted file?): " << line
392 NS_LOG_ERROR(
"Unknown node ID (corrupted file?): " << nodeId <<
"\n");
433 if (last_pos[iNodeId].m_targetArrivalTime > at)
436 << last_pos[iNodeId].m_targetArrivalTime <<
", at = " << at);
437 double actuallytraveled = at - last_pos[iNodeId].m_travelStartTime;
438 Vector reached = Vector(last_pos[iNodeId].m_startPosition.x +
439 last_pos[iNodeId].m_speed.x * actuallytraveled,
440 last_pos[iNodeId].m_startPosition.y +
441 last_pos[iNodeId].m_speed.y * actuallytraveled,
443 NS_LOG_LOGIC(
"Final point = " << last_pos[iNodeId].m_finalPosition
444 <<
", actually reached = " << reached);
445 last_pos[iNodeId].m_stopEvent.Cancel();
446 last_pos[iNodeId].m_finalPosition = reached;
451 last_pos[iNodeId].m_finalPosition,
459 << iNodeId <<
" " << nodeId
460 <<
" position =" << last_pos[iNodeId].m_finalPosition);
470 last_pos[iNodeId].m_finalPosition =
472 if (last_pos[iNodeId].m_targetArrivalTime > at)
474 last_pos[iNodeId].m_stopEvent.Cancel();
476 last_pos[iNodeId].m_targetArrivalTime = at;
477 last_pos[iNodeId].m_travelStartTime = at;
480 << iNodeId <<
" " << nodeId
481 <<
" position =" << last_pos[iNodeId].m_finalPosition);
485 NS_LOG_WARN(
"Format Line is not correct: " << line <<
"\n");
497 std::istringstream s;
501 size_t pos_sharp = str.find_first_of(
'#');
502 if (pos_sharp != std::string::npos)
504 line = str.substr(0, pos_sharp);
537 ret.
has_ival.push_back(IsVal<int>(x, ii));
538 ret.
ivals.push_back(ii);
539 ret.
has_dval.push_back(IsVal<double>(x, d));
540 ret.
dvals.push_back(d);
541 ret.
svals.push_back(x);
544 size_t tokensLength = ret.
tokens.size();
545 size_t lasTokenLength = ret.
tokens[tokensLength - 1].size();
549 if ((tokensLength == 7 || tokensLength == 8) &&
550 (ret.
tokens[tokensLength - 1][lasTokenLength - 1] ==
'"'))
553 ret.
tokens[tokensLength - 1] = ret.
tokens[tokensLength - 1].substr(0, lasTokenLength - 1);
556 x = ret.
tokens[tokensLength - 1];
566 ret.
has_ival[tokensLength - 1] = IsVal<int>(x, ii);
567 ret.
ivals[tokensLength - 1] = ii;
568 ret.
has_dval[tokensLength - 1] = IsVal<double>(x, d);
569 ret.
dvals[tokensLength - 1] = d;
570 ret.
svals[tokensLength - 1] = x;
572 else if ((tokensLength == 9 && ret.
tokens[tokensLength - 1] ==
"\"") ||
573 (tokensLength == 8 && ret.
tokens[tokensLength - 1] ==
"\""))
578 ret.
tokens.erase(ret.
tokens.begin() + tokensLength - 1);
580 ret.
ivals.erase(ret.
ivals.begin() + tokensLength - 1);
582 ret.
dvals.erase(ret.
dvals.begin() + tokensLength - 1);
583 ret.
svals.erase(ret.
svals.begin() + tokensLength - 1);
594 while (!ret.empty() && isblank(ret[0]))
599 while (!ret.empty() && (isblank(ret[ret.size() - 1]) || (ret[ret.size() - 1] ==
';')))
601 ret.erase(ret.size() - 1, 1);
611 strtod(s.c_str(), &endp);
612 return endp == s.c_str() + s.size();
617IsVal(
const std::string& str, T& ret)
625 std::istringstream s(str);
639 std::string::size_type startNodeId = str.find_first_of(
'(');
640 std::string::size_type endNodeId = str.find_first_of(
')');
646 if (startNodeId == std::string::npos || endNodeId == std::string::npos)
651 nodeId = str.substr(startNodeId + 1, endNodeId - (startNodeId + 1));
654 return IsNumber(nodeId) && nodeId.find_first_of(
'.') == std::string::npos && nodeId[0] !=
'-';
663 std::string::size_type startNodeId = str.find_first_of(
'(');
664 std::string::size_type endNodeId = str.find_first_of(
')');
666 return str.substr(startNodeId + 1, endNodeId - (startNodeId + 1));
681 result = pr.
ivals[0];
684 result = pr.
ivals[3];
687 result = pr.
ivals[3];
773 double xFinalPosition,
774 double yFinalPosition,
795 double time = std::sqrt(std::pow(xFinalPosition - retval.
m_finalPosition.x, 2) +
806 retval.
m_speed = Vector(xSpeed, ySpeed, 0);
811 NS_LOG_DEBUG(
"Calculated Speed: X=" << xSpeed <<
" Y=" << ySpeed <<
" Z=" << zSpeed);
817 Vector(xSpeed, ySpeed, zSpeed));
835 position.x = model->GetPosition().x;
836 position.y = model->GetPosition().y;
837 position.z = model->GetPosition().z;
853 position.x = model->GetPosition().x;
854 position.y = model->GetPosition().y;
855 position.z = model->GetPosition().z;
Mobility model for which the current speed does not change once it has been set and until it is set a...
void SetVelocity(const Vector &speed)
An identifier for simulation events.
void SetPosition(const Vector &position)
a class to hold input objects internally
virtual Ptr< Object > Get(uint32_t i) const =0
Return ith object in store.
void ConfigNodesMovements(const ObjectStore &store) const
Parses ns-2 mobility file to create ns-3 mobility events.
void Install() const
Read the ns2 trace file and configure the movement patterns of all nodes contained in the global ns3:...
std::string m_filename
filename of file containing ns-2 mobility trace
Ptr< ConstantVelocityMobilityModel > GetMobilityModel(std::string idString, const ObjectStore &store) const
Get or create a ConstantVelocityMobilityModel corresponding to idString.
Ns2MobilityHelper(std::string filename)
Smart pointer class similar to boost::intrusive_ptr.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static bool IsSchedMobilityPos(ParseResult pr)
Check if this corresponds to a line like this: $ns_ at 1 "$node_(0) set X_ 2".
static bool IsNumber(const std::string &s)
Checks if a string represents a number or it has others characters than digits and point.
static std::string TrimNs2Line(const std::string &str)
Put out blank spaces at the start and end of a line.
static ParseResult ParseNs2Line(const std::string &str)
Parses a line of ns2 mobility.
static Vector SetOneInitialCoord(Vector actPos, std::string &coord, double value)
Add one coord to a vector position.
static bool IsSetInitialPos(ParseResult pr)
Check if this corresponds to a line like this: $node_(0) set X_ 123.
static std::string GetNodeIdFromToken(std::string str)
Gets nodeId number in string format from the string like $node_(4)
static bool HasNodeIdNumber(std::string str)
Checks if the value between brackets is a correct nodeId number.
static Vector SetInitialPosition(Ptr< ConstantVelocityMobilityModel > model, std::string coord, double coordVal)
Set initial position for a node.
static DestinationPoint SetMovement(Ptr< ConstantVelocityMobilityModel > model, Vector lastPos, double at, double xFinalPosition, double yFinalPosition, double speed)
Set waypoints and speed for movement.
static Vector SetSchedPosition(Ptr< ConstantVelocityMobilityModel > model, double at, std::string coord, double coordVal)
Schedule a set of position for a node.
static bool IsVal(const std::string &str, T &ret)
Check if s string represents a numeric value.
static bool IsSchedSetPos(ParseResult pr)
Check if this corresponds to a line like this: $ns_ at 1 "$node_(0) setdest 2 3 4".
static int GetNodeIdInt(ParseResult pr)
Get node id number in int format.
static std::string GetNodeIdString(ParseResult pr)
Get node id number in string format.
Keeps last movement schedule.
double m_travelStartTime
Travel start time is needed to calculate actually traveled time.
EventId m_stopEvent
Event scheduling node's stop.
Vector m_finalPosition
Final destination to be reached before next schedule.
double m_targetArrivalTime
When a station arrives to a destination.
Vector m_speed
Speed of the last movement (needed to derive reached destination at next schedule = start + velocity ...
Vector m_startPosition
Start position of last movement.
Type to maintain line parsed and its values.
std::vector< double > dvals
double values for each tokens
std::vector< std::string > svals
string value for each token
std::vector< std::string > tokens
tokens from a line
std::vector< int > ivals
int values for each tokens
std::vector< bool > has_ival
points if a tokens has an int value
std::vector< bool > has_dval
points if a tokens has a double value