2021.4.17学习记录

今天没有再像前几天一样抱着代码看一整天,带着我从图书馆借的书看了一下,又看了看之前下载好的论文,也算是有所收获吧。
感觉最近虽然没有代码上的成果,但是相比一开始接触NS3,这几天还是进步了一些,能够摸清一些代码编写的逻辑了。
刚刚参考了一篇论文《基于NS3的无线自组网仿真实现》,第一次自己编写了一下NS3下的.cc文件:

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/mobility-module.h"
#include "ns3/wifi-module.h"
#include "ns3/udp-echo-server.h"

//#include "ns3/applications-module.h"

using namespace ns3;

int main(int argc ,char *argv[])
{
	uint32_t nwifi=16;
	CommandLine cmd;
	cmd.AddValue("nwifi","number of wifi devices",nwifi);
	cmd.Parse(argc,argv);

	NodeContainer wifiAdhocNodes;
	wifiAdhocNodes.Create(nwifi);

	WifiHelper wifi=WifiHelper::Default();
	NqosWifiMacHelper wifiMac=NqosWifiMacHelper::Default();
	wifiMac.SetType("ns3::AdhocWifiMac");
	YansWifiPhyHelper wifiPhy=YansWifiPhyHelper::Default();
	YansWifiChannelHelper wifiChannel=YansWifiChannelHelper::Default();
	wifiPhy.SetChannel(wifiChannel.Create());

	NetDeviceContainer wifiAdhocDevices=wifi.Install(wifiPhy,wifiMac,wifiAdhocNodes);
/*	
	MobilityHelper mobility;
	mobility.SetPositionAllocator("ns3::GridPositionAllocator",
				      "MinX",DoubleValue(0.0),
				      "MinY",DoubleValue(0.0),
				      "DeltaX",DoubleValue(5.0),
				      "DeltaY",DoubleValue(10.0),
				      "GridWidth",UintegerValue(3),
				      "LayoutType",StringValue("RowFirst"));
	mobility.SetMobilityModel("ns3::RandomWalk2dMobilityModel",
				  "Bounds",RectangleValue(Rectangle(-50,50,-50,50)));
	mobility.Install(wifiAdhocNodes);
*/
	InternetStackHelper stack;
	stack.Install(wifiAdhocNodes);
	Ipv4AddressHelper address;
	address.SetBase("10.1.1.0","255.255.255.0");
	Ipv4InterfaceContainer AdhocInterfaces;
	AdhocInterfaces=address.Assign(wifiAdhocDevices);

	UdpEchoServerHelper echoServer (9);
	ApplicationContainer serverApps=echoServer.Install(wifiAdhocNodes.Get(15));
	serverApps.Start(Seconds(1.0));
	serverApps.Stop(Seconds(10.0));

	UdpEchoClientHelper echoClient (AdhocInterfaces.GetAddress(15),9);
	echoClient.SetAttribute("MaxPackets",UintegerValue(100));
	echoClient.SetAttribute("Interval",TimeValue (Seconds(1.0)));
	echoClient.SetAttribute("PacketSize",UintegerValue(1024));
	ApplicationContainer clientApps=echoClient.Install(wifiAdhocNodes.Get(0));
	clientApps.Start(Seconds(2.0));
	clientApps.Stop(Seconds(10.0));

	Simulator::Stop(Seconds(15.0));
	Simulator::Run();
	Simulator::Destroy();
}

第一次运行,报错:
在这里插入图片描述
经多番查找,添加一个头文件#include "ns3/applications-module.h"即可,大概是因为,UdpEchoServerHelper和UdpEchoClientHelper是应用层的配置,所以要声明一下对应的头文件。

再次运行,又报错:
在这里插入图片描述
搜了半天也没有搜到为什么会报这个错(NS3可参考的东西真的太少了···我哭了),但是看他是和mobility相关的,我就想是不是没有设置节点的mobility属性的原因,随便找了一份代码,参考了一下的他的代码是怎么编写的,在我自己的代码中加上这样一段:

	MobilityHelper mobility;
	mobility.SetPositionAllocator("ns3::GridPositionAllocator",
				      "MinX",DoubleValue(0.0),
				      "MinY",DoubleValue(0.0),
				      "DeltaX",DoubleValue(5.0),
				      "DeltaY",DoubleValue(10.0),
				      "GridWidth",UintegerValue(3),
				      "LayoutType",StringValue("RowFirst"));
	mobility.SetMobilityModel("ns3::RandomWalk2dMobilityModel",
				  "Bounds",RectangleValue(Rectangle(-50,50,-50,50)));
	mobility.Install(wifiAdhocNodes);

再运行,成功了:
在这里插入图片描述
在这里插入图片描述
今天还学到了一点。我之前以为,如果在应用层设置了服务端是A,客户端是B,则运行时就只有A和B之间会传递数据包,读过这篇论文之后我才懂了原来不是这样的。
在两节点进行通信以前还要经过一个路由选择的阶段,在这个阶段不止AB间要通信,各个节点间都需要通信(大概吧,你看图1,就好像款七八糟的大家都在通信),总之是要建立起A到B之间的路由。
然后才是A和B之间的通信。论文中说“一旦两个节点之间明确了路由,数据流向比就会较稳定。”。(如图2)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值