21 #include "ns3/packet.h"
22 #include "ns3/constant-position-mobility-model.h"
23 #include "ns3/simulator.h"
24 #include "ns3/command-line.h"
25 #include "ns3/flow-id-tag.h"
26 #include "ns3/yans-wifi-channel.h"
27 #include "ns3/yans-wifi-phy.h"
28 #include "ns3/propagation-loss-model.h"
29 #include "ns3/propagation-delay-model.h"
30 #include "ns3/nist-error-rate-model.h"
31 #include "ns3/wifi-psdu.h"
73 void
Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
74 WifiTxVector txVector, std::vector<bool> statusPerMpdu);
89 m_tx->Send (psdu, txVector);
104 txMode (
"OfdmRate6Mbps"),
123 channel->SetPropagationDelayModel (CreateObject<ConstantSpeedPropagationDelayModel> ());
125 channel->SetPropagationLossModel (log);
148 Simulator::Destroy ();
187 void
SendA (void) const;
189 void
SendB (void) const;
197 void
Receive (Ptr<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
198 WifiTxVector txVector, std::vector<bool> statusPerMpdu);
211 (*psdu->
begin ())->GetPacket ()->AddByteTag (
FlowIdTag (m_flowIdA));
216 m_txA->Send (psdu, txVector);
223 (*psdu->
begin ())->GetPacket ()->AddByteTag (
FlowIdTag (m_flowIdB));
228 m_txB->Send (psdu, txVector);
236 if ((*psdu->
begin ())->GetPacket ()->FindFirstMatchingByteTag (tag))
256 txModeA (
"OfdmRate6Mbps"),
257 txModeB (
"OfdmRate6Mbps"),
273 m_flowIdA = FlowIdTag::AllocateFlowId ();
274 m_flowIdB = FlowIdTag::AllocateFlowId ();
277 channel->SetPropagationDelayModel (CreateObject<ConstantSpeedPropagationDelayModel> ());
279 channel->SetPropagationLossModel (log);
320 Simulator::Destroy ();
331 cmd.AddValue (
"Distance",
"The distance between two phys", input.
distance);
332 cmd.AddValue (
"PacketSize",
"The size of each packet sent", input.
packetSize);
333 cmd.AddValue (
"TxMode",
"The mode to use to send each packet", input.
txMode);
334 cmd.AddValue (
"NPackets",
"The number of packets to send", input.
nPackets);
335 cmd.AddValue (
"TxPowerLevel",
"The power level index to use to send each packet", input.
txPowerLevel);
336 cmd.Parse (argc, argv);
344 std::cout << psr << std::endl;
358 cmd.AddValue (
"TxPowerLevel",
"The power level index to use to send each packet", input.
txPowerLevel);
359 cmd.AddValue (
"TxMode",
"The mode to use to send each packet", input.
txMode);
360 cmd.AddValue (
"NPackets",
"The number of packets to send", input.
nPackets);
361 cmd.AddValue (
"PacketSize",
"The size of each packet sent", input.
packetSize);
362 cmd.Parse (argc, argv);
370 input.
txMode =
"OfdmRate6Mbps";
372 std::cout <<
" " <<
CalcPsr (output, input);
374 input.
txMode =
"OfdmRate9Mbps";
376 std::cout <<
" " <<
CalcPsr (output, input);
378 input.
txMode =
"OfdmRate12Mbps";
380 std::cout <<
" " <<
CalcPsr (output, input);
382 input.
txMode =
"OfdmRate18Mbps";
384 std::cout <<
" " <<
CalcPsr (output, input);
386 input.
txMode =
"OfdmRate24Mbps";
388 std::cout <<
" " <<
CalcPsr (output, input);
390 input.
txMode =
"OfdmRate36Mbps";
392 std::cout <<
" " <<
CalcPsr (output, input);
394 input.
txMode =
"OfdmRate48Mbps";
396 std::cout <<
" " <<
CalcPsr (output, input);
398 input.
txMode =
"OfdmRate54Mbps";
400 std::cout <<
" " <<
CalcPsr (output, input);
402 std::cout << std::endl;
408 double targetPsr = 0.05;
411 cmd.AddValue (
"TxPowerLevel",
"The power level index to use to send each packet", input.
txPowerLevel);
412 cmd.AddValue (
"TxMode",
"The mode to use to send each packet", input.
txMode);
413 cmd.AddValue (
"NPackets",
"The number of packets to send", input.
nPackets);
414 cmd.AddValue (
"TargetPsr",
"The psr needed to assume that we are within range", targetPsr);
415 cmd.Parse (argc, argv);
419 double precision = 0.1;
422 while (high - low > precision)
424 double middle = low + (high - low) / 2;
429 double psr =
CalcPsr (output, input);
430 if (psr >= targetPsr)
448 cmd.AddValue (
"NPackets",
"The number of packets to send for each transmitter", input.
nPackets);
449 cmd.AddValue (
"xA",
"the position of transmitter A", input.
xA);
450 cmd.AddValue (
"xB",
"the position of transmitter B", input.
xB);
451 cmd.Parse (argc, argv);
453 for (uint32_t i = 0; i < 100; i += 1)
461 std::cout << i <<
" " << perA <<
" " << perB << std::endl;
463 for (uint32_t i = 100; i < 4000; i += 50)
471 std::cout << i <<
" " << perA <<
" " << perB << std::endl;
476 int main (
int argc,
char *argv[])
480 std::cout <<
"Available experiments: "
484 <<
"PsrVsCollisionInterval "
488 std::string type = argv[1];
496 else if (type ==
"SizeVsRange")
500 else if (type ==
"PsrVsDistance")
504 else if (type ==
"PsrVsCollisionInterval")
510 std::cout <<
"Wrong arguments!" << std::endl;
uint32_t m_flowIdB
flow ID B
void SendA(void) const
Send A function.
struct Output m_output
output
void SendB(void) const
Send B function.
struct Input m_input
input
Ptr< WifiPhy > m_txB
transmit B
struct CollisionExperiment::Output Run(struct CollisionExperiment::Input input)
Run function.
Ptr< WifiPhy > m_txA
transmit A
uint32_t m_flowIdA
flow ID A
void Receive(Ptr< WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive function.
Ptr< WifiPhy > m_tx
transmit
void Send(void)
Send function.
struct Input m_input
input
void Receive(Ptr< WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Send receive function.
struct PsrExperiment::Output Run(struct PsrExperiment::Input input)
Run function.
struct Output m_output
output
Parse command-line arguments.
Introspection did not find any typical Config paths.
uint32_t GetFlowId(void) const
Gets the flow id for the tag.
void SetPosition(const Vector &position)
Smart pointer class similar to boost::intrusive_ptr.
Simulation virtual time values and global simulation resolution.
represent a single transmission mode
void SetErrorRateModel(const Ptr< ErrorRateModel > model)
Sets the error rate model.
virtual void ConfigureStandard(WifiStandard standard)
Configure the PHY-level parameters for different Wi-Fi standard.
void SetMobility(const Ptr< MobilityModel > mobility)
assign a mobility model to this device
void SetReceiveOkCallback(RxOkCallback callback)
std::vector< Ptr< WifiMacQueueItem > >::const_iterator begin(void) const
Return a const iterator to the first MPDU.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetTxPowerLevel(uint8_t powerlevel)
Sets the selected transmission power level.
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
void SetChannel(const Ptr< YansWifiChannel > channel)
Set the YansWifiChannel this YansWifiPhy is to be connected to.
void experiment(std::string queue_disc_type)
static void Send(Ptr< NetDevice > dev, int level, std::string emuMode)
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
uint32_t receivedA
received A
uint32_t receivedB
received B
uint32_t received
received
RxSignalInfo structure containing info on the received signal.
static void PrintPsr(int argc, char *argv[])
double CalcPsr(struct PsrExperiment::Output output, struct PsrExperiment::Input input)
static void PrintPsrVsCollisionInterval(int argc, char *argv[])
static void PrintPsrVsDistance(int argc, char *argv[])
static void PrintSizeVsRange(int argc, char *argv[])
static const uint32_t packetSize