首页 > 解决方案 > 在 OMNET++ 中,如果它们都位于 WSN 中的不同 StandardHost 模块中,如何在运行时将控制值从一个应用程序发送到另一个应用程序?

问题描述

我正在开发一个基于 INET 4 框架的 OMNET++ 项目。我的网络由一个主节点和可变数量的从节点(默认为 65)组成,它们以星形配置连接。UdpBasicBurst我有两个从班级扩展的应用程序(主和从) 。我想定期将控制信号从主应用程序(在主节点中)传输到从属应用程序(在从节点中)。由于我不知道或不了解如何使用信号侦听器来执行上述操作,因此我尝试直接从主应用程序访问从属应用程序中的方法:

MasterApp::initialize()

for (int i=0;i<numHosts;i++){
     char buf[30];
     sprintf(buf,"slave[%d]",i);
     cModule *mod = getParentModule();
     cModule *moremod = mod->getParentModule();
     cModule *downmod = moremod->getSubmodule(buf);
     cModule *pmod = downmod->getSubmodule("app",0);
     listener[i] = check_and_cast<SlaveApp*>(pmod);
 }

MasterApp::controlSP(控制计算发生的地方;该函数的调度与 sendMessage() 或 generateBurst() 大致相同,后续调用之间的时间间隔为 1 秒):

for (i=0;i<numHosts;i++){
    listener[i]->transferSP(SendProb);
}

MasterApp.h

//Forward declaration
class SlaveApp;

class MasterApp: public UdpBasicBurst也在里面MasterApp.h

SlaveApp *listener[65];

SlaveApp.h

public:
  double SPval;
  void transferSP(double SendProb);

最后在SlaveApp.cc

void SlaveApp::transferSP(double SendProb){
    Enter_Method_Silent();
    SPval = SendProb;
} 

通过上述操作,编译器没有抱怨,但模拟器崩溃了。调试工具显示崩溃是由以下原因触发的:

void cOwnedObject::setDefaultOwner(cDefaultList *list)
{
   ASSERT(list != nullptr);
   defaultOwner = list;
}

随后是上下文切换操作Enter_Method_Silent()

我没有好主意来实现这个功能。如果有人能够修复我上面提到的特定错误,或者有任何其他方法可以让 MasterApp 生成的控制值(双精度值)可以被 SlaveApp 读取,那就太好了。

标签: c++omnet++

解决方案


推荐阅读