文源盛
【摘要】 在短波网项目中,仿真技术作为一种低成本,高准确性的方法得到广泛使用。通过仿真技术,设计者可以在短波通信系统设计时就能验证通信流程的正确性以及模拟网络建成以后的使用性能效益,为网络设计提供必要的依据。在众多的仿真技术中,半实物仿真通过部分模块与实际网络环境进行交互,更能贴近现实网络环境,更能反映出实际网络的性能。本文主要介绍如何在短波项目中使用omnet仿真平台通过网口与仿真程序进行数据交互实现半实物仿真,并且介绍其中注意的问题。
【关键词】 短波网 半实物仿真 omnet
一、概述
短波网项目中,仿真技术是一种低成本高准确性的方法。通过仿真技术,设计者可以在短波通信系统设计时就能验证通信流程的正确性以及模拟网络建成以后的使用性能,为网络设计提供必要的依据。
在众多的仿真技术中,半实物仿真通过部分模块与实际网络环境进行交互,更能贴近现实网络环境,更能反映出实际网络的性能。omnet是一个基于离散事件,组建模块化的网络仿真平台。
由于其清晰的图形界面,简单的消息交互机制以及提供了大量的成熟的通信仿真模块,它已经广泛应用于短波网项目中。在使用omnet进行半实物仿真的过程中,经常会碰到需要通过网口Socket与仿真程序进行数据交互的情况,本文主要为了解决以上问题,介绍了如何使用omnet实现Socket接口与仿真程序交互数据。
二、实现原理
要说明Socket与omnet仿真程序如何实现数据交换,先简要介绍omnet中消息的分发机制。
omnet仿真平台的消息分发机制是通过一个叫cSchedule的类来实现。当仿真程序初始化的时,omnet仿真平台会生成一个公有的cSchedule类实例。这实例负责把各个仿真类对象所发送的消息,按照其应该到达的时间,按时有效的传递到各个实例的handleMessage函数中,以便对消息进行处理。
oment的仿真平台对以上过程进行了妥善的封装,对于使用者来说是透明的,使用者只需关心消息到达以后如何处理,如何编写handleMessage函数。
要实现Socket接口与omnet仿真程序数据交互,则需要把已有的cSchedule类实例进行改造,使其不单单只为omnet的仿真类传递消息,还能接受来自网口Socket的数据,并且以handleMessage的形式交给用户处理。
omnet++4.0为实现这目标提供了cSocketRTScheduler类。cSocketRTScheduler类使网口的传输数据与仿真程序接收到的消息的接口一致。网络实际数据与程序中的虚拟数据均来源于自身模块的omnet消息通知handlemessag函数,用户不用特意区分消息的来源,实现透明传输的目的。
三、使用方法
既然cSocketRTScheduler类已经帮我们完成了大部分工作,剩下的我们需要完成的工作包括:
3.1加入cSocketRTScheduler类。
拷贝SocketRTScheduler.cc和SocketRTScheduler.h文件到目标工程目录下。
3.2创建并指定cMessage实例用来表示通过Socket网口传递的消息。
调用函数new cMessage并取一个特定名字表示该消息,如名字为“rtEvent”则使用
cMessage rtEvent = new cMessage(“rtEvent”);
3.3替换omnet中的cSchedule类实例为cSocketRTScheduler类。
通过simulation类的getScheduler函数获取当前的cSchedule类实例,并用check_and_cast使其转化为cSocketRTScheduler类,具体使用如下:
cScheduler*pcScheduler = simulation.getScheduler();
cSocketRTScheduler*rtScheduler=check_and_ cast
3.4使cSchedule类与消息和缓冲区建立连接。
调用cSocketRTSchedule的setInterfaceModule函数实现与omnet消息和缓冲区建立连接,其中setInterfaceModule函数的声明如表1所示。
3.5配置文件中指定cSocketRTScheduler类
在配置文件指定用cSocketRTScheduler类替代cSchedule类,在omnetpp.ini中添加如下配置代码。
scheduler-class =”cSocketRTScheduler”
3.6指定本程序监听网络Socket端口号
最后是要指定监听网口的端口号,cSocketRTSchedule类指定了一个属性“socketrtscheduler-port”代表网口的端口号,其默认值为4242,可以通过配置文件omnetpp.ini中进行配置,具体添加如下配置代码到该文件中。
socketrtscheduler-port = 60001
四、数据收发
4.1数据接收
由于数据的接收统一到handleMessage函数中,数据接收与omnet仿真中的消息处理相类似。
调用handleMessage函数。
先判断接收到的消息是否是自消息,再判断接收到的消息是为与网口消息相关联的omnet消息。
访问接收缓冲区,进行数据处理。
4.2数据发送
数据发送只需调用cSocketRTScheduler的sendBytes即可发送消息。其函数声明如图2 所示。
五、注意事项
当使用了cSocketRTScheduler作为cSchedule后,仿真的时序和现实的时序将会统一,即仿真的时间间隔和现实时间间隔将会相等。
仿真程序的休眠将会使得仿真程序的时间与实际时间不一致,导致产生不可预料的错误,因此不推荐在进行串口半实物仿真程序中进行休眠。
参 考 文 献
[1]操敏,李文峰,袁兵;基于OMNeT++的传感器网络仿真 中国论文科技在线 2011;
[2]石为人,黄河,鲜晓东;OMNeT++与NS2在无线传感器网络仿真中的比较研究 计算机科学2008Vol.35
[3]黄健强,鞠建波;半实物仿真技术研究现状及发展趋势 舰船电子工程Vol.31No.75