文源盛
【摘要】 在短波網(wǎng)項(xiàng)目中,仿真技術(shù)作為一種低成本,高準(zhǔn)確性的方法得到廣泛使用。通過仿真技術(shù),設(shè)計(jì)者可以在短波通信系統(tǒng)設(shè)計(jì)時(shí)就能驗(yàn)證通信流程的正確性以及模擬網(wǎng)絡(luò)建成以后的使用性能效益,為網(wǎng)絡(luò)設(shè)計(jì)提供必要的依據(jù)。在眾多的仿真技術(shù)中,半實(shí)物仿真通過部分模塊與實(shí)際網(wǎng)絡(luò)環(huán)境進(jìn)行交互,更能貼近現(xiàn)實(shí)網(wǎng)絡(luò)環(huán)境,更能反映出實(shí)際網(wǎng)絡(luò)的性能。本文主要介紹如何在短波項(xiàng)目中使用omnet仿真平臺(tái)通過網(wǎng)口與仿真程序進(jìn)行數(shù)據(jù)交互實(shí)現(xiàn)半實(shí)物仿真,并且介紹其中注意的問題。
【關(guān)鍵詞】 短波網(wǎng) 半實(shí)物仿真 omnet
一、概述
短波網(wǎng)項(xiàng)目中,仿真技術(shù)是一種低成本高準(zhǔn)確性的方法。通過仿真技術(shù),設(shè)計(jì)者可以在短波通信系統(tǒng)設(shè)計(jì)時(shí)就能驗(yàn)證通信流程的正確性以及模擬網(wǎng)絡(luò)建成以后的使用性能,為網(wǎng)絡(luò)設(shè)計(jì)提供必要的依據(jù)。
在眾多的仿真技術(shù)中,半實(shí)物仿真通過部分模塊與實(shí)際網(wǎng)絡(luò)環(huán)境進(jìn)行交互,更能貼近現(xiàn)實(shí)網(wǎng)絡(luò)環(huán)境,更能反映出實(shí)際網(wǎng)絡(luò)的性能。omnet是一個(gè)基于離散事件,組建模塊化的網(wǎng)絡(luò)仿真平臺(tái)。
由于其清晰的圖形界面,簡(jiǎn)單的消息交互機(jī)制以及提供了大量的成熟的通信仿真模塊,它已經(jīng)廣泛應(yīng)用于短波網(wǎng)項(xiàng)目中。在使用omnet進(jìn)行半實(shí)物仿真的過程中,經(jīng)常會(huì)碰到需要通過網(wǎng)口Socket與仿真程序進(jìn)行數(shù)據(jù)交互的情況,本文主要為了解決以上問題,介紹了如何使用omnet實(shí)現(xiàn)Socket接口與仿真程序交互數(shù)據(jù)。
二、實(shí)現(xiàn)原理
要說(shuō)明Socket與omnet仿真程序如何實(shí)現(xiàn)數(shù)據(jù)交換,先簡(jiǎn)要介紹omnet中消息的分發(fā)機(jī)制。
omnet仿真平臺(tái)的消息分發(fā)機(jī)制是通過一個(gè)叫cSchedule的類來(lái)實(shí)現(xiàn)。當(dāng)仿真程序初始化的時(shí),omnet仿真平臺(tái)會(huì)生成一個(gè)公有的cSchedule類實(shí)例。這實(shí)例負(fù)責(zé)把各個(gè)仿真類對(duì)象所發(fā)送的消息,按照其應(yīng)該到達(dá)的時(shí)間,按時(shí)有效的傳遞到各個(gè)實(shí)例的handleMessage函數(shù)中,以便對(duì)消息進(jìn)行處理。
oment的仿真平臺(tái)對(duì)以上過程進(jìn)行了妥善的封裝,對(duì)于使用者來(lái)說(shuō)是透明的,使用者只需關(guān)心消息到達(dá)以后如何處理,如何編寫handleMessage函數(shù)。
要實(shí)現(xiàn)Socket接口與omnet仿真程序數(shù)據(jù)交互,則需要把已有的cSchedule類實(shí)例進(jìn)行改造,使其不單單只為omnet的仿真類傳遞消息,還能接受來(lái)自網(wǎng)口Socket的數(shù)據(jù),并且以handleMessage的形式交給用戶處理。
omnet++4.0為實(shí)現(xiàn)這目標(biāo)提供了cSocketRTScheduler類。cSocketRTScheduler類使網(wǎng)口的傳輸數(shù)據(jù)與仿真程序接收到的消息的接口一致。網(wǎng)絡(luò)實(shí)際數(shù)據(jù)與程序中的虛擬數(shù)據(jù)均來(lái)源于自身模塊的omnet消息通知handlemessag函數(shù),用戶不用特意區(qū)分消息的來(lái)源,實(shí)現(xiàn)透明傳輸?shù)哪康摹?/p>
三、使用方法
既然cSocketRTScheduler類已經(jīng)幫我們完成了大部分工作,剩下的我們需要完成的工作包括:
3.1加入cSocketRTScheduler類。
拷貝SocketRTScheduler.cc和SocketRTScheduler.h文件到目標(biāo)工程目錄下。
3.2創(chuàng)建并指定cMessage實(shí)例用來(lái)表示通過Socket網(wǎng)口傳遞的消息。
調(diào)用函數(shù)new cMessage并取一個(gè)特定名字表示該消息,如名字為“rtEvent”則使用
cMessage rtEvent = new cMessage(“rtEvent”);
3.3替換omnet中的cSchedule類實(shí)例為cSocketRTScheduler類。
通過simulation類的getScheduler函數(shù)獲取當(dāng)前的cSchedule類實(shí)例,并用check_and_cast使其轉(zhuǎn)化為cSocketRTScheduler類,具體使用如下:
cScheduler*pcScheduler = simulation.getScheduler();
cSocketRTScheduler*rtScheduler=check_and_ cast
3.4使cSchedule類與消息和緩沖區(qū)建立連接。
調(diào)用cSocketRTSchedule的setInterfaceModule函數(shù)實(shí)現(xiàn)與omnet消息和緩沖區(qū)建立連接,其中setInterfaceModule函數(shù)的聲明如表1所示。
3.5配置文件中指定cSocketRTScheduler類
在配置文件指定用cSocketRTScheduler類替代cSchedule類,在omnetpp.ini中添加如下配置代碼。
scheduler-class =”cSocketRTScheduler”
3.6指定本程序監(jiān)聽網(wǎng)絡(luò)Socket端口號(hào)
最后是要指定監(jiān)聽網(wǎng)口的端口號(hào),cSocketRTSchedule類指定了一個(gè)屬性“socketrtscheduler-port”代表網(wǎng)口的端口號(hào),其默認(rèn)值為4242,可以通過配置文件omnetpp.ini中進(jìn)行配置,具體添加如下配置代碼到該文件中。
socketrtscheduler-port = 60001
四、數(shù)據(jù)收發(fā)
4.1數(shù)據(jù)接收
由于數(shù)據(jù)的接收統(tǒng)一到handleMessage函數(shù)中,數(shù)據(jù)接收與omnet仿真中的消息處理相類似。
調(diào)用handleMessage函數(shù)。
先判斷接收到的消息是否是自消息,再判斷接收到的消息是為與網(wǎng)口消息相關(guān)聯(lián)的omnet消息。
訪問接收緩沖區(qū),進(jìn)行數(shù)據(jù)處理。
4.2數(shù)據(jù)發(fā)送
數(shù)據(jù)發(fā)送只需調(diào)用cSocketRTScheduler的sendBytes即可發(fā)送消息。其函數(shù)聲明如圖2 所示。
五、注意事項(xiàng)
當(dāng)使用了cSocketRTScheduler作為cSchedule后,仿真的時(shí)序和現(xiàn)實(shí)的時(shí)序?qū)?huì)統(tǒng)一,即仿真的時(shí)間間隔和現(xiàn)實(shí)時(shí)間間隔將會(huì)相等。
仿真程序的休眠將會(huì)使得仿真程序的時(shí)間與實(shí)際時(shí)間不一致,導(dǎo)致產(chǎn)生不可預(yù)料的錯(cuò)誤,因此不推薦在進(jìn)行串口半實(shí)物仿真程序中進(jìn)行休眠。
參 考 文 獻(xiàn)
[1]操敏,李文峰,袁兵;基于OMNeT++的傳感器網(wǎng)絡(luò)仿真 中國(guó)論文科技在線 2011;
[2]石為人,黃河,鮮曉東;OMNeT++與NS2在無(wú)線傳感器網(wǎng)絡(luò)仿真中的比較研究 計(jì)算機(jī)科學(xué)2008Vol.35
[3]黃健強(qiáng),鞠建波;半實(shí)物仿真技術(shù)研究現(xiàn)狀及發(fā)展趨勢(shì) 艦船電子工程Vol.31No.75