前面介绍了无线传感网络仿真框架mixim的安装以及新建工程。下面开始这个仿真工程的第一步,建立需要仿真的网络拓扑模型,也就是编写ned文件。
1.建立一个五十结点(node)组成的拓扑网络WSNRouting。
package wsntestn.simulations; import org.mixim.base.modules.BaseNetwork; import org.mixim.modules.node.Host802154_2400MHz; // // This example shows how to simulate wireless sensor networks. // Three different routing protocols are considered, for different traffic // types: // convergecast, with Wiseroute; // network-level broadcast, with flooding; // and probabilistic broadcast. // network WSNRouting extends BaseNetwork { parameters: int numHosts; // total number of hosts in the network submodules: node[numHosts]: Host802154_2400MHz { parameters: numHosts = numHosts; @display("p=129,80;b=42,42,rect,yellow;i=device/wifilaptop"); } connections allowunconnected: }对上面代码稍作解释。程序第一二行导入mixim框架中的模块,类似于java中的导包。
import org.mixim.base.modules.BaseNetwork因为我们建立的这个网络是在mixim框架中的BaseNetWork所定义的网络基础上扩展而来的。
import org.mixim.modules.node.Host802154_2400MHz;我们所定义的这50个结点(node)也不是自己完全自己编写的,是扩展自mixim中的Host802154_2400MHz结点。
network WSNRouting extends BaseNetwork我们的无线传感网络WSNRouting扩展自BaseNetwork。
parameters: int numHosts; // total number of hosts in the network添加自定义参数numHosts,也就是node结点的个数。这个参数配置在仿真配置文件omnetpp.ini中。配置文件将在后面文章中介绍。
submodules: node[numHosts]: Host802154_2400MHz { parameters: numHosts = numHosts; @display("p=129,80;b=42,42,rect,yellow;i=device/wifilaptop");网络中包含的子模块,为网络添加结点(node)。node扩展自Host802154_2400MHz结点。@display配置显示参数。
这是网络已经基本搭成。我们在IDE中通过design模式查看这个wsnrouting.ned文件:
我们发现,网络中除了我们自己定义的node以外,还有connectionManager模块和world模块。我们不难想到这两个模块一定是从mixim中的basenetwork中继承而来的。有必要对这两个模块进行了解。在mixim工程中查看相应代码。
先看connectionmanager
simple ConnectionManager like IConnectionManager { parameters: // debug switch for core framework bool coreDebug; // send directly to the node or create separate gates for every connection bool sendDirect; // maximum sending power used for this network [mW] double pMax @unit(mW); // minimum signal attenuation threshold [dBm] double sat @unit(dBm); // minimum path loss coefficient double alpha; // minimum carrier frequency of the channel [Hz] double carrierFrequency @unit(Hz); // should the maximum interference distance be displayed for each node? bool drawMaxIntfDist = default(false); @display("i=abstract/multicast"); }
simple ConnectionManager like IConnectionManager表明connectionmanager是一个simple模块。网络中的一切行为动作都是由这些simple模块背后的c++代码所定义。所以若想了解connectionmanager有哪些功能就要查看相应的c++代码,connectionmanager定义了结点之间连接相关的参数以及连接行为,下面的c++代码定义了结点(node)的无线通信距离。
{ double interfDistance; //the minimum carrier frequency for this cell double carrierFrequency = par("carrierFrequency").doubleValue(); //maximum transmission power possible double pMax = par("pMax").doubleValue(); if (pMax <=0) { error("Max transmission power is <=0!"); } //minimum signal attenuation threshold double sat = par("sat").doubleValue(); //minimum path loss coefficient double alpha = par("alpha").doubleValue(); double waveLength = (BaseWorldUtility::speedOfLight / carrierFrequency); //minimum power level to be able to physically receive a signal double minReceivePower = pow(10.0, sat / 10.0); interfDistance = pow(waveLength * waveLength * pMax / (16.0*M_PI*M_PI*minReceivePower), 1.0 / alpha); ccEV << "max interference distance:" << interfDistance << endl; return interfDistance; }