用户文档 使用WifiNetDevice

本文介绍了如何使用ns-3模拟Wi-Fi网络,特别是配置WifiNetDevice的过程。主要包括配置WifiChannel、WifiPhy、WifiMac、创建WifiDevice以及配置移动性。文章详细解释了各个步骤,提供了助手类的使用方法,以及如何通过属性系统调整模型参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实施提供的模块化使得WifiNetDevice低级别配置强大但是复杂;出于这个原因,提供了一些助手类用简单的方式执行常见操作,并充分利用ns-3的属性系统以允许用户控制底层模型的参数化。
使用低级别ns-3 API 以及希望添加WifiNetDevice到节点的用户,必须创建一个实例化的WifiNetDevice,再增加些一定数目的对象,适当地将它们绑定在一起(WifiNetDevice 在这方面是非常模块化的,为了未来的 可扩展性)。对于低级别的API ,约20行代码就可以做到(见 ns3:: WifiHelper::Install 和 ns3::YansWifiPhyHelper::Create)。它们还必须建立一个WifiChannel,其中还包含了一些组成对象(ns3::YansWifiChannelHelper的::Create)。
但是,一些助手允许用户增加设备和信道,仅仅用几行代码,如果它们愿意使用默认值,以及助手提供额外的API 允许通过属性值来改变默认值。常用的属性值在属性章节中列出,在examples/wireless中的脚本可以看出是怎样做到的。接下来我们描述了从底层(WifiChannel)开始直到设备层(WifiNetDevice)创建WifiNetDevice的过程。
创建一个无线网络设备,用户需要配置主要的五个步骤:
1、配置WifiChannel:
无线信道负责从一个设备向其他设备在同一WiFi信道得到信号 。无线信道的主要配置是传播损耗模型和传输延迟模型。
2、配置WifiPhy:
无线物理层负责从无线信道 发送和接收的无线信号 ;在这里,无线PHY根据接收到的信号强度和噪声,决定每帧是否被成功解码;
因此,无线物理层的主要配置是错误率的模型,这是一个计算信号帧成功解码的概率
3、配置WifiMac:
这一步与体系结构和设备水平有较大关系,用户配置wifi架构(ad-hoc或ap-sta)以及QoS(802.11e)这些特征是否设备支持;
4、创建WifiDevice
在这一步,用户配置所需的wifi标准(如802.11b)和速率控制算法。
5、配置移动性:
最后,移动模型往往需要,在WifiDevice之前; 
1、YansWifiChannelHelper:
该助手用来创建一个使用默认PropagationLoss传播损耗模型和PropagationDelay传播延迟模型的WifiChannel;
YansWifiChannelHelper  wifiChannelHelper = YansWifiChannelHelper::Default ();
Ptr<Wifi Channel> wifiChannel = wifiChannelHelper.Create ();
该信道模型中:
默认传播延迟为常数=光速 (ns3::ConstantSpeedPropagationDelayModel)
传播损耗模型为(ns3::LogDistancePropagationLossModel)使用默认指数为3,1m的参考损耗为46.6777dB,该参考损耗值46.6777dB是使用Friis传播损耗模型在5.15GHz,参考损耗一定要改,如果我们使用802.11,因为它们的工作频率在2.4GHz。
注意到创建助手对象与实际模拟对象的区别:在ns-3中,助手对象(助手API)在栈上创建,但是,实际的ns-3对象通常继承自类ns3::Obiect,且被分配到一个智能指针;参见ns-3manual 讨论 ns-3object model
下面2种方法,当配置YansWifiChannelHelper会用到:
1)YansWifiChannelHelper::AddPropagationLoss向传播损耗模型中增加一个模型;
2)YansWifiChannelHelper::SetPropagationDelay设置一个传播延迟模型;
2、YansWifiPhyHelper:
物理设备(基类ns3::phy)连接到ns3::Channel,需要为YansWifiChannel创建恰当的Phy对象,YansWifiPhyHelper将做这样的工作;
YansWifiPhyHelper类配置对象工厂,创建实例化的YansWifiPhy,增加了一些其他对象,包括补充的ErrorRateModel和MobilityModel的指针,用户代码通常为:
YansWifiPhyHelper wifiPhyHelper = YansWifiPhyHelper::Default ();
wifiPhyHelper.SetChannel (wifiChannel);
默认的模型是:NistErrorRateModel (ns3::NistErrorRateModel),你可以调用
YansWifiPhyHelper::SetErrorRateModel修改错误率模型;
YansWifiPhyHelper::SetPcapDataLinkType  (enum SupportedPcapDataLinkTypes dlt)使用该命令增加Pcap 跟踪信息;
ns-3 支持 Radio Tap 以及 Prism tracing拓展 for 802.11.
目前没有真正建立任何WifiPhy对象,刚编写的YansWifiPhyHelper只能分辨连接到哪个通道;
下面有几行代码,我还没看出来有什么用,用到的时候再回头看下;
3、WifiMacHelper:
WifiMacHelper考虑到MAC low以及MAC high 模型。
NqosWifiMacHelper:我论文应该是这种情况,研究是没有Qos的MAC协议
ns3::NqosWifiMacHelper配置对象工厂来创建实例化的ns3::WifiMac,用来配置MAC地址不同的参数;
为了创建ad -hoc MAC实例,可以使用ns3::AdhocWifiMac,下面是代码啦:
NqosWifiMacHelper  wifiMacHelper = NqosWifiMacHelper::Default ();
Ssid ssid = Ssid ("ns-3-ssid");
wifiMacHelper.SetType (     "ns3::AdhocWifiMac ",
                                           "Ssid", Ssid Value (ssid),
                                           "Active Probing", Boolean Value (false));
