一种基于OMNeT++的“实代码”仿真模式研究*

出处:单卫龙1, 马 奎2, 周武能1 发布于:2011-08-26 15:26:23

  随着人们对于环境问题的关注程度越来越高,需要采集的环境数据也越来越多,无线传感器网络的出现为随机性的研究数据获取提供了便利,并且还可以避免传统数据收集方式给环境带来的侵入式破坏。比如,英特尔研究实验室研究人员曾经将32个小型传感器连进互联网,以读出缅因州"大鸭岛"上的气候,用来评价一种海燕巢的条件。无线传感器网络还可以跟踪候鸟和昆虫的迁移,研究环境变化对农作物的影响,监测海洋、大气和土壤的成分等。此外,它也可以应用在精细农业中,来监测农作物中的害虫、土壤的酸碱度和施肥状况等。

  1 OMNeT++

  无线传感器网络还被应用于其他一些领域。比如一些危险的工业环境如井矿、核电厂等,工作人员可以通过它来实施安全监测。也可以用在交通领域作为车辆监控的有力工具。此外和还可以在工业自动化生产线等诸多领域,英特尔正在对工厂中的一个无线网络进行测试,该网络由40台机器上的210个传感器组成,这样组成的监控系统将可以大大改善工厂的运作条件。它可以大幅降低检查设备的成本,同时由于可以提前发现问题,因此将能够缩短停机时间,提高效率,并延长设备的使用时间。尽管无线传感器技术目前仍处于初步应用阶段,但已经展示出了非凡的应用价值,相信随着相关技术的发展和推进,一定会得到更大的应用。

  无线传感器网络由称为"微尘(mote)"的微型计算机构成。这些微型计算机通常指带有无线链路的微型独立节能型计算机。无线链路使得各个微尘可以通过自我重组形成网络,彼此通信并交换有关现实世界的信息。目前,对于传感网的研究越来越受到关注,其中网络协议算法更是其中的热点之一。

  为评价传感器网络协议算法的性能,仅通过实验是无法实现的,特别是包含大量节点的大规模无线传感器网络,更是很难通过实验来实现。为了实现无线传感器网络的仿真,研究人员设计开发了许多仿真平台(或在现有平台建立无线传感器网络模型),包括NS-2、OPNET、SensorSim、EmStar、OMNet++、GloMoSim、TOSSIM、PowerTOSSIM等。

  OMNeT++[2-3](Objective Modular Network TestBed in C++)是开源的基于组件的模块化的开放网络仿真平台,是近年来在科学和工业领域里逐渐流行的一种的网络仿真平台。OMNeT++作为离散事件仿真器,具备强大完善的图形界面接口和可嵌入式仿真内核,同NS2[4]、OPNET[5]和JavaSim等仿真平台相比,OMNeT++可运行于多个操作系统平台,可以简便定义网络拓扑结构,具备编程、调试和跟踪支持等功能。

  OMNeT++具有模块化的结构,图1是OMNeT++仿真的高层体系结构。

  2 实代码仿真

  2.1 总体思路

  对于传统的有线网络, 利用有限的具有代表性的节点拓扑就可以相当大程度地模拟整个网络的性能, 但是对于无线传感器网络, 由于其大冗余度和高密度节点拓扑构造类型而无法用有限的节点数目来分析其整体性能。

  仿真可以在算法和实现之间起到桥梁作用, 从仿真到实现不要进行二次编码, 而是平滑过渡。经过仿真测试和验证了的代码能够直接在硬件上运行, 但经常出现算法仿真通过而实际却不能实现的情况。

  本论文研究实代码仿真的主要原理就是将硬件中断换成离散仿真事件,由仿真器事件抛出的中断来驱动上层应用,也即节点实代码。

  总体思路框架图如图2所示,不同节点类型、不同数目的同一类型节点都可以在支持分布式仿真的仿真模拟器OMNET++上运行,仿真的具体思路就是将每一个节点(对应一个对象)抽象成一个线程(线程始终运行),其次将需要仿真的实代码以动态链接库的形式调入线程中,由OMNeT++底层的离散仿真事件驱动编译成DLL的代码。

  本次试验的DLL动态链接库为ucos系统上的系统软件协议栈 .其中附加运行的任务为测试程序,实际应用过程中存放的是在硬件上运行的OS的节点代码。

  2.2 动态链接库

  动态链接库简称DLL ,它是基于Windows 程序设计的一个非常重要的组成部分,可以被其他应用程序所共享的程序模块,其中封装了一些可以被共享的里程和资源。与使用普通的函数库相比,它并不是将库中的代码拷贝到可执行文件中,而是在建立应用程序的可执行文件时动态装载到动态链接库DLL[7-8] ,装载时DLL被映射到进程的地址空间中,在程序中记录函数的入口点和接口,不管多少程序使用DLL ,内存中都只有一个DLL副本,当没有程序使用时,系统将其移出内存,减少了对内存和磁盘的要求。

  本文简单地编译了一个DLL,将运行在UCOS上的Aloha协议封装成DLL,协议功能就在于实现简单的侦听功能。为了进行验证,在stack中附加输出test()函数,函数功能就是将全局变量m自增1,返回m值。

  int m=0;

  int  test()

  {

  m++;

  return m;

  }

  然后通过。def文件将OS启动入口函数test()导出如下:

  LIBRARY dlltest

  EXPORTS

  test

  这样在vc6.0++环境目录中,可以得到dlltest.dll文件,将其拷贝到omnetpp-4.0\samples\test下即可以在OMNeT++中的源文件中调用,具体调用方式为GetProcAddress()显式调用。

  2.3  节点切换:PE文件解析

  将代码以动态链接库的方式加载入内存后,每个节点将会加载该DLL,这样将会出现DLL中的全局变量等信息无限次地被每个节点所更改。其结果将是第二个节点的全局变量信息也许会成为个节点的全局变量信息。

  但是,所希望得到的结果是个节点的全局变量信息始终是个节点的,第二个节点的全局信息也始终是第二个节点的。这样,自然而然想到的就是如何保护全局变量的问题。本工程所采用的一个小技巧就是每个节点产生一个数组,来保存节点信息。在这里要重点区别于多进程共享全局变量问题,本文涉及到的内容主要为线程间共享数据。

  DLL为PE文件结构如图3所示

  PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。

  PE 文件格式在 winnt.h 头文件中文档化了(用不的语言)!大约在 winnt.h 的中间部分标题为"Image Format"的一个快。在把 MS-DOS 的 MZ 文件头和 NE 文件头移入新的PE文件头之前,这个块就开始于一个小栏。WINNT.H提供PE文件用到的生鲜数据结构的定义,但只有很少有助于理解这些数据结构和标志变量的注释。不管谁为PE文件格式写出这样的头文件都肯定是一个信徒无疑(突然持续地冒出Michael J. O'Leary的名字来)。它衍生于早期建立在VAX/VMS上的COFF(Common Object File Format)文件格式。对PE格式和COFF文件的主要描述存放在winnt.h文件中,它是PE文件定义的终决定者。

  文件偏移地址是指当PE文件存贮在磁盘上时,某个数据的位置相对于头文件的偏移量,称为文件偏移地址(File Offset)或物理地址(RAW Offset)。文件偏移地址从PE文件的个字节开始计数,起始值为0.

  相对虚拟地址(RVA)只是内存中的一个简单的相对于PE文件装入地址的偏移位置,它是一个"相对"地址,或称"偏移量".图2显示了PE文件在装入前后的相对位置变化。虚拟地址(VA)=基地址(ImageBase)+ 相对虚拟地址(RVA)。

  本文所编动态链接库(DLL)函数中的全局变量是储存在。data段中的。这样就牵扯到每个节点运行后,要将其。data段的信息保存在数组中,在下次这个节点运行时再将其拷贝回。data段中,保证加载在内存中的DLL不被其他的节点所更改。

  其中重要部分是找到动态链接库在内存中的位置地址,然后根据PE文件结构来解析data段的位置,以及其data段的大小。

  伪代码如下:

  const char *szSecName=".data";

  hInst=LoadLibrary();

  ……

  IMAGE_DOS_HEADER *pDosHead;

  IMAGE_FILE_HEADER *pPEHead;

  IMAGE_SECTION_HEADER *pSection;

  ……

  strncmp(szSecName, (const char*)pSection[i].Name, IMAGE_SIZEOF_SHORT_NAME);

  ……

  在每个节点的node::initialize()中,为每个节点建立一个线程,而此线程就是将文中提到的"实代码"以显式链接的方式加载到其中。需要注意的是,这个线程是一直运行的,线程间以信号量的形式进行通信。也即在主线程中设置信号量为:

  ……

  SetEvent(eventM);

  ……

  WaitForSingleObject(eventT, INFINITE);

  ……

  当然,在各个线程中:

  ……

  WaitForSingleObject(eventM, INFINITE);

  ……

  SetEvent(eventT);

  ……

  通过这种方式来进行线程间的交互,达到主线程(Omnet++)模拟的硬件中断驱动上层的目的。其中多个线程中的主线程用来仿真所有节点应用的运行,而分线程主要用来向外部动态链接库程序提供服务和接受外部程序发送过来的命令。

  实际消息处理过程中数组中,将保存的信息段数据复制到PE文件中的全局数据段地址就是在SetEvent(eventM)消息处理之前进行的,而WaitForSingleObject(eventT, INFINITE)之后再将运行完成后的数据段拷贝回数组中。

  2.4 OMNeT++配置

  (1) Ned文件的编写

  NED语言用来刻画定义模型的拓扑结构,方便对一个网络的模型化描述,这意味着一个网络的描述可以包括一组元件的描述(通道,简单/复杂模型),这些组件的描述可以在其他网络描述中得以重用。包含网络描述的文件带有。Ned的后缀,.Ned文件动态地载入到模拟程序,或者用Ned编译器或C++代码链接到模拟器执行。

  本次试验中设定了两种不同类型的节点:普通节点和汇聚节点。每种类型的节点为一个简单模块。而普通节点的数目作为一个可变参数由输入者自己确定。

  模块声明只定义了模块类型,要确实地获得一个仿真器能运行的模块,需要书写网络定义。网络定义将前面定义的模块类型声明为一个仿真模块实例,尽管可以将一个模块作为自包含的简单模块并实例为一个网络,但应用中更希望使用复合模块类型。在NED文件中可以有几个网络定义仿真程序,使用NED文件可运行其中任何一个,可以在配置文件时选择想使用的那个,本次试验的网络定义语法如下:

  network net

  {

  parameters:

  @display("bgi=background/terrain");

  int numNodes;

  submodules:

  node[numNodes]: node {

  parameters:

  @display("i=,cyan");

  }

  s_node: s_node {

  parameters:

  @display("i=,gold");

  }

  其中用图形化编辑如图4所示。

  (2) node.cc文件编写

  正如前文所述,每个节点抽象为一个线程,node::initialize()中,为每个节点建立一个线程,该线程是一直运行的。同时,对于PE文件结构的解析也在此函数中完成。node::handlemessage()中,模拟中断的产生,通过自发信息延迟一定时间来实现模拟定时中断,然后置信号量来实现。

  s_node.cc文件的编写类似node.cc文件。

  (3) 信道配置

  离散事件系统是指一个系统的状态改变是离散的,在两个连续事件之间没有任何事件发生。简单地说,事件规定了系统状态的改变,状态的修改仅在事件发生时进行。离散事件系统可以使用离散事件模拟仿真。部分事件包括包传输的开始、包传输的结束、重传等待时间到达。

  3 结果讨论

  按照上述基本步骤的编写结果布局如下,普通节点数目设置为20.

  分析以上结果可以看到:图5所示为初始布局,配置文件中设置的普通节点数目为20,汇聚节点数目为1.图6清晰地显示了动态链接库在进程中的内存加载位置,并且由其PE文件结构可以得知其各个段的分布情况:起始位置、长度等。data数据段的地址以及长度就可以顺利得到。当不采用数组时每个节点是顺序增加的,如图7所示。即达到本文试验研究的初步预期结果:将实代码以DLL形式加载到进程后,多节点抽象出的多线程将会共享DLL,表示节点状态的全局变量将会被不同节点修改,此工程设计的PE文件数据段的拷贝很好地解决了这个问题。

  基于OMNeT++的"实代码"仿真具有很强的可伸缩性。对于无线传感器网络, 由于其大冗余度、 高密度节点拓扑构造类型, 所以无法用少量的节点数目来分析其整体性能。因此在仿真规模上必须考虑大量节点的并行运算,WSN 节点有可能成千上万甚至更多;同时仿真应能够在算法和实现之间起到桥梁作用, 从仿真到实现不要进行二次编码, 而是平滑过渡。仿真时测试和验证了的代码能够直接在硬件上运行, 因为经常出现算法仿真通过而实际却不能实现的情况。

  本项目的主要贡献就在于提出了一种全新的验证协议代码的方案。它实现了在OMNeT++这款离散仿真软件的基础上,对运行在UCOS上的协议栈代码直接仿真调试,将其封装成为动态链接库的形式在OMNeT++上调试运行,协议栈等代码无需二次修改,运行后的代码可以直接在节点上运行。具体思路已经如上验证通过,并且已经将Aloha简单的协议运行在芯片上,更深入的研究正在进行中。


  

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:
技术客服:

0571-85317607

网站技术支持

13606545031

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!