組播技術(shù)在飛行仿真系統中的應用

發(fā)布時(shí)間:2010-3-30 20:27    發(fā)布者:baozai
關(guān)鍵詞: 組播 , 飛行仿真
0 引言

飛行仿真系統是現代航空科研、教學(xué)、試驗等不可缺少的技術(shù)設備。在飛行性能研究、飛行品質(zhì)評估和飛行訓練等方面都具有很高的經(jīng)濟價(jià)值和軍事價(jià)值。正常情況下,飛行仿真系統采用分布式計算技術(shù),整個(gè)系統由多臺計算機組成,各計算機之間的數據傳輸需要采用數據通信技術(shù)來(lái)完成。數據通信技術(shù)需要采用網(wǎng)絡(luò )協(xié)議,目前互聯(lián)網(wǎng)采用的協(xié)議是IPv4協(xié)議。

IPv4是互聯(lián)網(wǎng)協(xié)議(Internet Protocol,IP)的第四版,它定義的IP數據通信方式有單播、全網(wǎng)廣播和組播。單播是指兩個(gè)IP地址間進(jìn)行的數據通信;全網(wǎng)廣播是指在IP子網(wǎng)內向所有網(wǎng)內IP地址以廣播的方式發(fā)送數據包,所有子網(wǎng)內的IP站都能收到全網(wǎng)廣播;組播是當某一個(gè)人向一組人發(fā)送數據時(shí),他不必將數據向每一個(gè)人發(fā)送,只須將數據發(fā)送到一個(gè)特定的預約組地址,所有加入該組的人均可以收到這份數據。

為了讓網(wǎng)絡(luò )中的多個(gè)主機可以同時(shí)接受到相同的數據包,如果采用單播的方式,那么源主機必須分別發(fā)送相同的數據包。對于一臺主機來(lái)說(shuō),同時(shí)不停的發(fā)送相同的數據包來(lái)說(shuō)也是一個(gè)很大的負擔。如果采用采用廣播方式,則數據包傳送到局域網(wǎng)內每個(gè)主機上,不管這個(gè)主機是否對數據包感興趣,這樣做就會(huì )造成了帶寬的浪費和主機的資源浪費。如果采用組播的方式,源主機可以只需要發(fā)送一個(gè)數據包就可以到達每個(gè)需要接受的主機上,這中間還要取決于路由器對組員和組關(guān)系的維護和選擇。組播有一套對組員和組之間關(guān)系維護的機制,可以明確的知道在某個(gè)子網(wǎng)中,是否有主機對這類(lèi)組播數據包感興趣,如果沒(méi)有就不會(huì )把數據包進(jìn)行轉發(fā),并會(huì )通知上游路由器不要再轉發(fā)這類(lèi)數據包到下游路由器上。InternetNIC關(guān)于IP地址的規定中,IP地址共分為A-E共5類(lèi), D類(lèi)地址即為組播地址,范圍為224.0.0.0-239.255.255.255。D類(lèi)地址是動(dòng)態(tài)分配和恢復的瞬態(tài)地址。每一個(gè)組播組對應于動(dòng)態(tài)分配的一個(gè)D類(lèi)地址;當組播組結束組播時(shí),相對應的D類(lèi)地址將被回收,用于以后的組播。

根據以上所述,運用組播技術(shù),對發(fā)送者而言,數據只需發(fā)送一次就可以發(fā)送到所有接收者,所以,組播技術(shù)對于接收者來(lái)說(shuō),都是同時(shí)接收到相同的數據,這使得對計算機接收數據的同步性得到很好的控制,縮短了發(fā)送的時(shí)間周期,從而大大減輕了發(fā)送者的負擔和網(wǎng)絡(luò )的負載,節省了大量資源。

1 飛行仿真系統的組成及通信機制

一個(gè)典型的飛行仿真系統包括:飛行系統、火控系統、音響系統、運動(dòng)系統、教員臺系統、導航系統、儀表系統、操縱系統、多臺視景計算機等,如圖1所示。其中飛行系統控制整個(gè)飛行仿真系統,是整個(gè)系統的核心;儀表系統是顯示飛機坐艙內各個(gè)儀表盤(pán),通過(guò)儀表盤(pán)來(lái)顯示飛機飛行的狀態(tài);操縱系統是控制飛機飛行的姿態(tài);多臺視景計算機顯示的是飛機在同一位置時(shí)的不同角度。


