NS3学习笔记20230629

自定义路由协议路径切换方法

以AODV路由协议举例,可以创建自定义路由协议类,继承AodvRoutingProtocol类,重写DoPathSwitching方法实现自定义。

以下为一个基本示例:

// 自定义路由协议类
class MyRoutingProtocol : public AodvRoutingProtocol
{
public:
  static TypeId GetTypeId()
  {
    static TypeId tid = TypeId("MyRoutingProtocol")
        .SetParent<AodvRoutingProtocol>()
        .AddConstructor<MyRoutingProtocol>();
    return tid;
  }

  // 重写路径切换方法
  virtual void DoPathSwitching()
  {
    // 获取当前活动路径
    Ptr<Ipv4Route> currentRoute = GetRoute();

    // 判断是否存在备用路径
    if (HasBackupPath())
    {
      // 获取备用路径
      Ptr<Ipv4Route> backupRoute = GetBackupRoute();

      // 比较当前路径和备用路径的性能指标
      double currentDelay = CalculatePathDelay(currentRoute);
      double backupDelay = CalculatePathDelay(backupRoute);

      // 如果备用路径的延迟更低,切换路径
      if (backupDelay < currentDelay)
      {
        // 切换到备用路径
        SwitchToBackupPath(backupRoute);
      }
    }
  }

private:
  bool HasBackupPath()
  {
    // 判断是否存在备用路径
    // 在这个方法中,您需要根据自己的路由协议的实现,判断当前路由是否有备用路径。
    // 您可以检查路由表或其他相关数据结构,以确定是否存在备用路径。
    // 返回值为 true 表示存在备用路径,返回值为 false 表示不存在备用路径。
    // ...
  }

  Ptr<Ipv4Route> GetBackupRoute()
  {
    // 获取备用路径
    // 在这个方法中,您需要根据自己的路由协议的实现,获取当前路由的备用路径。
    // 您可以从路由表或其他相关数据结构中获取备用路径信息。
    // 返回值为指向备用路径的指针(Ipv4Route 对象)。
    // ...
  }

  double CalculatePathDelay(Ptr<Ipv4Route> route)
  {
    // 计算路径的延迟
    // 在这个方法中,您需要根据自己的路由协议的实现,计算给定路径的延迟。
    // 您可以根据路径中的各个跳跃点、链路属性等信息,计算出整个路径的延迟。
    // 返回值为路径的延迟值(例如,以毫秒为单位的延迟)。
    // ...
  }

  void SwitchToBackupPath(Ptr<Ipv4Route> backupRoute)
  {
    // 执行路径切换操作
    // 在这个方法中,您需要根据自己的路由协议的实现,执行实际的路径切换操作。
    // 这可能涉及修改路由表、更新路由信息、发送控制消息等。
    // 您可以使用提供的备用路径信息来切换路径。
    // ...
  }
};

Loggin系统

Logging系统是ns-3中一种基于控制台的消息记录模块,用来向用户即时地反馈命令的执行情况或者系统的运行情况。

使用方式
  1. 通过shell环境变量NS_LOG设置。
  2. 通过函数调用在脚本中设置。
信息等级
  1. LOG_ERROR——记录错误信息;
  2. LOG_WARN——记录警告信息;
  3. LOG_DEBUG——记录一些调试信息;
  4. LOG_INFO——记录一些程序相关的信息;
  5. LOG_FUNCTION——当有函数被调用时,该调用信息就被记录;
  6. LOG_LOGIC——对于整体逻辑的描述;
  7. LOG_ALL——包含上述的所有信息;

每一个高等级记录的信息都包含低等级所要记录的信息,比如信息等级为LOG_FUNCTION时,则会记录函数调用信息,以及调试信息、警告信息和错误信息。

每一个LOG_TYPE等价于一个LOG_LEVEL_TYPE,比如说LOG_FUNCTIONLOG_LEVEL_FUNCTION的功能是一样的。

具体使用
在脚本中通过函数调用
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);

摘自0627中的first.cc中的片段,其中LogComponentEnable()函数的作用是使记录模块有效。

其中,第一个参数为用户要注册的具有一定行为能力类组件字符串。

​ 第二个参数是显示的信息等级

first.cc中我们需要得到通信客户端和服务端的运行应用程序的行为信息,所以第一个参数即UdpEchoClientApplicationUdpEchoServerApplication,即所用到的应用程序类。

通过环境变量修改记录系统等级

使用方法是在编译脚本前使用export命令修改NS_LOG的值,比如针对first.cc这个例子,就可以使用:

export 'NS_LOG=UdpEchoClientApplication=level_all:UdpEchoServerApplication=level_all'

修改时需要使用超级用户

效果如下:
在这里插入图片描述

环境变量方法的两种附加前缀
  1. 如果需要了解信息是在何时由什么函数生成的,以便调试代码,可以使用如下命令。

    export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func:UdpEchoServerApplication=level_all|prefix_func'
    

    效果如下:

在这里插入图片描述

  1. 如果想明确地知道各个函数以及事件的发生时间,可以继续添加前缀。

    export 'NS_LOG=UdpEchoClientApplication=level_all|prefix_func|prefix_time:UdpEchoServerApplication=level_all|prefix_func|prefix_time'
    

    效果如下:在这里插入图片描述

对铱星系统模拟的一些思考

可以考虑使用下列模块实现

  • PointToPointNetDevice(点对点网络设备):可以用于模拟卫星间的无线链接。
  • MobilityMoel(移动模型):选择适当的移动模型来模拟卫星的移动。

后续有新思路将继续补充···

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值