4、WifiHelper:
现在可以创建WifiNetDevice,首先使用默认设置创建WifiHelper
WifiHelper  wifiHelper = WifiHelper::Default ();
它设置默认的wifi标准802.11a,且设置RemoteStationManager用于ns3::ArfWifiManager;你可以通过调用
WifiHelper::SetRemoteStationManager 改变RemoteStationManager;调用WifiHelper::SetStandard去改变wifi标准;
下面代码是使用所创建的wifiPhyHelper 和 wifiMacHelper在NodeContainer的“c”的一组节点上安装WifiNetDevices;
NetDeviceContainer  wifiContainer = WifiHelper::Install (wifiPhyHelper, wifiMacHelper, c);
创建的WifiNetDevice还包括WifiRemoteStationManager、WifiMac、WifiPhy(连接到匹配WifiChannel)
WifiHelper::SetStandard方法,在选择的标准版本中,设置不同默认的计时参数,重写的值可能已经存在或已经预先被配置;为了改变被WifiHelper::SetStandard重写的参数,安装后可以使用Config::Set;
下面的代码,感觉怎么会是不完整呢,惊呆了,哎,还是回头看下manual吧

5、移动性配置
详细参考Mobility module章节
每个节点的wifi设备都应该改配置移动模型,移动模型用来计算传播损耗和传播延迟;下面有2个例子
其中一个是ad-hoc网络的移动模型配置:wifi-simple-adhoc.cc(examples/wireless)
import ns.core import ns.network import ns.internet import ns.applications import ns.csma import ns.wifi import ns.mobility import ns.flow_monitor # 仿真参数设置 sim_time = 100 # 仿真时间 num_nodes = 10 # 节点数量 data_rate = "1Mbps" # 数据速率 packet_size = 1024 # 数据包大小 qos_mechanism = "priority_queue" # QoS 机制 # 创建节点 nodes = ns.network.NodeContainer() nodes.Create(num_nodes) # 配置网络协议栈 internet = ns.internet.InternetStackHelper() internet.Install(nodes) # 配置物理层和链路层 wifi = ns.wifi.WifiHelper() wifi_phy = ns.wifi.YansWifiPhyHelper.Default() wifi_channel = ns.wifi.YansWifiChannelHelper.Default() wifi_phy.SetChannel(wifi_channel.Create()) wifi_mac = ns.wifi.WifiMacHelper() wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager", "DataMode", ns.core.StringValue(data_rate)) wifi_devices = wifi.Install(wifi_phy, wifi_mac, nodes) # 配置移动模型 mobility = ns.mobility.MobilityHelper() mobility.SetPositionAllocator("ns3::GridPositionAllocator", "MinX", ns.core.DoubleValue(0.0), "MinY", ns.core.DoubleValue(0.0), "DeltaX", ns.core.DoubleValue(5.0), "DeltaY", ns.core.DoubleValue(10.0), "GridWidth", ns.core.UintegerValue(3), "LayoutType", ns.core.StringValue("RowFirst")) mobility.SetMobilityModel("ns3::RandomWalk2dMobilityModel", "Bounds", ns.mobility.RectangleValue(ns.mobility.Rectangle(-50, 50, -50, 50))) mobility.Install(nodes) # 配置 QoS 机制 if qos_mechanism == "priority_queue": # 配置优先级队列 ns.core.Config.SetDefault("ns3::PfifoFastQueueDisc::MaxSize", ns.core.StringValue("1000p")) ns.core.Config.SetDefault("ns3::PfifoFastQueueDisc::Priority", ns.core.StringValue("1,2,3")) elif qos_mechanism == "traffic_shaping": # 配置流量整形 pass elif qos_mechanism == "resource_reservation": # 配置资源预留 pass # 配置应用层 # 假设使用 UDP 协议传输视频流和音频流 video_port = 9 audio_port = 10 # 教师节点作为视频和音频服务器 teacher_node = nodes.Get(0) video_server_app = ns.applications.UdpEchoServerHelper(video_port) video_server_app.Install(teacher_node) audio_server_app = ns.applications.UdpEchoServerHelper(audio_port) audio_server_app.Install(teacher_node) # 学生节点作为视频和音频客户端 for i in range(1, num_nodes): student_node = nodes.Get(i) video_client_app = ns.applications.UdpEchoClientHelper(ns.network.Ipv4Address("10.1.1.1"), video_port) video_client_app.SetAttribute("MaxPackets", ns.core.UintegerValue(1000)) video_client_app.SetAttribute("Interval", ns.core.TimeValue(ns.core.Seconds(1.0))) video_client_app.SetAttribute("PacketSize", ns.core.UintegerValue(packet_size)) video_client_app.Install(student_node) audio_client_app = ns.applications.UdpEchoClientHelper(ns.network.Ipv4Address("192.168.1.1"), audio_port) audio_client_app.SetAttribute("MaxPackets", ns.core.UintegerValue(1000)) audio_client_app.SetAttribute("Interval", ns.core.TimeValue(ns.core.Seconds(1.0))) audio_client_app.SetAttribute("PacketSize", ns.core.UintegerValue(packet_size)) audio_client_app.Install(student_node) # 启动仿真 ns.core.Simulator.Stop(ns.core.Seconds(sim_time)) ns.core.Simulator.Run() ns.core.Simulator.Destroy() # 数据收集与分析 flow_monitor_helper = ns.flow_monitor.FlowMonitorHelper() flow_monitor = flow_monitor_helper.InstallAll() flow_monitor.SerializeToXmlFile("flow-monitor.xml", True, True) # 从 flow-monitor.xml 文件中提取网络性能指标 (带宽、延迟、抖动、丢包率) # 使用 PSNR、SSIM、VMAF 等指标评估视频质量 # 使用 PESQ、POLQA 等指标评估音频质量 # 使用问卷调查收集用户主观满意度评分
最新发布
03-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值