LEACH算法源代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
this->nrStatusRec++;//接收到的节点自加
ev << "BS rec " << this->nrStatusRec << " nrNodes: "<< this->nrNodes << "\n";
//check if done
if (this->nrStatusRec == this->nrNodes - this->oldDeadNodes) {
if (msg->isSelfMessage()) {//本身的身消息
ev << "BS: got self message type " << msg->getKind() << "\n";//节点开始初始化完(在initialize()函数中)
if (msg->getKind() == SMSG_INIT) {
deadNodesVector.record(this->deadNodes);///记录当前死亡的节点*****************************************************I*****
olddeadNodesVector.record(this->oldDeadNodes);///记录所有死亡的节点****************************************************I*****
if (energy < 0 && this->halfDead == 0)this->halfDeadCtr++;//?????????????????????????????????????????????????
advInfo[sender].id = sender;//信息表中的发射量发射地址
advInfo[i].energy = 0;
advInfo[i].status = 0;
}//初始化节点信息共103项为什么是103??????????????????????
this->setGateSize("out", nrGates + 1);//需要设置参数值或门向量大小???????????
if (((Node*) nodePtr[sender])->myStatus != STATUS_DEAD)this->deadNodes++;//消息的状态
advInfo[sender].status = STATUS_DEAD;//此时的状态赋值为死亡
status = STATUS_DEAD;
cluster = ((Status2BSMessage*) msg)->getCluster();//簇
status = ((Status2BSMessage*) msg)->getStatus();//状态
xpos = ((Status2BSMessage*) msg)->getXpos();
ypos = ((Status2BSMessage*) msg)->getYpos();
double xpos, ypos;
/*???????????????????????????????????*/
sender = ((Status2BSMessage*) msg)->getSrcAddress();//发送信息地址
energy = ((Status2BSMessage*) msg)->getEnergy();//发送信息能量
((Node*) nodePtr[sender])->myStatus = STATUS_DEAD;
}
rating = energy - roundEnergyLoss;//发送功率
advInfo[sender].rating = rating;
ev << "BS received from " << sender << "status " << status<< " rating:" << rating << "\n";
advInfo[sender].energy = energy;
advInfo[sender].status = status;
advInfo[sender来自百度文库.xpos = xpos;
advInfo[sender].ypos = ypos;
if (advInfo[sender].energy < 0) {
///周围的复合模块可以通过parentModule()成员函数访问: cModule *parent = parentModule();
//例如,父模块的参数像这样被访问: double timeout = parentModule()->par( "t
this->myId = par("id");
cModule* mod;
int numNodes;//总的节点个数
int trRange;//总的轮数
int i;
numNodes = parent->par("numNodes");
ev << "BS numNodes is: " << numNodes << "\n";//总的节点个数是:
trRange = parent->par("trRange");
ev << "BS: got start message\n";//
this->initNodes();
}
} else {//其他消息no selfmessage来自节点的消息或者是簇头的消息
if (((ClusterMessage*) msg)->getProto() == CL_TOBS) {//簇头到基站的消息(红色的)。
ev << "BS trRange is: " << trRange << "\n";//总的轮数是:
for(i=1;i<=simulation.getLastModuleId();i++)//????????????????????????????????????????????
{
mod=simulation.getModule(i);//????????????????????????????????????????????????????????
this->setGateSize("in", nrGates + 1);//创建消息
cMessage* cmsg = new cMessage("init");//创建消息//cMessage是OMNET++的一个中心类。CMessage和子类的对象可以模拟一些东西:事
//件;消息;包;帧;蜂窝;网络中的位或信号传输;系统中的实体传输等//等。一个cMessage对象有许多属性:
//接收状态的节点==所有的节点—已经死亡的节点
this->oldDeadNodes += this->deadNodes;//已经死亡的节点数deadNodes为本轮死亡的节点
ev << "nodes dead " << this->deadNodes << "all dead "<< this->oldDeadNodes << "\n";
/*
* bs.cc
*
* Created on: 2011-4-17
* Author: syj
*/
#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
#include "bs.h"
#include "node.h"
#include "cl_msg_m.h"
ev << "status message " << "\n";//消息状态
double energy;
int cluster;//簇头
int status;//各个状态
int sender;//发射机
int clHead;
double curHEnergy;
int curHStatus;
double rating;
if(strcmp(mod->getName(),"node")==0)//遍历节点,把模块指针填充
{
nodePtr[((Node*)mod)->myId]=(Node*)mod;//Id标识,指针
}
}
}
/**********第六个执行的函数********************/
void BS::handleMessage(cMessage* msg) {//消息处理函数
this->xpos = par("xpos");
this->ypos = par("ypos");
this->nrNodes = parent->par("numNodes");//////////????????????????????????????????????????
this->nrGates = parent->par("numNodes");//////????????????????????????????????????????????
cmsg->setKind(SMSG_INIT);//初始化消息
scheduleAt(simTime(), cmsg);//立即发送给基站自己
ev<<"id:"<<this->myId <<"\n";//基站自己的地址
//)使用scheduleAt()发送自传消息;scheduleAt(absoluteTime, //msg);
this->halfDeadCtr = 0;//?????????????????????????????????
this->halfDead = 0;//????????????????????????????????????
this->calledEnd = 0;//??????????????????????????????????
this->P = 0.05;//??????????????????????????????????????
this->cHeadsRound = 0;////每一轮簇头的个数
this->roundEnergyLoss = 80001.0;//?????????????????????
/********************记录图像用的变量的名字******加的***************************/
void BS::initialize() {
int i;
cModule* parent = getParentModule();//消息参数的访问调用cModule的par()成员函数可以访问模块指针:
//cPar& delayPar = par("delay");cPar类是一个存储值的对象,//它支持数据类型,指针值可以这样读:
this->nrRounds = parent->par("rounds");
this->deadNodes = 0;
this->roundsDone = 0;
this->oldDeadNodes = 0;
this->nrStatusRec = 0;//?????????????????????????????????
//scheduleAt(simtime()+delta, msg);
}
/*********************第三个执行的函数*******************/
void BS::initNodes() {//初始化函数
cModule* parent = getParentModule();
tVector.setName("T");//运行的时间
lastrecVector.setName("lastrec");//最后记录的消息
cheadVector.setName("all head num");//所有的节点个数
for (i = 0; i < 104; i++) {
advInfo[i].id = 0;
#include "leach.h"
Define_Module( BS);//定义简单模块(1)直接或间接定义一个CSimpleModule的子类;
///(2)以define_Module()或define_Module_Like()宏注册之;
/******************第一个执行的函数***********************/
roundVector.setName("round");//轮数
deadNodesVector.setName("nodes dead");//死亡的节点
olddeadNodesVector.setName("all dead");//所有死亡的节点
nrheadVector.setName("headnumber");//簇头的个数
相关文档
最新文档