Re: [ns] How to get the Nodes' coordinate from TCL to C++
Hi Samira, I had the same question and i got the following reply from Mr. Keven Sheth that turned out to be useful. What he answered specifically is how to calculate the distances between to nodes, which uses the coordinates of the nodes by accessing them from struct mb_node in file God.cc (in ./mobile). After retrieving the nodes coordinates i think it becomes an easy task to pass them to the MAC layer. I also found the same solution that Keven proposed at this link: http://www.cse.msu.edu/~wangbo1/ns2/nshowto2.html Below i will paste Keven's original reply. I hope it turns out useful. Cheers, Mathiew KEVIN'S REPLY Hi Mathiew I needed to the same in my project. what I did is used god object. you can study and you can do many more things using it . here I am just describing what I did: I added following function in ns-2.33/mobile/god.cc (you will need to add declaration in god.h) double God::getdistance(int i,int k) { double x1=mb_node[i]-X(); double y1=mb_node[i]-Y(); double x2=mb_node[k]-X(); double y2=mb_node[k]-Y(); double distance; distance=sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))); return distance; } then I was able to get distance between two nodes by writing following code in c++ God::instance()-getdistance(i,k); // i and k are the id of the nodes you will also need to include following statements in your .tcl file 1 after creating topography set topo [new Topography] $topo load_flatgrid $val(x) $val(y) set god_ [create-god $val(nn)] 2. when you are dynamically creating nodes for { set i 0 } { $i $val(nn) } { incr i } { set node_($i) [$ns_ node $i] $node_($i) random-motion 0 ;# disable random motion $god_ new_node $node_($i) } following is a function of my agent for your reference: void Manetconf::neighbors(int i) { int nodes=God::instance()-nodes(); coutneighbors of node i:endl; for(int k=0;knodes;k++) { if(k!=i) { if(God::instance()-IsNeighbor(i,k)) coutk:God::instance()-getdistance(i,k) yesendl; else coutk:God::instance()-getdistance(i,k) noendl; } } coutendl; } --- Quoting samyar@gmail.com: hi Mathiew I have exactly same as your problem. I want to send node coordinate or position to MAC layer and amke some desicion base on this information. can i ask you which routing and MAC do you use? anyway i think we have tosend this information through routing layer and not bye TCL. my email: samyar@gmail.com and my name is SAMIRA . thanks a lot
Re: [ns] How to get the Nodes' coordinate from TCL to C++
Hello Kavan, Thanks alot for the reply. I haven't tried it yet because of a complication with NS2 (it aint cleaning any of the .o files). Ill try it soon. One question, in God::IsNeighbor function, a constant called RANGE is used do have any idea where it is being defined !? Thanks alot, Mathiew :D Quoting kavan sheth shethka...@gmail.com: Hi Mathiew I needed to the same in my project. what I did is used god object. you can study and you can do many more things using it . here I am just describing what I did: I added following function in ns-2.33/mobile/god.cc (you will need to add declaration in god.h) double God::getdistance(int i,int k) { double x1=mb_node[i]-X(); double y1=mb_node[i]-Y(); double x2=mb_node[k]-X(); double y2=mb_node[k]-Y(); double distance; distance=sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2))); return distance; } then I was able to get distance between two nodes by writing following code in c++ *God::instance()-getdistance(i,k); // i and k are the id of the nodes* you will also need to include following statements in your .tcl file 1 after creating topography set topo [new Topography] $topo load_flatgrid $val(x) $val(y) *set god_ [create-god $val(nn)]* 2. when you are dynamically creating nodes for { set i 0 } { $i $val(nn) } { incr i } { set node_($i) [$ns_ node $i] $node_($i) random-motion 0 ;# disable random motion *$god_ new_node $node_($i) *} following is a function of my agent for your reference: void Manetconf::neighbors(int i) { int nodes=God::instance()-nodes(); coutneighbors of node i:endl; for(int k=0;knodes;k++) { if(k!=i) { if(God::instance()-IsNeighbor(i,k)) coutk:God::instance()-getdistance(i,k) yesendl; else coutk:God::instance()-getdistance(i,k) noendl; } } coutendl; } cheers Kavan On Mon, Jan 26, 2009 at 1:28 PM, Mathiew Moussa mm...@aub.edu.lb wrote: Hello Walid, Thanks for replying. Here's the deal : im trying to simulate a WSN with nodes that are not mobile. In a topology.tcl file i have the nodes coordinates stored in the following form: $node_(0) set X_ 60 $node_(0) set Y_ 0 $node_(0) set Z_ 0 $node_(1) set X_ 92 $node_(1) set Y_ 43 $node_(1) set Z_ 0 ... Although i have these coordinates in the tcl files i still need to access them in C++, the reason is because i wanted to find distances between nodes as well as whether some nodes lied in the range of other (so its a couple of loops in C++) so id need something that look like this: for(i=0 ; inumbNodes; i++) for (j=0 ; jnumNodes; j++) if(nodes[i].x == nodes[j].x) //just a stupid example (...) My algorithm is centralized at the base station.. over there i have the freedom to access the coordinates of the nodes from topology.tcl, the question is how ? I hope this is enough. Thanks again. Mathiew Quoting Waleed Tuffaha tuff...@gmail.com: Hello Mathiew, Sorry for the late reply. I guess it would be best if you can explain a little what you are trying to do. Is every node trying to find its coordinates only ? On Thu, Jan 22, 2009 at 11:48 AM, Mathiew Moussa mm...@aub.edu.lb wrote: Hello Walid, Thanks for the reply. You said getting the coordinates from the TCL file easier... i have them stored in a topography.tcl file (or so i recall) that has the X Y Z coordinates of each sensor. So what's the way to get them from the TCL file directly to be used in C++ ?? Thanks alot, Mathiew Quoting Waleed Tuffaha tuff...@gmail.com: Hello Mathiew, ( Note that I didn't test this ! ) The Node class uses a Location class in which the X,Y,Z variables are defined. The mobilenode class inherits from the node class. So, if node_ is a pointer to a mobilenode, then you should be able to get the coordinates using: int x,y,z; node_-location_-getLocation(x, y, z) So if you have an array containing pointers to all the nodes then you can loop on the array and get the coordinates for each node. I think that getting the coordinates from Tcl is easier, but I don't know what exactly you are doing. Hope this helps -- Waleed On Thu, Jan 22, 2009 at 9:59 AM, Mathiew Moussa mm...@aub.edu.lb wrote: Dear NS Users, Can someone please tell me how you can retrieve the coordinates of the network nodes from a TCL file into C++. So is their some loop or something that can be written in C++ and traverses all the nodes and gets X, Y, Z, and how is it written. Hope you can help me. Thanks, Mathiew -- Waleed Tuffaha.
Re: [ns] How to get the Nodes' coordinate from TCL to C++
Hello Walid, Thanks for replying. Here's the deal : im trying to simulate a WSN with nodes that are not mobile. In a topology.tcl file i have the nodes coordinates stored in the following form: $node_(0) set X_ 60 $node_(0) set Y_ 0 $node_(0) set Z_ 0 $node_(1) set X_ 92 $node_(1) set Y_ 43 $node_(1) set Z_ 0 ... Although i have these coordinates in the tcl files i still need to access them in C++, the reason is because i wanted to find distances between nodes as well as whether some nodes lied in the range of other (so its a couple of loops in C++) so id need something that look like this: for(i=0 ; inumbNodes; i++) for (j=0 ; jnumNodes; j++) if(nodes[i].x == nodes[j].x) //just a stupid example (...) My algorithm is centralized at the base station.. over there i have the freedom to access the coordinates of the nodes from topology.tcl, the question is how ? I hope this is enough. Thanks again. Mathiew Quoting Waleed Tuffaha tuff...@gmail.com: Hello Mathiew, Sorry for the late reply. I guess it would be best if you can explain a little what you are trying to do. Is every node trying to find its coordinates only ? On Thu, Jan 22, 2009 at 11:48 AM, Mathiew Moussa mm...@aub.edu.lb wrote: Hello Walid, Thanks for the reply. You said getting the coordinates from the TCL file easier... i have them stored in a topography.tcl file (or so i recall) that has the X Y Z coordinates of each sensor. So what's the way to get them from the TCL file directly to be used in C++ ?? Thanks alot, Mathiew Quoting Waleed Tuffaha tuff...@gmail.com: Hello Mathiew, ( Note that I didn't test this ! ) The Node class uses a Location class in which the X,Y,Z variables are defined. The mobilenode class inherits from the node class. So, if node_ is a pointer to a mobilenode, then you should be able to get the coordinates using: int x,y,z; node_-location_-getLocation(x, y, z) So if you have an array containing pointers to all the nodes then you can loop on the array and get the coordinates for each node. I think that getting the coordinates from Tcl is easier, but I don't know what exactly you are doing. Hope this helps -- Waleed On Thu, Jan 22, 2009 at 9:59 AM, Mathiew Moussa mm...@aub.edu.lb wrote: Dear NS Users, Can someone please tell me how you can retrieve the coordinates of the network nodes from a TCL file into C++. So is their some loop or something that can be written in C++ and traverses all the nodes and gets X, Y, Z, and how is it written. Hope you can help me. Thanks, Mathiew -- Waleed Tuffaha.
[ns] How to get the Nodes' coordinate from TCL to C++
Dear NS Users, Can someone please tell me how you can retrieve the coordinates of the network nodes from a TCL file into C++. So is their some loop or something that can be written in C++ and traverses all the nodes and gets X, Y, Z, and how is it written. Hope you can help me. Thanks, Mathiew
Re: [ns] How to get the Nodes' coordinate from TCL to C++
Hello Walid, Thanks for the reply. You said getting the coordinates from the TCL file easier... i have them stored in a topography.tcl file (or so i recall) that has the X Y Z coordinates of each sensor. So what's the way to get them from the TCL file directly to be used in C++ ?? Thanks alot, Mathiew Quoting Waleed Tuffaha tuff...@gmail.com: Hello Mathiew, ( Note that I didn't test this ! ) The Node class uses a Location class in which the X,Y,Z variables are defined. The mobilenode class inherits from the node class. So, if node_ is a pointer to a mobilenode, then you should be able to get the coordinates using: int x,y,z; node_-location_-getLocation(x, y, z) So if you have an array containing pointers to all the nodes then you can loop on the array and get the coordinates for each node. I think that getting the coordinates from Tcl is easier, but I don't know what exactly you are doing. Hope this helps -- Waleed On Thu, Jan 22, 2009 at 9:59 AM, Mathiew Moussa mm...@aub.edu.lb wrote: Dear NS Users, Can someone please tell me how you can retrieve the coordinates of the network nodes from a TCL file into C++. So is their some loop or something that can be written in C++ and traverses all the nodes and gets X, Y, Z, and how is it written. Hope you can help me. Thanks, Mathiew