56 except ModuleNotFoundError:
58 "Error: ns3 Python module not found;"
59 " Python bindings may not be enabled"
60 " or your PYTHONPATH might not be properly configured"
79 from ctypes
import c_double, c_int
81 backboneNodes = c_int(10)
84 stopTime = c_double(20)
85 cmd = ns.CommandLine(__file__)
91 ns.core.Config.SetDefault(
"ns3::OnOffApplication::PacketSize", ns.core.StringValue(
"1472"))
92 ns.core.Config.SetDefault(
"ns3::OnOffApplication::DataRate", ns.core.StringValue(
"100kb/s"))
100 cmd.AddValue(
"backboneNodes",
"number of backbone nodes", backboneNodes)
101 cmd.AddValue(
"infraNodes",
"number of leaf nodes", infraNodes)
102 cmd.AddValue(
"lanNodes",
"number of LAN nodes", lanNodes)
103 cmd.AddValue[
"double"](
"stopTime",
"simulation stop time(seconds)", stopTime)
111 if stopTime.value < 10:
112 print(
"Use a simulation stop time >= 10 seconds")
124 backbone = ns.network.NodeContainer()
125 backbone.Create(backboneNodes.value)
130 wifi = ns.wifi.WifiHelper()
131 mac = ns.wifi.WifiMacHelper()
132 mac.SetType(
"ns3::AdhocWifiMac")
133 wifi.SetRemoteStationManager(
134 "ns3::ConstantRateWifiManager",
"DataMode", ns.core.StringValue(
"OfdmRate54Mbps")
136 wifiPhy = ns.wifi.YansWifiPhyHelper()
137 wifiPhy.SetPcapDataLinkType(wifiPhy.DLT_IEEE802_11_RADIO)
138 wifiChannel = ns.wifi.YansWifiChannelHelper.Default()
139 wifiPhy.SetChannel(wifiChannel.Create())
140 backboneDevices = wifi.Install(wifiPhy, mac, backbone)
144 print(
"Enabling OLSR routing on all backbone nodes")
145 internet = ns.internet.InternetStackHelper()
146 olsr = ns.olsr.OlsrHelper()
147 internet.SetRoutingHelper(olsr)
149 internet.Install(backbone)
156 ipAddrs = ns.internet.Ipv4AddressHelper()
157 ipAddrs.SetBase(ns.network.Ipv4Address(
"192.168.0.0"), ns.network.Ipv4Mask(
"255.255.255.0"))
158 ipAddrs.Assign(backboneDevices)
164 mobility = ns.mobility.MobilityHelper()
165 mobility.SetPositionAllocator(
166 "ns3::GridPositionAllocator",
168 ns.core.DoubleValue(20.0),
170 ns.core.DoubleValue(20.0),
172 ns.core.DoubleValue(20.0),
174 ns.core.DoubleValue(20.0),
176 ns.core.UintegerValue(5),
178 ns.core.StringValue(
"RowFirst"),
180 mobility.SetMobilityModel(
181 "ns3::RandomDirection2dMobilityModel",
183 ns.mobility.RectangleValue(ns.mobility.Rectangle(-500, 500, -500, 500)),
185 ns.core.StringValue(
"ns3::ConstantRandomVariable[Constant=2]"),
187 ns.core.StringValue(
"ns3::ConstantRandomVariable[Constant=0.2]"),
189 mobility.Install(backbone)
199 ipAddrs.SetBase(ns.network.Ipv4Address(
"172.16.0.0"), ns.network.Ipv4Mask(
"255.255.255.0"))
201 for i
in range(backboneNodes.value):
202 print(
"Configuring local area network for backbone node ", i)
208 newLanNodes = ns.network.NodeContainer()
209 newLanNodes.Create(lanNodes.value - 1)
211 lan = ns.network.NodeContainer(ns.network.NodeContainer(backbone.Get(i)), newLanNodes)
216 csma = ns.csma.CsmaHelper()
217 csma.SetChannelAttribute(
"DataRate", ns.network.DataRateValue(ns.network.DataRate(5000000)))
218 csma.SetChannelAttribute(
"Delay", ns.core.TimeValue(ns.core.MilliSeconds(2)))
219 lanDevices = csma.Install(lan)
223 internet.Install(newLanNodes)
228 ipAddrs.Assign(lanDevices)
238 mobilityLan = ns.mobility.MobilityHelper()
239 positionAlloc = ns.mobility.ListPositionAllocator()
240 for j
in range(newLanNodes.GetN()):
241 positionAlloc.Add(ns.core.Vector(0.0, (j * 10 + 10), 0.0))
243 mobilityLan.SetPositionAllocator(positionAlloc)
244 mobilityLan.PushReferenceMobilityModel(backbone.Get(i))
245 mobilityLan.SetMobilityModel(
"ns3::ConstantPositionMobilityModel")
246 mobilityLan.Install(newLanNodes)
256 ipAddrs.SetBase(ns.network.Ipv4Address(
"10.0.0.0"), ns.network.Ipv4Mask(
"255.255.255.0"))
258 for i
in range(backboneNodes.value):
259 print(
"Configuring wireless network for backbone node ", i)
265 stas = ns.network.NodeContainer()
266 stas.Create(infraNodes.value - 1)
268 infra = ns.network.NodeContainer(ns.network.NodeContainer(backbone.Get(i)), stas)
272 ssid = ns.wifi.Ssid(
"wifi-infra" + str(i))
273 wifiInfra = ns.wifi.WifiHelper()
274 wifiPhy.SetChannel(wifiChannel.Create())
275 macInfra = ns.wifi.WifiMacHelper()
276 macInfra.SetType(
"ns3::StaWifiMac",
"Ssid", ns.wifi.SsidValue(ssid))
279 staDevices = wifiInfra.Install(wifiPhy, macInfra, stas)
281 macInfra.SetType(
"ns3::ApWifiMac",
"Ssid", ns.wifi.SsidValue(ssid))
282 apDevices = wifiInfra.Install(wifiPhy, macInfra, backbone.Get(i))
284 infraDevices = ns.network.NetDeviceContainer(apDevices, staDevices)
288 internet.Install(stas)
293 ipAddrs.Assign(infraDevices)
302 subnetAlloc = ns.mobility.ListPositionAllocator()
305 tempRef.append(subnetAlloc)
311 for j
in range(infra.GetN()):
312 subnetAlloc.Add(ns.core.Vector(0.0, j, 0.0))
314 mobility.PushReferenceMobilityModel(backbone.Get(i))
315 mobility.SetPositionAllocator(subnetAlloc)
316 mobility.SetMobilityModel(
317 "ns3::RandomDirection2dMobilityModel",
319 ns.mobility.RectangleValue(ns.mobility.Rectangle(-10, 10, -10, 10)),
321 ns.core.StringValue(
"ns3::ConstantRandomVariable[Constant=3]"),
323 ns.core.StringValue(
"ns3::ConstantRandomVariable[Constant=0.4]"),
325 mobility.Install(stas)
335 print(
"Create Applications.")
338 appSource = ns.network.NodeList.GetNode(backboneNodes.value)
341 + backboneNodes.value * (lanNodes.value - 1)
342 + backboneNodes.value * (infraNodes.value - 1)
345 appSink = ns.network.NodeList.GetNode(lastNodeIndex)
349 Ipv4Address getIpv4AddressFromNode(Ptr<Node> node){
350 return node->GetObject<Ipv4>()->GetAddress(1,0).GetLocal();
355 remoteAddr = ns.cppyy.gbl.getIpv4AddressFromNode(appSink)
356 socketAddr = ns.network.InetSocketAddress(remoteAddr, port)
357 onoff = ns.applications.OnOffHelper(
"ns3::UdpSocketFactory", socketAddr.ConvertTo())
358 apps = onoff.Install(ns.network.NodeContainer(appSource))
359 apps.Start(ns.core.Seconds(3))
360 apps.Stop(ns.core.Seconds(stopTime.value - 1))
363 sink = ns.applications.PacketSinkHelper(
364 "ns3::UdpSocketFactory",
365 ns.network.InetSocketAddress(
366 ns.network.InetSocketAddress(ns.network.Ipv4Address.GetAny(), port)
369 sinkContainer = ns.network.NodeContainer(appSink)
370 apps = sink.Install(sinkContainer)
371 apps.Start(ns.core.Seconds(3))
379 print(
"Configure Tracing.")
380 csma = ns.csma.CsmaHelper()
384 ascii = ns.network.AsciiTraceHelper()
385 stream = ascii.CreateFileStream(
"mixed-wireless.tr")
386 wifiPhy.EnableAsciiAll(stream)
387 csma.EnableAsciiAll(stream)
388 internet.EnableAsciiIpv4All(stream)
391 csma.EnablePcapAll(
"mixed-wireless",
False)
393 wifiPhy.EnablePcap(
"mixed-wireless", backboneDevices)
394 wifiPhy.EnablePcap(
"mixed-wireless", appSink.GetId(), 0)
407 print(
"Run Simulation.")
408 ns.core.Simulator.Stop(ns.core.Seconds(stopTime.value))
409 ns.core.Simulator.Run()
410 ns.core.Simulator.Destroy()
413 if __name__ ==
"__main__":