圖1 飛行仿真系統的通信結構(實(shí)線(xiàn)表示網(wǎng)絡(luò ))

根據圖1所示,可以看出整個(gè)系統的數據傳輸過(guò)程。如果用單播通信方式,那么飛行系統計算機會(huì )重復發(fā)送相同的數據給多臺視景計算機,增加了發(fā)送的時(shí)間周期,這樣就會(huì )導致飛行系統計算機的工作任務(wù)的重復和網(wǎng)絡(luò )資源的浪費,并且單播在發(fā)送數據時(shí)有先有后,因此五臺視景顯示計算機不是同時(shí)收到飛行系統計算機的數據,這樣就會(huì )導致多臺視景計算機幀與幀之間不同步,這不符合實(shí)時(shí)顯示的要求。如果采用廣播通信方式,則操縱系統計算機也會(huì )收到控制計算機的數據,而事實(shí)上是操縱系統計算機用不到飛行系統計算機的信息,這樣會(huì )導致網(wǎng)絡(luò )資源的浪費。如果采用組播的通信方式,飛行仿真系統中所有的計算機同在一個(gè)組播組中,這樣飛行系統計算機發(fā)送一次數據,則有關(guān)計算機都會(huì )同時(shí)接收到相同的數據,多臺視景計算機可以實(shí)時(shí)的顯示飛機飛行的姿態(tài),不會(huì )存在幀與幀之間不同步的問(wèn)題。所以綜合以上分析,我們在實(shí)驗系統中采用組播技術(shù)來(lái)實(shí)現網(wǎng)絡(luò )通信。

2 組播技術(shù)的實(shí)現

本節是介紹在VC6.0平臺上如何用winsock實(shí)現組播通信編程的方法。

2.1 用winsock實(shí)現組播的方法

本系統采用VC6.0為開(kāi)發(fā)工具。對于網(wǎng)絡(luò )編程而言,需要用到多線(xiàn)程技術(shù)。在VC6.0開(kāi)發(fā)環(huán)境中,開(kāi)啟一個(gè)線(xiàn)程用到AfxBeginThread()函數,AfxBeginThread(RecvThread, &m_mysock);其中RecvThread()函數是線(xiàn)程函數,主要是用來(lái)接收和發(fā)送數據的;m_mysock是自己封裝的一個(gè)類(lèi)CMySocket的對象,這個(gè)類(lèi)封裝所有有關(guān)組播通信的信息,如:線(xiàn)程函數中接收的數據存入該類(lèi)的變量中。

對于Socket編程,首先要對sockaddr_in結構體進(jìn)行初始化,就是把組播地址和端口號分別賦值給sockaddr_in中的s_addr和sin_port,具體實(shí)現如下代碼:

Local.sin_addr.s_addr =inet_addr(“234.0.0.0”);
Local.sin_family = AF_INET;
Local.sin_port= htons( 2007 );

其中Local是sockaddr_in結構變量,組播地址為:234.0.0.0,端口號:2007。

然后是對套接字的初始化了,定義SOCKET的變量為sock,
sock = socket (AF_INET,SOCK_DGRAM,0);其中SOCK_DGRAM表示為采用UDP協(xié)議(SOCK_STREAM表示為T(mén)CP協(xié)議)。

初始化之后用bind()函數將套接字與IP地址和端口號綁定起來(lái),bind (sock,(sockaddr*)&( Local),sizeof(Local));

其中sock與Local定義同上。

組播技術(shù)用setsockopt()函數的套接字功能選項來(lái)進(jìn)行設置, setsockopt()函數有關(guān)組播技術(shù)的選項見(jiàn)下表:


表1  setsockopt()組播選項說(shuō)明

發(fā)送數據用到sendto()函數,用這個(gè)函數向組播地址發(fā)送數據,sendto(sock,buffer,sizeof(buffer),0,(sockaddr*)&Local,sizeof(Local));

