首页 > 编程语言 >NS-3源码学习(七)追踪和Probe

NS-3源码学习(七)追踪和Probe

时间:2023-12-20 20:12:19浏览次数:43  
标签:上下文 函数 回调 Probe wifi 源码 NS 追踪

追踪框架和WiFi的STA接入AP时使用的Probe Request帧、Probe Response帧没有关系。

追踪

NS-3的追踪框架主要用于追踪一个对象当中某个属性的变更、或者某个事件的发生。NS-3初始规定了一些追踪源,一般在model的GetTypeId()方法中定义了这些追踪源(和这个model的属性),我们可以使用两种方法(Config或model自带的Connect方法)为这些追踪源添加两种回调函数(带有上下文和不带上下文):

  1. 对于一个自定义的回调函数,它的形式和我们写的普通的函数没有什么不同。需要注意的一点是传入回调函数的参数的个数和顺序需要和追踪源模板的顺序相同

    1. 另外的一点是,若回调函数有“上下文”的需要,上下文参数作为传入的第一个参数

    2. 例如我们追踪WifiNetDevice的phy层状态的变化,在其TypeId中有如下定义:

      .AddTraceSource("State",
                      "The state of the PHY layer",
                      MakeTraceSourceAccessor(&WifiPhyStateHelper::m_stateLogger),
                      "ns3::WifiPhyStateHelper::StateTracedCallback")
                      
      /**
      * The trace source fired when state is changed.
      */
      TracedCallback<Time, Time, WifiPhyState> m_stateLogger;
      
      1. 其模板使用了三个参数,那我们带有上下文的回调函数可以进行如下定义,其中第一个参数为上下文字符串。然后使用makecallback将其转化为回调函数

        void
        WifiStateTrace(std::string context, Time start, Time duration, WifiPhyState state)
        {}
        
        
        std::string context
        wifi_phy_state->TraceConnect("State",
                                    context + std::to_string(phyid),
                                    MakeCallback(&WifiStateTrace));
        
  2. 利用Config模块连接追踪源与回调函数

    bool ConnectWithoutContextFailSafe(std::string path, const ns3::CallbackBase &cb)
    
    1. 这种方法适用于为同一种实例批量批量添加回调函数,使用这种方法时只需要知道目标路径,然后使用MakeCallback方法将函数转化为回调函数即可

    2. 可以从ns-3的官方文档中得到一个追踪源的路径,文档中model描述页面的Detailed Description章节中写明了该model通过Config的路径,追踪源的路径为:<model的路径>/<追踪源名称>

      1. 例如我想要追踪所有WifiNetDevice的物理层变化,可以使用下述方式添加一个无上下文字符串的回调函数;这种无上下文的连接方法的弊端是对于某些追踪源,他返回的参数中没有写明自身是谁,这就导致我们只知道“物理层发生了改变”,但是并不知道“谁的物理层发生了改变”;

        Config::ConnectWithoutContextFailSafe(
                "/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phys/*/State/State",
                MakeCallback(&WifiStateTrace));
        
      2. 并不是说Config的方式添加追踪函数就无法添加上下文,Config应该也提供了添加带上下文的回调函数的方案,不过我暂时不太清楚,而且既然Config的特色是可以批量添加,那这个上下文确实能发挥什么作用吗?

  3. 利用模块自带的Connect之类的方法添加回调函数

    1. 这种添加回调函数的方法更精细,也就能精准的为每一个回调函数添加不同的上下文,还是用上面的“追踪物理层的变化”举例,使用该方法添加回调函数:

      /**
      * Connects the trace for the state of each WifiPhy to the given context.
      *
      * @param wifi_dev The WifiNetDevice to connect the trace to.
      * @param context The context string to be appended to the trace name.
      */
      void
      ConnectContextTrace2Mac(Ptr<WifiNetDevice> wifi_dev, std::string context)
      {
          Ptr<WifiMac> wifi_mac = wifi_dev->GetMac();
          int phyid = 0;
          for (Ptr<WifiPhy> wifi_phy : wifi_dev->GetPhys())
          {
              Ptr<WifiPhyStateHelper> wifi_phy_state = wifi_phy->GetState();
              wifi_phy_state->TraceConnect("State",
                                          context + std::to_string(phyid),
                                          MakeCallback(&WifiStateTrace));
              phyid++;
          }
      }
      
    2. 也就是说,这个方法需要逐层拿到我们的追踪源所在的model

Probe

WLAN有两种探测机制:一种为无线终端被动的侦听Beacon帧之后,根据获取的无线网络情况,选择AP建立连接;另外一种为无线终端主动发送Probe request探测周围的无线网络,然后根据获取的Probe Response报文获取周围的无线网络,之后选择AP建立连接。

NS-3在EHT的示例文件中并没有设置对Probe机制开启的选项,不过在mac层中拥有一个开启该探测机制的属性:

.AddAttribute(
                "ActiveProbing",
                "If true, we send probe requests. If false, we don't."
                "NOTE: if more than one STA in your simulation is using active probing, "
                "you should enable it at a different simulation time for each STA, "
                "otherwise all the STAs will start sending probes at the same time resulting in "
                "collisions. "
                "See bug 1060 for more info.",
                BooleanValue(false),
                MakeBooleanAccessor(&StaWifiMac::SetActiveProbing, &StaWifiMac::GetActiveProbing),
                MakeBooleanChecker())

