omnet++Aloha案例解析

Aloha.ned文件

//Aloha网络由主机组成,这些主机通过纯Aloha或时隙Aloha协议
network Aloha
{
   

    parameters:
        //这里的参数都是aloha的
        int numHosts;  // number of hosts主机数
        double txRate @unit(bps);  // transmission rate传输速率
        double slotTime @unit(ms);  // zero means no slots (pure Aloha)时隙
        @display("bgi=background/terrain,s;bgb=1000,1000");//显示字符串的bgi标签指定整个网络的背景图像
    submodules:
        server: Server; //server继承自Server这个模块
        //host继承自Host,个数为numHosts,并给host的两个参数赋值
        //左边的txRate和slotTime是host.ned中的,右边的txRate和slotTime是parameters中定义的
        host[numHosts]: Host {
   
            txRate = txRate;
            slotTime = slotTime;
        }
}

Host.ned文件

//定义简单或复合模块
//ALOHAnet网络中的一台计算机。A computer in the ALOHAnet network.
simple Host
{
   
    parameters:
        @signal[state](type="long");
        @statistic[radioState](source="state";title="Radio state";enum="IDLE=0,TRANSMIT=1";record=vector);//enum表示信号的状态:IDLE空闲或TRANSMIT发送
        double txRate @unit(bps);          // transmission rate传输速率
        //用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份
        volatile int pkLenBits @unit(b);   // packet length in bits数据包长度
        volatile double iaTime @unit(s);   // packet interarrival time包间隔时间
        double slotTime @unit(s);          // zero means no slots (pure Aloha)时隙,值为0表示不分槽
        double x @unit(m);                 // the x coordinate of the host主机的x坐标
        double y @unit(m);                 // the y coordinate of the host主机的y坐标
        double idleAnimationSpeed;         // used when there is no packet being transmitted当没有数据包被传输时使用
        double transmissionEdgeAnimationSpeed; // used when the propagation of a first or last bit is visible当第一位或最后一位的传播可见时使用
        double midTransmissionAnimationSpeed; // used during transmission在传输过程中使用
        bool controlAnimationSpeed = default(true);
        @display("i=device/pc_s");//显示图片
}

Host.h文件

class Host : public cSimpleModule//Host是从cSimpleModule派生来的
{
   
  private:
    // parameters
    simtime_t radioDelay;//信号延时时间
    double txRate;//双精度
    //在运行时NED文件中声明的模块参数用cPar类表示,并调用cModule的par成员函数访问
    cPar *iaTime;//包时间,由模块定义的传输进来
    cPar *pkLenBits;//包长度
    simtime_t slotTime;
    bool isSlotted;//布尔,判断是否在时隙中

    // state variables, event pointers etc
    cModule *server;//模块
    cMessage *endTxEvent;//消息,停止传输时间
    enum {
    IDLE = 0, TRANSMIT = 1 } state;//枚举
    simsignal_t stateSignal;//信号,当前状态
    int pkCounter;//记录数据包数量package counter

    // position on the canvas, unit is m在画布上的位置,单位是m
    double x, y;

    // speed of light in m/s光速(m/s)
    const double propagationSpeed = 299792458.0;

    // animation parameters动画参数
    const double ringMaxRadius = 2000; // in m
    const double circlesMaxRadius = 1000; // in m
    double idleAnimationSpeed;
    double transmissionEdgeAnimationSpeed;
    double midtransmissionAnimationSpeed;

    //被mutable修饰,那么它就可以突破const的限制,在被const修饰的函数里面也能被修改
    // figures and animation state图形和动画状态
    cPacket *lastPacket = nullptr; // a copy of the last sent message, needed for animation动画所需的上次发送消息的副本
    mutable cRingFigure *transmissionRing = nullptr; // shows the last packet显示最后一个数据包
    mutable std::vector<cOvalFigure *> transmissionCircles; // ripples inside the packet ring包环内的波纹
//public部分声明构造函数和析构函数
  public:
    Host();
    virtual ~Host();
//protected部分声明虚函数
  protected:
    virtual void initialize() override;//初始化函数
    virtual void handleMessage(cMessage *msg) override;//处理函数
    virtual void refreshDisplay() const override;
    simtime_t getNextTransmissionTime();//获得下一次传输时间函数
};

}; //namespace

#endif

Host.cc文件

#include <algorithm>//提供迭代器的非成员模板函数
#include "Host.h"
namespace aloha {
   

Define_Module(Host);

Host::Host()//初始化调用,空
{
   
    endTxEvent = nullptr;
}

Host::~Host()//结束时调用
{
   
    delete lastPacket;
    cancelAndDelete(endTxEvent);
}

void Host::initialize()
{
   
    //registerSignal()方法以信号名称作为参数,并返回相应的simsignal_t值
    stateSignal = registerSignal("state");//从模块中取数据“state”
    server = getModuleByPath("server");//通过路径查找server模块的路径
    if (!server)//判断server是否存在
        throw cRuntimeError("server not found");//抛出一个错误中止程序

    //用par()函数从模块中读取初始化模块参数值
    txRate = par("txRate");
    iaTime = &par("iaTime");
    pkLenBits = &par("pkLenBits");

    slotTime = par("slotTime");
    isSlotted = slotTime > 0;
    WATCH(slotTime);//WATCH宏可以在Tkenv仿真界面中查看变量
    WATCH(isSlotted);

    endTxEvent = new cMessage("send/endTx");
    state = IDLE;//空闲
    emit(stateSignal, state);//当前信道的状态为空就可以发送消息,emit()接受一个自消息信号和数据
    pkCounter = 0;//包计数为0
    WATCH((int&)state);//(int &)y告诉编译器将y看成int对待(内存里的数据不做任何转换),(int*)是强制转换成整型指针
    WATCH(pkCounter);

    x = par("x").doubleValue();
    y = par("y").doubleValue();

    double serverX = server->par("x").doubleValue();
    double serverY = server->par("y").doubleValue();

    idleAnimationSpeed = par("idleAnimationSpeed");
    transmissionEdgeAnimationSpeed = par("transmissionEdgeAnimationSpeed");
    midtransmissionAnimationSpeed = par("midTransmissionAnimationSpeed");

    double dist = std::sqrt((x-serverX) * (x-serverX) + (y-serverY) * (y-serverY));//使用标准库中的函数或者对象都要用std来限定
    radioDelay = dist / propagationSpeed;

    //cDisplayString的setTagArg()方法可以用来更新文本
    //p位置,b形状大小,i图形,is图形大小&#x
  • 18
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值