其中buffer所存放的就是所要發(fā)送的數據。這里介紹一下buffer中存放數據的形式,buffer是一個(gè)字符數組,它的前四位放的是本機的計算機名字;5到8位存放的是命令,這個(gè)命令是指要讓接收方做什么事情;從9位以后全部都是數據,這些數據就是讓接收方利用這些數據完成各自的任務(wù)。這個(gè)主要是因為發(fā)送方發(fā)送數據到組播地址后,所有的接收方都會(huì )到網(wǎng)組播地址上取數據,對于每個(gè)接收方,有可能接收的數據對于自己是無(wú)用的,所以在發(fā)送數據時(shí),數據頭加上前面所講的1到8位的識別信息,接收方可以根據這些信息來(lái)獲取對自己有用的數據。接收數據用到recvfrom()函數,這個(gè)函數是接收網(wǎng)絡(luò )上的數據的,recvfrom(sock,recvBuff,1024,0,(sockaddr*)&clientsock,&sizeof(clientsock));recvBuff是字符數組,把接收過(guò)來(lái)的數據存放到這個(gè)數組中。然后,我們要對這個(gè)數據進(jìn)行解析,也就是前面所講的發(fā)送時(shí)所加的數據包頭的信息。接收到數據以后,先對數據包的前四位進(jìn)行判別,判別是從哪個(gè)計算機上發(fā)送來(lái)的信息。再對5到8位進(jìn)行判別,判別是什么信息,也就是什么命令。根據數據包前8位的信息,如果是本機將要用到的數據,則對數據包前8位以后的數據進(jìn)行提;否則,對接收來(lái)的數據舍棄不用。

2.2 數據傳輸的有效性

在前面講過(guò)組播的主要缺點(diǎn)是沒(méi)有糾錯機制,發(fā)生丟包錯包后難以彌補。也就是說(shuō)在數據傳輸過(guò)程中無(wú)法保證接收的數據與發(fā)送的數據一致,這樣可導致實(shí)時(shí)仿真不同步,以至多臺視景計算機不能實(shí)時(shí)觀(guān)察飛機飛行的不同的角度,為了解決這個(gè)問(wèn)題,采取兩種方案予以彌補。

2.2.1采用時(shí)間等待

時(shí)間等方法是運用select()函數。select()函數用法是如果程序要檢查套接字上在設定的時(shí)間范圍內(timeout =5ms)是否有數據到來(lái),則首先需要把套接字句柄加入可讀性監視集合中,然后調用select()函數。如果沒(méi)有數據到來(lái),則再等下一個(gè)5ms,一直等到網(wǎng)絡(luò )上有數據為止。select()函數具體實(shí)現如下代碼:  

if(select(NULL,NULL,&fds,NULL,&timeout)==-1)
exit(-1);
else if(select(NULL,NULL,&fds,NULL,&timeout)==0)
continue;
else if(FD_ISSET(sock,& fds))

但是這個(gè)方法也有一定的弊端,就是如果所有的視景計算機中某幾臺視景計算機在接收數據的過(guò)程中等待的時(shí)間長(cháng),那么所有的視景機一定不會(huì )同時(shí)獲得相同數據,這樣就會(huì )導致多臺視景計算機視景不同步。

2.2.2 發(fā)送副本方法

在發(fā)送端發(fā)送數據時(shí),同時(shí)要發(fā)送這個(gè)數據的一個(gè)或多個(gè)副本,在接收端接收數據時(shí),如果發(fā)現接收的數據不正確,則到其它副本取數據,這樣會(huì )彌補接收數據的不可靠性。

3 結束語(yǔ)

由于組播技術(shù)采用的是UDP協(xié)議,UDP協(xié)議的主要特點(diǎn)是數據傳輸速度快,所以在飛行仿真系統中數據傳輸速度問(wèn)題可以得到解決。在飛行仿真系統中,視景顯示是該系統中的重點(diǎn)。如果多臺視景機不同步顯示,則會(huì )造成觀(guān)察者無(wú)法對飛機飛行進(jìn)行有效的控制,繼而對整個(gè)系統無(wú)法控制。組播技術(shù)是只發(fā)送一次數據,同在一個(gè)組播地址內的計算機都會(huì )接收到這些數據,根據圖1中所示,飛行系統計算機向視景計算機發(fā)送數據之后,視景計算機會(huì )同時(shí)接收到相同的數據,這樣,視景計算機就會(huì )根據接收到的數據來(lái)做飛機飛行相應的動(dòng)作。所以,利用組播技術(shù),可以使視景計算機顯示同步的問(wèn)題得到解決。在飛行仿真系統中通過(guò)利用select()函數和發(fā)送副本的方式,可以使彌補數據在傳輸過(guò)程中的可靠性。利用以上的方法,在飛行仿真系統中,數據傳輸的速度、視景計算機的同步性和數據傳輸的可靠性都得到了很好的驗證。


作者:高玉寶
本文地址:http://selenalain.com/thread-10019-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页