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