另外还有一个属性和探测属性相关,即仿真开始后多长时间STA节点开始发送Probe Request帧,这个属性和一个随机数生成绑定,因为若所有STA节点同时发送Probe Request帧会导致碰撞。

随机数不是一个适合用于仿真的量,因为我们做仿真的目的就是要完全的掌控所有环境变量。因此我们需要设置随机数的种子来保证每次仿真生成的随机数都是一致的。

有趣的是,NS-3的示例文件中虽然没有对Probe机制是否开启的设定,但是设置了mac层发送Probe Request的延迟的随机数种子,代码如下所示,当然,这段设置种子的代码不仅仅设置了Probe的delay时间随机数

streamNumber += wifiHelper.AssignStreams(apDevice, streamNumber);
streamNumber += wifiHelper.AssignStreams(
        staDevices,
        streamNumber); // 既为不同种类的device分配了不同的随机数种子,又保证了在不同的仿真实验中,随机数种子相同,从而保证了实验的可重复性。

开启该机制后,明明我没有设置发送CTS\RTS的选项,却依然在pcap文件中看到了到了相应的管理帧(CTS),而且没看到RTS帧,至于为什么会出现这种情况,还需要进一步的分析。

通过分析在实际的WiFi系统中抓包后生成的pcap文件,并没有在Probe Request和Probe Response之后路由器发送CTS帧hold住信道不允许其他设备发送数据帧的情况,而是直接就开始Association过程,然后Authentication四次握手。

标签:上下文,函数,回调,Probe,wifi,源码,NS,追踪
From: https://www.cnblogs.com/polariszg/p/17917390.html

相关文章

  • transformer总体架构
    transformer总体架构目录transformer总体架构循环神经网络总体架构EncoderDecoder输入输出层模型输入位置编码模型输出自注意力机制关于QKV的理解Q,K,V及注意力计算多头注意力机制多头注意力机制作用FeedForward层参考资料论文地址:AttentionisAllYouNeedhttps://arxiv......
  • transformer补充细节
    transformer补充细节目录transformer补充细节注意力机制细节为什么对点积注意力进行缩放多头带来的好处数据流训练时数据流推理时数据流解码器中注意力的不同带掩码的注意力机制位置编码整型数值标记[0,1]范围标记位置二进制标记周期函数标识用sin和cos交替来表示位置训练测试细......
  • springboot051医院管理系统-计算机毕业设计源码+LW文档
    一、立题依据(研究的目的与意义及国内外现状):现如今,互联网的广泛普及与应用,标志着信息化的时代已经到来,管理信息化行业在生活中占据着越来越重要的地位,信息化的服务与管理,大大简化了传统的管理模式,很大程度上,改善了使得人们的生活水平和工作方式。简单的来说医院管理信息化的形式非......
  • springboot053宠物咖啡馆平台-计算机毕业设计源码+LW文档
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于SpringBoot的宠物咖啡馆平台的设计与实现的开发全过程。通过分析基于SpringBoot的宠物咖啡馆平台的设计与实现管理的不足,创建了一个计算机管理基于SpringBoot的宠物咖啡馆......
  • springboot054飘香水果购物网站 -计算机毕业设计源码+LW文档
    摘要随着信息互联网购物的飞速发展,一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了飘香水果购物网站的开发全过程。通过分析企业对于飘香水果购物网站的需求,创建了一个计算机管理飘香水果购物网站的方案。文章介绍了飘香水果购物网站的系统分析部分,包括可行性分......
  • springboot055服装生产管理-计算机毕业设计源码+LW文档
    一、现状、意义和目的1.背景与现状近年来,随着经济全球化与科技管理信息化的协同发展,而又因服装业所面对的是终端消费者市场,是由消费者主导的供应链,服装需求更加多样化,致使服装市场的竞争日趋激烈。随之产品生命周期变短,消费者数量的不断增多及需求快速多变等特性导致服装需求激增,协......
  • conda install -c conda-forge cupy
     (base)root@ubuntulenovo:/home/renguoqiang#condainstall-cconda-forgecupyCollectingpackagemetadata(current_repodata.json):/WARNINGconda.models.version:get_matcher(556):Using.*withrelationaloperatorissuperfluousanddeprecatedandwill......
  • springboot052旅游管理系统 -计算机毕业设计源码+LW文档
    摘 要随着旅游业的迅速发展,传统的旅游信息查询方式,已经无法满足用户需求,因此,结合计算机技术的优势和普及,针对常州旅游,特开发了本基于Bootstrap的常州地方旅游管理系统。 本论文首先对常州地方旅游管理系统进行需求分析,从系统开发环境、系统目标、设计流程、功能设计等几个方面......
  • beanshell导入java文件
    beanshell导入java文件beanshell可以读取class格式的文件步骤:    a、添加BeanShell预处理程序    b、请求调用   beanshell可以读取java格式的文件步骤:    a、添加BeanShell预处理程序    b、请求调用  ......
  • 基于java语言开发的医院绩效核算系统源码
    医院绩效考核系统全套源码,医院绩效核算系统源码,java语言开发    医院绩效考核系统可根据工作绩效考核管理规定,配置相应的绩效考核模型,从工作量统计、核算维度、核算权重三方面计算工作绩效,利用数据处理和数据分析的支撑作用,实现对工作量统计和绩效考核结果的统计分析展示,为......