从同一源节点使用 Omnet++ 生成周期性消息
Generate perodic messages with Omnet++ from same source node
我有一个给定的网络,其节点具有这两种方法:
void Txc13::initialize()
{
// Module 0 sends the first message
if (getIndex() == 0) {
// Boot the process scheduling the initial message as a self-message.
TicTocMsg13 *msg = generateMessage();
simtime_t delay = par("delayTime");
scheduleAt(simTime()+delay, msg);
}
}
void Txc13::handleMessage(cMessage *msg)
{
// we do some casting to access the fields inside the message
TicTocMsg13 *ttmsg = check_and_cast<TicTocMsg13 *>(msg);
if (ttmsg->getDestination() == getIndex()) {
// Message arrived.
bubble("ARRIVED!");
delete ttmsg;
}
else {
// We need to forward the message.
forwardMessage(ttmsg);
}
}
这很好用。一旦离开节点 0 (getIndex()==0
) 的消息到达其预定目的地,模拟就会结束。
现在我愿意在 delay
.
之后触发几条离开 node0
的消息
延迟呈指数分布network.tic[*].delayTime = exponential(10s)
。
如何从同一个节点触发多条消息?
谢谢!
好的,我想我明白了。这是这两种方法的代码。在 initialize
方法中,我创建了一个 event
消息,我最初在 t=0
.
触发
void Txc13::initialize()
{
// Create the event object we'll use for timing -- just any ordinary message.
event = new cMessage("event");
// Module 0 sends the first message
if (getIndex() == 0) {
scheduleAt(0.0, event);
}
}
在 handleMessage
方法中,我检查传入消息是否为 event
。如果是这样,我会等待 simtime_t delay = par("delayTime")
呈指数分布,然后发送另一条自我消息并转发消息本身。
因为我希望所有消息都从 node0 开始,所以我还使用 getIndex() == 0
进行检查。
void Txc13::handleMessage(cMessage *msg)
{
if (msg == event and getIndex() == 0){
TicTocMsg13 *msg = generateMessage();
simtime_t delay = par("delayTime");
scheduleAt(simTime()+delay, event);
forwardMessage(msg);
}
else {
// we do some casting to access the fields inside the message
TicTocMsg13 *ttmsg = check_and_cast<TicTocMsg13 *>(msg);
if (ttmsg->getDestination() == getIndex()) {
// Message arrived.
//EV << "Message " << ttmsg << " arrived after " << ttmsg->getHopCount() << " hops.\n";
bubble("ARRIVED!");
delete ttmsg;
// Generate another one.
//EV << "Generating another message: ";
//TicTocMsg13 *newmsg = generateMessage();
//EV << newmsg << endl;
//forwardMessage(newmsg);
}
else {
// We need to forward the message.
forwardMessage(ttmsg);
}
}
}
有了这个,我得到了以下 elog,您可以在其中看到每个事件后转发一条消息。
我有一个给定的网络,其节点具有这两种方法:
void Txc13::initialize()
{
// Module 0 sends the first message
if (getIndex() == 0) {
// Boot the process scheduling the initial message as a self-message.
TicTocMsg13 *msg = generateMessage();
simtime_t delay = par("delayTime");
scheduleAt(simTime()+delay, msg);
}
}
void Txc13::handleMessage(cMessage *msg)
{
// we do some casting to access the fields inside the message
TicTocMsg13 *ttmsg = check_and_cast<TicTocMsg13 *>(msg);
if (ttmsg->getDestination() == getIndex()) {
// Message arrived.
bubble("ARRIVED!");
delete ttmsg;
}
else {
// We need to forward the message.
forwardMessage(ttmsg);
}
}
这很好用。一旦离开节点 0 (getIndex()==0
) 的消息到达其预定目的地,模拟就会结束。
现在我愿意在 delay
.
node0
的消息
延迟呈指数分布network.tic[*].delayTime = exponential(10s)
。
如何从同一个节点触发多条消息?
谢谢!
好的,我想我明白了。这是这两种方法的代码。在 initialize
方法中,我创建了一个 event
消息,我最初在 t=0
.
void Txc13::initialize()
{
// Create the event object we'll use for timing -- just any ordinary message.
event = new cMessage("event");
// Module 0 sends the first message
if (getIndex() == 0) {
scheduleAt(0.0, event);
}
}
在 handleMessage
方法中,我检查传入消息是否为 event
。如果是这样,我会等待 simtime_t delay = par("delayTime")
呈指数分布,然后发送另一条自我消息并转发消息本身。
因为我希望所有消息都从 node0 开始,所以我还使用 getIndex() == 0
进行检查。
void Txc13::handleMessage(cMessage *msg)
{
if (msg == event and getIndex() == 0){
TicTocMsg13 *msg = generateMessage();
simtime_t delay = par("delayTime");
scheduleAt(simTime()+delay, event);
forwardMessage(msg);
}
else {
// we do some casting to access the fields inside the message
TicTocMsg13 *ttmsg = check_and_cast<TicTocMsg13 *>(msg);
if (ttmsg->getDestination() == getIndex()) {
// Message arrived.
//EV << "Message " << ttmsg << " arrived after " << ttmsg->getHopCount() << " hops.\n";
bubble("ARRIVED!");
delete ttmsg;
// Generate another one.
//EV << "Generating another message: ";
//TicTocMsg13 *newmsg = generateMessage();
//EV << newmsg << endl;
//forwardMessage(newmsg);
}
else {
// We need to forward the message.
forwardMessage(ttmsg);
}
}
}
有了这个,我得到了以下 elog,您可以在其中看到每个事件后转发一条消息。